CephFS 内部实现(四):MDS是如何启动的?

2020-07-12  本文已影响0人  宋新颖

MDS启动时要经历一系列状态装换,但mds的各个状态是如何产生、确定的?这些状态究竟在处理什么?本篇尝试以正常启动mds为背景解释这两个问题。

MDS和Monitor的交互

为提供FS服务,首先要ceph fs new命令创建filesystem,然后再启动mds进程。
其中ceph fs new命令由MDSMonitor组件处理,将一个文件系统信息(底层pool是哪些,一些feature等)写入monitor store,此时文件系统是没有关联mds的,所以是不可用的。
mds进程启动后,通过向MDSMonitor发送Beacon消息,并接收从MDSMonitor返回的MDSMap消息逐步启动自己。Beacon除了用于告知monitor关于mds的健康状态,还有want_state这一信息。want_state的值是在mds启动或者收到MDSMap后由mds自己决定的(如向resolve、reconnect、rejoin等转换)。
MDSMonitor接收mds发来的Beacon消息,更新pending_fsmap,写入store。MDSMonitor::tick()在每次写完store后被调用,对pending_fsmap进行遍历,尝试给fsmap关联mds,然后更新pending_fsmap,再次写入store,完成后向mds发送MDSMap。关联到fsmap的mds分两类:一类是具有rank的,最终mds daemon会进入到STATE_ACTIVE状态,其中rank值由MDSMonitor分配;另一类是STATE_STANDBY_REPLAY,每个fsmap最多有一个,没有rank值。关联动作是通过遍历已创建fs map(如果创建了多个filesystem,那么此处就会有多个fs map),寻找可用的处于STATE_STANDBY状态的mds实现的,具体在MDSMonitor::maybe_expand_cluster()
在众多mds状态中,由MDSMonitor路径负责的状态转换只有一部分,所以在MDSMonitor的代码里不会看到全部mds状态。其他状态转换是在mds端做的决策,此时monitor只是作为一个记录者,负责将状态写入store中。

mds_start.png

MDS 状态

Monitor关于mds状态的处理

MDSMonitor每次写完store后都会由MDSMonitor::tick()做三件事:

在正常启动阶段,MDSMonitor代码,已经MDSMonitor调用的FSMap::promote中主要使用了以下状态:

对于resolve等状态MDSMonitor是不涉及的,这些是在MDS端处理。

mds侧关于mds状态的处理

MDS在启动时设置自己状态为STATE_BOOT,并通过beacon发送给MDSMonitor。后续将通过接收到的MDSMap来进一步决定自己的状态。

mds状态变化

MDS_BOOT_xxx对应MDSRank::boot_start()中的步骤,每个步骤作用:

其他状态

除了以上状态外,还有stop、dne等状态,本文没有涉及。

上一篇 下一篇

猜你喜欢

热点阅读