一、Ceph是什么
Ceph是一个底层基于RADOS对象存储系统,在它之上实现对象、文件和块存储的语义,让客户端可以通过调用文件、对象和块存储相关函数库的方式实现对访问底层存储集群的一套存储解决方案,同时客户端也可以使用librados库定制自己的存储应用。

二、什么是RADOS
RADOS是A Reliable, autonomous, distributed object storage意思,主要包括OSD和Monitor两种守护进程,Monitor主要保存整个集群系统的映射信息,OSD负责维护自己和伙伴的状态信息并向Monitor上报,如果需要支持文件存储服务,则需要MDS守护进程,它主要负责存放文件系统元数据。

三、Ceph基于RADOS实现了什么
除了RADOS本身具有的OSD和Monitor两个组件外,Ceph实现了MDS组件和Gateway组件,从而让客户端通过文件和对象的语义访问底层存储系统成为可能。
四、Ceph是如何实现文件、对象和块存储统一
用户可以通过librbd以块设备存储的方式、通过libcephfs以文件存储的方式、通过librgw以对象存储的方式访问Ceph存储系统。

五、Ceph是如何存储数据的
确切的说,RADOS是如何存储数据的,不管是用户通过Ceph对象存储、Ceph文件系统和Ceph块,还是客户端基于librados实现自定义的方式存储数据,底层RADOS都是以对象的形式存储数据的。每一个对象作为一个文件,存储在作为对象存储设备的磁盘中。每个对象的内容主要包括三部分,标识符、二进制数据和元数据,元数据就是一些key/value的键值对,具体内容依赖于客户端以哪种语义存储数据,以Ceph文件系统为例,它用元数据存储文件属性,如文件的owner、创建时间、修改时间等。


六、Ceph是如何实现可扩展和高可靠的
在传统的存储系统架构中,客户端需要访问数据,首先必须访问单个组件才能了解整个存储系统的信息,比如HDFS的NameNode,这就带来了一些问题,如果单个组件故障了就会导致整个系统不可用(当然NameNode实现了备份节点),当系统存储的数据量非常大的时候会有性能瓶颈等等。
Ceph不需要这个单个组件,而是让客户端直接访问OSD,同时OSD会创建多个数据副本确保数据的安全和高可用,与此同时Ceph也会使用Monitor集群来保证高可用,那么客户端是如何知道从哪个OSD访问数据呢?答案是CRUSH算法和集群拓扑信息。
通过CRUSH算法和集群拓扑信息,客户端知道可以从哪个OSD访问数据,同时OSD也知道将数据副本备份到哪些节点保证数据的安全和高可用。
七、集群拓扑信息具体由哪些构成
上面那提到,客户端直接访问OSD是通过CRUSH算法和系统映射信息,那集群拓扑信息包括哪些内容呢?它主要包括五个映射视图。
1、Monitor Map:包含集群的fsid,每个Monitor的地址和端口
2、OSD Map:包含集群的fsid,pool的列表,副本的个数,PG的个数,所有OSD的信息(ID,状态等)
3、PG Map:包含PG的版本,所有PG的信息(ID,up set,acting set,状态,利用率等)
4、CRUSH Map:包含存储设备,故障域层次结构(设备、主机、机柜等)
5、MDS Map:包含存储元数据的pool信息,元数据服务器等
八、如何保证系统高可用
Ceph客户端第一次读写数据时,需要从Monitor获取最新的集群拓扑信息,为了保证系统的高可用,Ceph通过构建Monitor集群避免单点故障,同时使用Paxos算法保证Monitor集群节点间数据一致性。
九、Ceph的强一致性

十、Ceph数据是如何存储的
Ceph客户端通过从Monitor获取集群拓扑信息,然后将对象存储pool中。pool的大小、副本数、CRUSH的ruleset以及PG的个数都决定了数据的存储。
1、Pool:存储对象的逻辑分区, 包括许多PG

2、PG:存储对象的逻辑单元,解耦对象和OSD之间的对应关系,从而保证底下的OSD能够灵活的伸缩

3、文件的访问举例
通过文件的inode和对象的编号获得对象的id,然后通过一个简单的hash算法得到对象映射的pgid,最后通过CRUSH算法+集群拓扑信息计算对象存储的osds,获取第一个主osd存储数据,主osd负责副本的备份。
(Pool, Object) → (Pool, PG) → OSD set → Disk





