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


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状态;
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的映射;

经验总结扩展阅读