保存图片,音视频这类大文件,一般都是放在对象存储的,对象存储不仅有很好的大文件读写性能,可以水平一样的无限扩容,并具有服务高可用

对象存储之所以这么全能,是因为对象存储是一个原生的分布式存储系统,这个原生相较于MySQL和Redis而言的

随着云计算的普及,很多新生代的存储系统都是原生的分布式存储,设计的目的之一就是分布式存储集群,比如ES Ceph等新一代数据库

这样,具有近乎无限的存储容量

超高的读写性能

高可用数据

服务高可用

具体的实现细节如下

对象存储本质上提供的是一个近乎无限容量的大文件KV存储,内部包含了很多存储节点,保存我呢间

管理文件和数据节点之间映射关系的数据,叫做元数据Metadata

元数据存储的数据比较起来比较少,并发要求也不高,一般ZK或者ETCD就可以满足要求

集群为了向外提供访问服务,还需要一个网关集群,对外接收外部请求,对内访问元数据和数据节点,网关集群中的每个节点不需要保存任何数据,只是为了协调工作

图片

读和写都是先请求网关,然后网关拿着请求的Key,去元数据集群查找这个Key在哪个数据节点上,然后访问对应的数据节点读写数据,将结果返回给客户端

那么,里面的对象是如何保存的?

对象存储中保存的都是大文件,每一个大文件都会被拆为多个大小相等的块Block()

这个快的拆分只是简单的拆分为固定的大小文件

这样在读写的时候都可以进行并行处理了

文件分为大小相等的块,方便管理

对象拆分为块,还是比较碎片化,如果直接管理这些矿,会导致元数据的数据量很大,所以块被放在了容器中,元数据管理容器,这个容器,在不同的分布式存储中名称不同,ceph中叫做Data Placement,块数往往是固定的

容器的概念,适合于我们讲的MySQL和Redis的分片概念,每个容器都会有N个副本,副本的数据都是一样的,还是有主有从

对象存储就是直接复制数据块了,减少数据传输,避免结构复杂

上面的块 对象 容器,都是逻辑层面上的概念,数据真正还是由服务器嗓的数据节点保存在磁盘中的

图片

那么根据上图,一个数据访问的流程,就是先去请求一个Key,网关去元数据中查找这个Key的元数据,然后根据元数据中记录的对象,确定分块,最后取出所有的分块

这个分块的算法,和分片算法基本一致,可以哈希分块,可以利用查表法

总结一下:

对象存储是最简单的分布式存储系统,一般由 数据节点集群 元数据集群 网关集群(客户端)构成

数据节点负责保存对象数据,元数据集群保存元数据,网关暴露API,提供读写数据

为了便于维护,大的对象拆为固定大小的块,分散在集群的不同数据节点上

发表评论

邮箱地址不会被公开。 必填项已用*标注