Ceph源码解析:PG peering

集群中的设备异常(异常OSD的添加删除操作),会导致PG的各个副本间出现数据的不一致现象,这时就需要进行数据的恢复,让所有的副本都达到一致的状态。

一、OSD的故障和处理办法:

1. OSD的故障种类:

故障A:一个正常的OSD 因为所在的设备发生异常,导致OSD不能正常工作,这样OSD超过设定的时间 就会被 out出集群。

故障B: 一个正常的OSD因为所在的设备发生异常,导致OSD不能正常工作,但是在设定的时间内,它又可以正常的工作,这时会添加会集群中。

2. OSD的故障处理:

故障A:OSD上所有的PG,这些PG就会重新分配副本到其他OSD上。一个PG中包含的object数量是不限制的,这时会将PG中所有的object进行复制,可能会产生很大的数据复制。

故障B:OSD又重新回到PG当中去,这时需要判断一下,如果OSD能够进行增量恢复则进行增量恢复,否则进行全量恢复。(增量恢复:是指恢复OSD出现异常的期间,PG内发生变化的object。全量恢复:是指将PG内的全部object进行恢复,方法同故障A的处理)。

需要全量恢复的操作叫做backfill操作。需要增量恢复的操作叫做recovery操作。

二、概念解析:

1.osdmap:集群所有osd的集合,包括每个osd的ip & state(up or down)

2.acting set & up set:每个pg都有这两个集合,acting set中保存是该pg所有的副本所在OSD的集合,比如acting[0,1,2],就表示这个pg的副本保存在OSD.0 、OSD.1、OSD.2中,而且排在第一位的是OSD.0 ,表示这个OSD.0是PG的primary副本。在通常情况下 up set 与 acting set是相同的。区别不同之处需要先了解pg_temp。

3.Epoch:osdmap的版本号,单调递增,osdmap每变化一次加1

4.current_interval & past interval:一个epoch序列,在这个序列内,这个PG的acting set没有变化过,current是当前的序列,past是指过去的interval。

last_epoch_started:上次经过peering后的osdmap版本号epoch。

last_epoch_clean:上次经过recovery或者backfill后的osdmap版本号epoch。

(注:peering结束后,数据的恢复操作才刚开始,所以last_epoch_started与last_epoch_clean可能存在不同)。

例如:

ceph 系统当前的epoch值为20, pg1.0 的 acting set 和 up set 都为[0,1,2]

osd.3失效导致了osd map变化,epoch变为 21

osd.5失效导致了osd map变化,epoch变为 22

osd.6失效导致了osd map变化,epoch变为 23

上述三次epoch的变化都不会改变pg1.0的acting set和up set

osd.2失效导致了osd map变化,epoch变为 24

此时导致pg1.0的acting set 和 up set变为 [0,1,8],若此时 peering过程成功完成,则last_epoch_started 为24

osd.12失效导致了osd map变化,epoch变为 25

此时如果pg1.0完成了recovery,处于clean状态,last_epoch_clean就为25

osd13失效导致了osd map变化,epoch变为 26

epoch 序列 21,22,23,23 就为pg1.0的past interval

epoch 序列 24,25,26就为 pg1.0的current interval

5.authoritative history:完整的pg log操作序列

6.last epoch start:上次peering完成的epoch

7.up_thru:一个past interval内,第一次完成peering的epoch

8.pg_temp : 假设当一个PG的副本数量不够时,这时的副本情况为acting/up  = [1,2]/[1,2]。这时添加一个OSD.3作为PG的副本。经过crush的计算发现,这个OSD.3应该为当前PG的primary,但是呢,这OSD.3上面还没有PG的数据,所以无法承担primary,所以需要申请一个pg_temp,这个pg_temp就还采用OSD.1作为primary,此时pg的集合为acting,pg_temp的集合为up。当然pg与pg_temp是不一样的,所以这时pg的集合变成了[3,1,2]/[1,2,3]。当OSD.3上的数据全部都恢复完成后,就变成了[3,1,2]/[3,1,2]。

9.pg_log:pg_log是用于恢复数据重要的结构,每个pg都有自己的log。对于pg的每一个object操作都记录在pg当中。

__s32 op; 操作的类型

hobject_t soid; 操作的对象

eversion_t version, prior_version, reverting_to; 操作的版本

三、peering具体流程

算法流程图:

                                 

152756_pm07_2460844

Peering:互为副本的三个(此处为设置的副本个数,通常设置为3)pg的元数据达到一致的过程。官方解释如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2ae0d15b79dd8c2c7909eb08b0ebc218.html