【ceph研发】peering 运行过程 举例阐述

peering 运行过程

 

 

 

1.写入object1。初始状态pg ,他由osd.0 、osd.1、osd.2组成的三副本形式,这时up集合为[0,1,2],acting集合为[0,1,2],acting_primary 为osd 0。这时该pg已经完成写入object1,那osd0,1,2上都保存这object1。这时pg处于interval0.

2.加入osd3。当集群添加osd3.有的pg上的数据会发生移动,刚巧这个pg的up由[0,1,2]变成[0,1,3],这时的acting也变成了[0,1,3],acting_primary 为osd 0。但是osd.3上没有object1,标记为虚线框黄底色的object1,就会发生数据移动,由osd.0 向 osd.3上拷贝数据(该过程是recovery或者backfill,确定是哪一种,要根据pglog来决定)。当拷贝数据的过程中发生,数据写入。加入osd3后,pg的up集合由[0,1,2]变成[0,1,3],所以pg此时为interval 1。

3.写入object2。在写入pg的时候,数据会写三个副本,分别写到osd0,1,3中。osd0,1中有object1,2。osd3中只有object2,osd3中的object1还在数据恢复中。由于up集合没发生变化,所以此时pg仍然是interval 1

4.加入osd4。在osd3没有数据恢复完成,就加入了osd4,此时pg的up集合由[0,1,3]变成了[0,4,3]。所以pg进入到了interval 2。osd0保存了object1,object2。osd3保存了object2,需要恢复object1。osd4上需要恢复object1,object2。这时的acting集合仍然是[0,4,3]. acting_primary 为osd 0。pg又重新进入到数据恢复的过程,恢复osd4,3上的数据。

5.写入object3。在osd4,osd3上的数据恢复没有完成的时候,又写入object3,这个object3写入到osd0,4,3上。写入数据完成。此时 osd4仍然需要恢复object1,object2。osd3仍然需要恢复数据object1。

6.加入osd5。在osd4,osd3上的数据没有恢复完成前,又加入了osd5 引起了pg的up集合变化,pg的up集合由[0,4,3]变成[5,4,3],由于up集合变化,所以进入interval 3。但是这时osd5,osd4,osd3上都有数据要恢复,在选取acting集合的时候要借鉴interval 2 中的acting集合,为了能恢复数据,这时的acting集合为[0,4,5,3],在确定acting_primary osd的时候,如果pg进入recoving状态 则选择osd5为acting_primary osd,若pg进入backfill状态则选择osd0为acting_primary osd。假设我们这时是backfill的pg。则选举osd0为acting_primay。acting_primary 的作用就是用来处理客户端的请求的。此时osd3,osd4,osd5都有object需要恢复,重新开始恢复数据。

7.写入object4。在osd4,osd5,osd3 都有数据需要恢复,但是osd0为acting_primary,所以osd0 接收数据分成4份,分别写入osd0,osd3,osd4,osd5。此时osd0上有 object1,object2,object3,object4。osd3上有object2,object3,object4,需要恢复object1。osd4上有object3,object4,需要恢复object1,object2。osd5上只有object4,需要恢复object1,object2,object3。

8.等待数据恢复完成。当数据恢复完成时,会发送事件给pgmonitor,此时会重新发起pg的peering过程。但是此时up集合为[5,4,3],由于数据恢复完成不需要借鉴interval2,所以acting集合为[5,4,3] ,在acting集合中会选举osd5为acting_primary,将osd0踢出pg。此后由osd5负责 处理客户端的请求。

参考资料

1 . Ceph peering流程14问

2. ceph的数据存储之路(8) -----pg 的数据恢复过程

posted @ 2021-12-11 13:31  苏格拉底的落泪  阅读(184)  评论(0编辑  收藏  举报