Ceph 【超详细】Ceph到底是什么?本文为你解答,看完就懂 - 知乎 (zhihu.com)
1.基本组件
- OSD
用于集群中所有数据与对象的存储。处理集群数据的复制、恢复、回填、再均衡。并向其他osd守护进程发送心跳,然后向Mon提供一些监控信息。
当Ceph存储集群设定的数据有两个副本时(一共存两份),则至少需要两个OSD守护进程,即两个OSD节点,集群才能到达active+clean状态。
- MDS(可选)
为Ceph文件系统提供元数据计算、缓存与同步。在Ceph中,元数据也是存储在osd节点中的,mds类似于元数据的代理缓存服务器。MDS进程并不是必须的进程,只有需要使用CephFS时,才需要配置MDS节点。
- Monitor
监控整个集群的状态,维护集群的cluster MAP二进制表,保证集群数据的一致性。ClusterMAP描述了对象块存储的物理位置,以及一个将设备聚合到物理位置的桶列表。
2.存储
首先Ceph会将一个文件A分为大小默认为4M的object(且有一个唯一编号文件名+序号),通过hash(object id) & mask(通常为osd的数量减一)得到PG id,最后通过CRUSH(PG id) --> (osd1,osd2,osd3) 将该PG存储到这三个osd中,其中一个为primary,剩下两个为副本。
3.故障处理
不同OSD之间会进行通信(通常是同一个PG的主副之间通信),当发现某个OSD下线或者故障后,会将错误信息报告给Monitor,Mon更新Cluster Map但不会立即重新分配一个副本,而是等待一段时间后重启该副本(可能网络延迟导致心跳延迟了)。
同时OSD与Mon之间也会互相通信,当OSD发现由故障信息以及周期性的发送心跳给Mon。
4.Ceph IO
正常IO
- Client 创建Cluster handler
- Client 读取配置文件
- Client 连接上Monitor,获取集群map信息
- Client 读写IO 根据Crushmap算法请求对应的主OSD数据节点
- 主OSD数据节点同时写入另外两个副本节点数据
- 等待主节点以及另外两个副本节点写完数据状态
- 主节点及副本节点写入状态都成功后,返回给Client,IO写入完成
新主IO
如果新加入的OSD1取代了原有的OSD4成为Primary OSD,由于OSD1上未创建PG,不存在数据,那么PG上的IO无法进行,怎样工作呢?
- Client 连接Monitor获取集群Map信息
- 同时新主OSD1由于没有PG,数据会主动上报Monitor告知让OSD2临时接替为主
- 临时主OSD2会把数据全量同步给新主OSD1
- Client IO读写直接连接临时主OSD2进行读写
- OSD2收到读写IO,同时写入另外两个副本节点
- 等待OSD2以及另外两副本写入成功
- OSD2三分数据都写入成功返回给Client,此时Client IO读写完毕
- 如果OSD1数据同步完毕,临时主OSD2会交出主角色
- OSD1成为主节点,OSD2变成副本
RBD IO
- 客户端创建一个Pool,需要为这个Pool指定PG的数量
- 创建pool/image RBD设备进行挂载
- 用户写入的数据进行切块,每个块的大小默认为4M,并且每个块都有一个名字,即Object+序号
- 将每个Object通过PG进行副本位置的分配
- PG根据CRUSH算法会寻找3个OSD,把这个Object分别保存在这三个OSD上
- OSD上实际是把底层的Disk进行了格式化操作,一般部署工具会将它格式化为xfs文件系统
- Object的存储就变成了存储一个名为rbd0.object1.file的文件