PG
PG(Placement Group)单从名字上可理解为一个放置策略组,它是对象的集合,集合里的所有对象具有相同的放置策略;对象的副本都分布在相同的OSD列表上。一个对象只能属于一个PG,一个PG对应于放置在其上的OSD列表。一个OSD上可以分布多个PG。
PG是一组对象的逻辑集合,也可将PG看成一个逻辑容器,容器里面包含多个对象。
- 图中PG1、PG2同处于一个Pool,所以是副本类型,并且是两副本。
- PG1、PG2里包含许多对象,PG1上的所有对象,主从副本分布在OSD1和OSD2上,PG2上的所有对象的主从副本分布在OSD2和OSD3上。
- 一个对象只能属于一个PG,一个PG包含多个对象。
- 一个PG的副本分布在对应的OSD列表,在一个OSD上可以分布多个PG。
计算PG数
计算ceph集群中的PG数公式:
PG总数=(OSD总数*100)/副本数
结果必须舍入到最接近2的N次幂的值。
计算每个Pool的PG数,公式:
PG总数=((OSD总数*100)/副本数)/Pool数
结果必须舍入到最接近2的N次幂的值。
PG与OSD
在实际集群中由PG映射到实际存储数据的OSD中,该映射规则是CRUSH算法来确定的;映射过程大致如下:
首先将PG ID作为CRUSH算法的输入,获取到包含N个OSD的集合,集合中的第一个OSD将被作为主OSD,其他的OSD则依次作为从OSD。N表示该PG所在Pool下的副本数,在实际生产环境中N一般为3,表示3副本数。3副本表示将一个PG复制到3个不同节点OSD上。集合中的OSD将共同维护该PG下的Object。
CRUSH算法并不是绝对不变的,会受其他因素影响,影响因素主要有:
1、当前系统状态(Cluster Map)
当系统中的OSD状态、数量发生变化,会引起Cluster Map发生变化,这边变化就会影响PG与OSD的映射关系。
2、存储策略配置 (存储策略主要与数据安全相关)
通过策略可以指定同一个PG的3个OSD分别位于数据中心的不同服务器甚至不同机柜上,从而更加完善存储的可靠性。
总结:只有在Cluster Map和存储策略都不发生变化的情况下,PG和OSD之间的映射关系才会不变。
为什么选择CRUSH算法?
之所以在PG映射过程中选择CRUSH算法而不是其他的Hash算法,原因有以下几点:
1、CRUSH同态特性
利用CRUSH同态特性,ceph才可以将一个PG根据具体需求动态迁移到不同的OSD上,从而自动化实现高可靠、数据分布负载等特性,即使PG与OSD的映射关系发生了变化,对上层应用不会造成太大的困扰。
2、可配置特性
通过对存储策略的配置,使用配置参数决定OSD的物理位置映射策略。
3、特殊的稳定性
当集群中加入新的OSD使规模增大时,大部分PG与OSD之间的映射关系并不会发生改变,只有少部分PG的映射关系会发生变化并触发数据迁移。