分布式存储系统之Ceph集群存储池、PG 与 CRUSH

前文我们了解了ceph集群状态获取常用命令以及通过ceph daemon、ceph tell动态配置ceph组件、ceph.conf配置文件相关格式的说明等,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16727820.html;今天我们来聊一聊ceph的存储池、PG以及CRUSH相关话题;
一、关于存储池
我们知道ceph客户端存储对象数据到RADOS集群上,不是客户端直接存储到osd上;首先客户端会根据ceph集群的配置 , 将客户端存储的对象数据切分多个固定大小的对象数据,然后再将这些固定大小的数据对象通过一致性hash算法将对象数据映射至存储池里的PG,然后由CRUSH算法计算以后 , 再将PG映射至对应osd , 然后由mon返回osd的ID给客户端,客户端拿着mon给的osd相关信息主动联系对应osd所在节点osd进程,进行数据存储操作;
什么是存储池呢?在ceph上,所谓存储池是ceph以“存储池(pool)”的方式,将RADOS存储集群提供的存储服务逻辑分割一个或多个存储区域;我们可以理解为数据对象的名称空间;实践中,管理员可以为特定应用程序存储不同类型数据的需求分别创建专用的存储池,例如rbd存储池、rgw存储池等,也可以为某个项目或某个用户创建专有的存储池;当然,如果我们在一个存储池里存储的数据过多,为了方便管理,存储池还可以进一步细分为一至多个名称空间(namespace);客户端(包括rbd和rgw等)存取数据时,需要事先指定存储池名称、用户名和密钥等信息完成认证,而后将一直维持与其指定的存储池的连接,于是也可以把存储池看作是客户端的IO接口;
Ceph存储池类型
在ceph上,存储池有两种类型;默认情况下 , 我们不指定什么类型的存储池就是副本池(replicated pool);所谓副本池就是存储在该存储之上的对象数据 , 都会由RADOS集群将每个对象数据在集群中存储为多个副本,其中存储于主OSD的为主副本,副本数量在创建存储池时 由管理员指定;默认情况下不指定副本数量,对应副本数量为3个,即1主2从;从上面的描述可以看到,当我们存储一份对象数据时,为了冗余备份,我们需要将数据存储3分,即有两份冗余;这也意味着,我们磁盘利用率也只有1/3;于是,为了提高磁盘的利用率的同时,又能保证冗余,ceph还支持纠删码池(erasure code);纠删码池就是把个对象存储为 N=K+M 个块,其中 , K为数据块数量 , M为编码块数量 , 因此存储池的尺寸为 K+M ;纠删码是一种前向纠错(FEC)代码通过将K块的数据转换为N块 , 假设N=K+M , 则其中的M代表纠删码算法添加的额外或冗余的块数量以提供冗余机制(即编码块) , 而N则表示在纠删码编码之后要创建的块的总数 , 其可以故障的总块数为M(即N-K)个;类似RAID5;纠删码池减少了确保数据持久性所需的磁盘空间量 , 但计算量上却比副本存储池要更贵一些;但我们在使用纠删码池的时候需要注意不是所有的应用都支持纠删码池 , 比如,RGW可以使用纠删码存储池,但RBD就不支持纠删码池,它只支持副本池;
副本池IO

分布式存储系统之Ceph集群存储池、PG 与 CRUSH

文章插图
提示:在ceph上,副本池会将一个数据对象存储为多个副本;为此,在写入操作时,ceph客户端使用crush算法来计算对象的PG ID和Primary OSD,然后客户端将数据写入主OSD,主OSD根据设定的副本数、对象的名称、存储池名称和集群运行图(Cluster Map)计算出PG的各辅助OSD,而后由主OSD将数据同步给这些辅助OSD,只有在其他辅助osd和主osd都将对应数据存储好以后,主osd收到对应辅助osd的确认以后 , 才会给客户端确认;
纠删码池IO
分布式存储系统之Ceph集群存储池、PG 与 CRUSH

文章插图
提示:如上图所示客户端把包含数据“ABCDEFGHI”的对象NYAN保存到存储池中时 , 假设纠删码算法会将内容分割为三个数据块:第一个包含ABC,第二个为DEF,最后一个为GHI,并为这三个数据块额外创建两个编码块:第四个YXY和第五个QGC;在有着两个编码块配置的存储池中,它容许至多两个OSD不可用而不影响数据的可用性 。假设,在某个时刻OSD 1和OSD 3因故无法正常响应客户端请求,这意味着客户端仅能读取到ABC、DEF和QGC , 此时纠删编码算法会通过计算重那家出GHI和YXY;
二、关于PG
分布式存储系统之Ceph集群存储池、PG 与 CRUSH

文章插图
提示:PG是用于跨OSD将数据存储在某个存储池中的内部数据结构;相对于存储池来说,PG是一个虚拟组件,它是对象映射到OSD时使用的虚拟层;出于规模伸缩及性能方面的考虑,Ceph将存储池细分为归置组,把每个单独的对象映射到归置组,并将归置组分配给一个主OSD;存储池由一系列的归置组组成,而CRUSH算法则根据集群运行图和集群状态,将各PG均匀、伪随机地分布到集群中的OSD之上;所谓伪随机是指,在osd都健康数量没有变化的情况下 , 同一PG始终映射相同的OSD;若某OSD失败或需要对集群进行重新平衡,Ceph则移动或复制整个归置组而无需单独寻址每个对象;归置组在OSD守护进程和Ceph客户端之间生成了一个中间层,CRUSH算法负责将每个对象动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个OSD守护进程,从而能够支持在新的OSD设备上线时动态进行数据重新平衡;

推荐阅读