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


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】

经验总结扩展阅读