由于每个写操作都需要产生和操作日志,所以处于效率考虑,必须定时对日志进行裁剪。
由于PG保存的日志条目有限,按照能否依靠日志进行数据恢复,存在两种数据恢复方式,分别为Recovery和Backfill。
Recovery指只需要修复副本(PG)上与权威日志不同步的那部分对象(即降级对象即可)。missing已经记录
Backfill指以PG全体对象为目标的数据迁移过程。例如所在OSD离线太久而期间产生大量客户端发起的读写请求,或者Ceph自身出于数据重平衡需要而执行Backfill。
1.Recovery
1.1 资源预留
为了防止集群中大量PG同时执行Recovery从而严重影响正常业务,需要对Recovery进行约束
为了实现上述约束,在PG正式开始执行Recovery任务之前,必须先由Primary主导,发起资源预留
所谓的资源预留:Primary(一个PG实例)必须先加入所属OSD的全局异步资源预留队列,如果OSD资源够,就会给队列头PG分配资源。
Primary得到OSD资源后,需要进一步通知所有参与本次Recovery的副本远程进行资源预留,所有副本都获得资源后,才能开始Recovery。
所有需要执行Recovery的PG也会进入op_shardedwq工作队列,与来自客户端的请求一同参与竞争。
1.2 对象修复
Pull:指Primary自身存在降级对象,由Primary按照missing_loc选择合适的副本去拉取降级对象的权威副