Ceph简介 : Ceph是一个统一的分布式存储系统,具有较好的性能、高可用性和可扩展性。
一个定义看上去会让初学者优点 “懵” ,为了有一个更深入 更直观的理解,下来我们分句来解读。
即支持传统的块、文件存储协议,例如SAN和NAS;也支持对象存储协议,例如Swift.
分布式存储:可以通过网络将数据分散在多台独立的设备上.
1.摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。
2.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架
感知等。
3.能够支持上千个存储节点的规模,支持TB到PB级的数据。 (1TB=1024GB,约等于一个固态硬盘的容量大小,能够存放一个不间断的监控摄像头录像(200MB/个),长达半年左右。 1PB=1024TB,容量十分嚣张,就很大。应用于大数据存储设备,如服务器等。 1EB =1024PB ,目前还没有单个存储器达到这个容量。)
1.副本数可以灵活控制。
2.支持故障域分隔,数据强一致性。
3.多种故障场景自动进行修复自愈。
4.没有单点故障,自动管理。
1.去中心化。
2.扩展灵活。
3.随着节点增加而线性增长。
通过这样的解读,是不是对Ceph 有了一个更加细致的了解,接下来我们来看看Ceph的架构。
Ceph 的核心存储系统为Raods,LibRados对底层Rados进行抽象与封装,对上层提供接口。
RGW:对象存储,其最基本的功能包括用户,存储桶,对象的增删改查,在此基础之上结合对象存储应用的特征,引申出更多的功能,比如在对象存储应用中,如果对一个存储桶或者对象没有任何访问的限制,该储存桶或对象就会变成公开的资源,任何人都可以访问。因此对存储桶和对象的访问控制变得尤为重要,存储桶和对象的访问功能成为了对象存储的基本功能之一。
RBD:就是Ceph里的块设备,一个4T的块设备的功能和一个4T的SATA类似,挂载的RBD就可以当磁盘用。
CpehFS:是一个支持POSIX接口的文件系统,它使用 Ceph 存储集群来存储数据。文件系统对于客户端来说可以方便的挂载到本地使用。Ceph FS构建在RADOS之上,继承RADOS的容错性和扩展性,支持冗余副本和数据高可靠性。
OSD:
用于集群中所有数据与对象的存储. 处理集群数据的复制、恢复、回填、再均衡. 并向其他osd守护进程发送心跳,然后向Mon提供一些监控信息. 在一个ceph集群里最少要两个Osd节点。
MDS(可选):
只有用cephfs时,也就是文件系统存储时,才需要配置MDS节点. 为ceph文件系统存储提供元数据计算、缓存与同步(也就是说,ceph块设备 和 ceph 对象存储不适用MDS),在ceph中,元数据也是存储在osd节点中的,mds类似于元数据的代理缓存服务器。
Monitor:监控整个集群的状态,维护集群的cluster MAP二进制表,保证集群数据的一致性。
这部分是对Ceph 核心组件的一个简单介绍,下来我们来看看Ceph的IO流程。
正常IO流程:
1.client 创建 cluster handler
2.clint 读取配置文件
3.client 连接上 monitor , 获取map 信息
4.client 读写 io 根据crush 算法请求对应的主osd 数据节点.
5. 主osd数据节点同时写入另外两个副本节点数据
6. 等待主节点以及另外两个副本节点写完数据状态
7. 主节点及副本节点写入状态都成功后,返回给client,io写入完成
新加入的OSD 取代了原有的OSD,由于新OSD 上为还未创建WG,不存在数据,那么PG 上的 I/O 无法进行.
1.client 连接 monitor 获取集群map 信息 .
2.同时 新主 osd1 由于没有pg数据会主动上报 monitor 告知让 osd2 临时接替为主.
3.临时主 osd2会把数据全量同步给新主osd1.
4.client IO 读写直接连接临时主osd2进行读写.
5.osd2 收到读写io,同时写入另外两个副本节点.
6.等待osd2以及另外两个副本写入成功.
7.osd2 三份数据都写入成功返回给client , 此时client io 读写完毕.
8.如果osd1 数据同步完毕,临时主osd2会主动交出角色.
9.osd 1 成为主节点 ,osd2 变成副本.
下面我们再来看看Ceph的IO算法流程。
总体的IO算法流程,可以分为三个映射:
三个映射:
1.File用户需要读写的文件。 File → Object映射:
(1) ino(File的元数据,File的唯一id)。
(2) ono(File切分产生的某个Object的序号,默认4M切分一个块大小)。
(3) oid(Object id: ino + ono)
2.Object是RAODS需要的对象。 Object → PG映射:
Ceph指定一个静态hash函数计算oid的值,将oid映射成一个近似均匀分布的伪随机值,然后和mask按位相于,得到pgid。
hash(oid) & mask → pgid
mask = PG总数m(m为2的整数幂) -1
一个PG负责组织若干个Object,而一个Object只能被映射到一个PG中 ———— 一对多映射。
3.PG(Placement Group),OSD(对象存储守护程序). PG → OSD映射:
PG是一个逻辑概念,用途是对Object的存储进行组织和位置映射,一个PG里面会有很多个Object。采用CRUSH算法,将pgid代入其中,然后得到一组OSD。
CRUSH(pgid) → (osd1,osd2,osd3)
一个PG会被映射到多个OSD上,而每个OSD都会承载大量的PG ———— 多对多映射。
接下来抛出两个问题,带着问题来看,会使对流程的学习更深入更细致。
为什么切片:
为了数据的均匀分布和负载均衡。
为什么在PG → OSD 映射上不采用hash算法而是CRUSH算法?
CRUSH(pgid) → OSD
改为 HASH(pgid) % m(osd数量) → OSD ?
弊端: 1.如果挂掉一个OSD ,模运算的余数都会发生变化,也就是说PG映射的磁盘发生了变化,更直白的说就是,PG上的数据要从一个磁盘全部迁移到另一个磁盘上去,优秀的架构应该在磁盘损坏时使数据迁移量降到最低,CRUSH可以做到。同样的如果扩容,OSD的数量增加了,也会导致PG 在OSD之前的胡乱迁移,但是CRUSH可以保证数据向新增加的机器均匀扩散。
2.如果要保存多个副本,希望的结果是得到多个OSD的输出,但是HASH只能获得一个,但是CRUSH可以获得多个。
1.因为hash算法是一对一映射关系。
2.PG → OSD 的映射是动态的多对多映射关系。
因为一个PG会被映射到多个OSD上,而每个OSD都会承载大量的PG,而且由于cehp的高可用性 OSD节点是有副本机制的 , OSD数量可能增加也可能减少,所以是动态的多对多映射关系,所以hash不适用。
最后了解一个Ceph的精华--------CRUSH算法。
CRUSH算法(Controlled Scalable Decentralized Placement of Replicated Data):可控的、可扩展的、分布式的副本数据放置算法。
简单总结CRUSH算法: 跟据数据唯一标识符pgid、OSD权重以及数据备份策略,完成从多个PG到多个OSD的多对多的数据存储位置定位。
为什么不细致的讲解CRUSH算法?
答:我也不是很懂。