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


8、Recovering:添加一个新的OSD至存储集群中或某OSD宕掉时,PG则有可能会被CRUSH重新映射进而将持有与此不同的OSD集,而这些处于内部数据同步过程中的PG则被标记为recovering状态;
9、Backfilling:新OSD加入存储集群后 , Ceph则会进入数据重新均衡的状态,即一些数据对象会在进程后台从现有OSD移到新的OSD之上,此操作过程即为backfill;
三、关于CRUSH
CRUSH是Controlled Replication Under Scalable Hashing的缩写 , 它是一种数据分布式算法,类似于一致性哈希算法,用于为RADOS存储集群控制数据分布;在ceph上如果我们把对象直接映射到OSD上会导致二者的耦合度过于紧密;这意味着如果一个OSD的变动 , 可能导致整个集群的数据的变动;所以,Ceph将一个对象映射进RADOS集群的过程分为两步;首先是以一致性哈希算法将对象名称映射到PG,而后而后是将PG ID基于CRUSH算法映射到OSD;此两个过程都以“实时计算”的方式完成,而非传统的查表方式,从而有效规避了任何组件被“中心化”的可能性,使得集群规模扩展不再受限;
Ceph客户端IO的简要工作流程
在ceph上,客户端存取对象时,客户端从Ceph监视器检索出集群运行图,绑定到指定的存储池,并对存储池上PG内的对象执行IO操作;存储池的CRUSH规则集和PG的数量是决定Ceph如何放置数据的关键性因素,基于最新版本的集群运行图,客户端能够了解到集群中的所有监视器和OSD以及它们各自的当前状态;这对于客户端来说,对象存储在那个位置是一无所知的;执行对象的存取操作时,客户端需要输入的是对象标识和存储池名称;客户端需要在存储池中存储命名对象时 , 它将对象名称、对象名称的哈希码、存储池中的PG数量和存储池名称作为输入,而后由CRUSH计算出PG的ID及此PG的主OSD;通过将对象标识进行一致性哈希运算得到的哈希值与PG位图掩码进行”与“运算得到目标PG,从而得出目标PG的ID(pg_id),完成由Object至PG的映射; 而后,CRUSH算法便将以此pg_id、CRUSH运行图和归置规则(Placement Rules)为输入参数再次进行计算,并输出一个确定且有序的目标存储向量列表(OSD列表),从而完成从PG至OSD的映射;
Ceph客户端计算PG_ID的步骤
1、首先客户端输入存储池名称及对象名称 , 例如,pool = pool1以及object-id = obj1;
2、获取对象名称并通过一致性哈希算法对其进行哈希运算 , 即hash(o),其中o为对象名称;
3、将计算出的对象标识哈希码与PG位图掩码进行“与”运算获得目标PG的标识符,即PG_ID,如1701;计算公式为pgid=func(hash(o)&m,r),其中,变量o是对象标识符,变量m是当前存储池中PG的位图掩码,变量r是指复制因子,用于确定目标PG中OSD数量;
4、CRUSH根据集群运行图计算出与目标PG对应的有序的OSD集合,并确定出其主OSD;
5、客户端获取到存储池名称对应的数字标识,例如,存储池“pool1”的数字标识11;
6、客户端将存储池的ID添加到PG ID,例如,11.1701;
7、客户端通过直接与PG映射到的主OSD通信来执行诸如写入、读取或删除之类的对象操作;
简单来讲,ceph客户端存取对象数据的过程就是 , 先提取用户要存入的对象数据的名称和存储到那个存储池之上;然后通过一致性哈希算法计算出对象名称的hash值,然后把这个hash值和在对应存储池PG位图掩码做“与”运算得到目标PG的标识符,即PG ID;有了PG_ID,再根据CRUSH算法结合集群运行图和PG对应的OSD集合,最终把PG对应的主OSD确认 , 然后将对应osd的信息返回给客户端,然后客户端拿着这些信息主动联系osd所在主机进行数据的存?。徽庖还讨校挥写车牟楸? ,查数据库之类的操作;全程都是通过计算来确定对应数据存储路径;这也就规避了传统查表或查数据库的方式给集群带来的性能瓶颈的问题;
【分布式存储系统之Ceph集群存储池、PG 与 CRUSH】

推荐阅读