接着上一章,我们这里结合osd3_watch.txt
日志文件,以及pgmap_active_clean.txt、pgmap_in_down.txt、pgmap_out_down.txt,从中选出4
个具有代表性的PG,来分析一下osd0从in+up
到in+down
再到out+down
这一整个过程中PG所执行的动作。
选取的4个PG如下:
in + up in + down out + down
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
pg_stat up up_primary acting acting_primary pg_stat up up_primary acting acting_primary pg_stat up up_primary acting acting_primary
11.4 [0,3] 0 [0,3] 0 11.4 [3] 3 [3] 3 11.4 [3,2] 3 [3,2] 3
22.2c [0,3] 0 [0,3] 0 22.2c [3] 3 [3] 3 22.2c [5,7] 5 [5,7] 5
22.2a [3,0] 3 [3,0] 3 22.2a [3] 3 [3] 3 22.2a [3,6] 3 [3,6] 3
22.16 [3,7] 3 [3,7] 3 22.16 [3,7] 3 [3,7] 3 22.16 [3,7] 3 [3,7] 3
上面4个PG代表4种典型的场景:
-
PG 11.4 : PG的主osd关闭,在osd out之后,PG的其中一个副本进行remap
-
PG 22.2c: PG的主OSD关闭,在osd out之后,PG的两个副本进行remap
-
PG 22.2a: PG的副本OSD关闭,在osd out之后,PG的其中一个副本进行remap
-
PG 22.16: 关闭的OSD并不是PG的任何副本
使用如下命令从osd3_watch.txt中分别导出该PG相关的日志信息:
这里主要分析一下PG 22.16在这一阶段的变化过程。
1. PG 22.16分析
这里我们过滤osd3_watch.txt日志文件,找出所有与PG 22.16相关的日志(如下日志经过了适当的修改)。
1.1 接收到e2223版本的osdmap
如下是接收到e2223版本osdmap时的日志片段:
处理流程如下:
1) 接收新的osdmap
在osdmap被写入到object store后,会回调C_OnMapCommit()函数,然后调用到OSD::_committed_osd_maps(),如下:
在OSD::consume_map()函数中产生NullEvt事件,触发Peering过程:
2) 处理Peering事件
首先调用advance_pg()完成PG对osdmap的追赶:
3) 对AdvMap事件的处理
这里对于PG 22.16而言,明显是不需要重新Peering的,因此这里直接丢弃AdvMap事件。
4) 对ActMap事件的处理
因为PG 22.16当前处于active+clean状态,因此调用如下函数处理:
这里直接将ActMap事件往上抛,然后调用如下函数:
这里调用PG::publish_stats_to_osd()之后,直接将ActMap事件丢弃。
1.2 e2224/e2225版本osdmap的处理
处理方式与上面e2223类似,这里不再赘述。
-
ceph存储 PG的状态机和peering过程
-
Ceph OSDMap 机制浅析