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


PG计数
PG数量由管理员在创建存储池时指定,而后由CRUSH负责创建和使用,通常,PG的数量应该是数据的合理颗粒度的子集,例如,一个包含256个PG的存储池意味着每个PG包含大约1/256的存储池数据;当需要将PG从一个OSD移动到另一个OSD时 , PG的数量会对性能产生影响;PG数量过少,Ceph将不得不同时移动相当数量的数据,其产生的网络负载将对集群的正常性能输出产生负面影响;即PG过少,那么对应一个PG存储的数据就越多,则移动PG会占用过多的网络带宽 , 从而影响正常客户端的使用;而在过多的PG数量场景中在移动极少量的数据时,Ceph将会占用过多的CPU和RAM,从而对集群的计算资源产生负面影响 。即PG过多,对应每个PG维护的数据较少 , 但是集群需要花费很多CPU和内存来维护和追踪PG的信息;从而造成集群的计算资源和内存资源造成影响,从而进一步影响客户端使用;所以在ceph上pg的数量不宜过多和过少;
PG数量在群集分发数据和重新平衡时扮演着重要作用,在所有OSD之间进行数据持久存储及完成数据分布会需要较多的归置组,但是它们的数量应该减少到最大性能所需的最小数量值,以节省CPU和内存资源;一般说来,对于有着超过50个OSD的RADOS集群,建议每个OSD大约有50-100个PG以平衡资源使用 , 取得更好的数据持久性和数据分布,更大规模的集群中,每个OSD大约可持有100-200个PG至于应该使用多少个PG,可通过下面的公式计算后 , 将其值以类似于四舍五入到最近的2的N次幂;
PG计算公式:(Total OSDs * PGPerOSD)/Replication factor => Total PGs;即一个ceph集群总PG数量=每个OSD上的pg数量×OSD的数量,然后除以副本数量;一个RADOS集群上可能会存在多个存储池,因此管理员还需要考虑所有存储池上的PG分布后每个OSD需要映射的PG数量;即总pg数量/存储池个数,就是平均一个存储的PG数量;简单讲就是所有存储池的PG数量之和应该等于通过上述公式算出来的值四舍五入到最近的2的N次幂;
PG状态
依据PG当前的工作特性或工作进程所处的阶段,它总是处于某个或某些个“状态”中 , 最为常见的状态应该为“active+clean”;
PG的常见状态
1、Active:所谓Active状态是指主OSD和各辅助OSD均处于就绪状态 , 可正常服务于客户端的IO请求所处于的状态;一般,Peering操作过程完成后即会转入Active状态;
2、Clean:是指主OSD和各辅助OSD均处于就绪状态,所有对象的副本数量均符合期望,并且PG的活动集和上行集是为同一组OSD;
活动集(Acting Set):由PG当前的主OSD和所有的处于活动状态的辅助OSD组成,这组OSD负责执行此PG上数据对象的存取操作I/O;
上行集(Up Set):根据CRUSH的工作方式,集群拓扑架构的变动将可能导致PG相应的OSD变动或扩展至其它的OSD之上 , 这个新的OSD集也称为PG的”上行集(Up Set)“,其映射到的新OSD集可能部分地与原有OSD集重合,也可能会完全不相干; 上行集OSD需要从当前的活动集OSD上复制数据对象 , 在所有对象同步完成后,上行集便成为新的活动集,而PG也将转为“活动(active)”状态;
3、Peering:一个PG中的所有OSD必须就它们持有的数据对象状态达成一致,而“对等(Peering)”即为让其OSD从不一致转为一致的过程;
4、Degraded:在某OSD标记为“down”时,所有映射到此OSD的PG即转入“降级(degraded)”状态;此OSD重新启动并完成Peering操作后,PG将重新转回clean;一旦OSD标记为down的时间超过5分钟,它将被标记出集群,而后Ceph将对降级状态的PG启动恢复操作,直到所有因此而降级的PG重回clean状态;在其内部OSD上某对象不可用或悄然崩溃时,PG也会被标记为降级状态 , 直至对象从某个权威副本上正确恢复;
5、Stale:每个OSD都要周期性地向RADOS集群中的监视器报告其作为主OSD所持有的所有PG的最新统计数据,因任何原因导致某个主OSD无法正常向监视器发送此类报告,或者由其它OSD报告某个OSD已经down掉,则所有以此OSD为主OSD的PG将立即被标记为stale状态;
6、Undersized: PG中的副本数少于其存储池定义的个数时即转入undersized状态,恢复和回填操作在随后会启动以修复其副本数为期望值;
7、Scrubbing:各OSD还需要周期性地检查其所持有的数据对象的完整性,以确保所有对等OSD上的数据一致;处于此类检查过程中的PG便会被标记为scrubbing状态,这也通常被称作light scrubs、shallowscrubs或者simply scrubs;另外,PG还偶尔需要进行deep scrubs检查以确保同一对象在相关的各OSD上能按位匹配 , 此时PG将处于scrubbing+deep状态;

推荐阅读