1. 当前monitor可以通过3种途径检测到osd离线
1) Osd自主上报
2) Osd通过投票的方式(满足一下条件之一,mon会将osd标记为down)
a) 投票携带了Force/Immediate标识(和其他osd建立链接时返回econnrefused)
b) 有效票数已经达到阈值mon_osd_min_down_reporters(默认为2)(同一故障域只会记1票)
<1> 选择每个pg的Up与Acting中的osd
<2> 选择在编号上与本osd相邻的前一个和后一个状态为Up的osd
<3> 如果该osd的心跳伙伴个数小于最小值osd_heartbeat_min_peers(默认为10),则以本osd编号作为基准,依次选择集群中下一个状态为Up,编号相邻的osd,直至达到最小值
Note: osd之间的心跳采用单播(点对点)的方式(如果集群较大,采用广播可能会导致广播风暴)
3) 周期性向monitor发送beacon消息进行保活
Osd周期性向monitor发送beacon消息进行保活osd_beacon_report_interval(默认100秒),超过mon_osd_report_timeout(默认 300秒)没有收到osd的beacon消息,则将该osd标记为Down
2. osd心跳
1) osd之间的心跳:
OSD 之间每 osd_heartbeat_interval(默认 2 秒)会有一个来回心跳包的检测,该心跳包会分别从public和cluster网分别发出,当一个 OSD 在 osd_heartbeat_grace(默认 7 秒)时间内没有收到其他 OSD 心跳的时候,那么这个 OSD 会向 MON 汇报说另一个 OSD 心跳已经超时。当MON 收到多个来自不同故障域的 OSD 都汇报了同一个 OSD 的心跳问题,就会将这个 OSD mark DOWN
2) OSD向mon报告自己的状态:
OSD每最小osd_beacon_report_interval(默认100秒),如果一 OSD 在 mon_osd_report_timeout(默认300秒) 时间内没向mon报告过自己的状态,mon就认为它 down 了。
3) Osd向mon报告自己的事件
从一 OSD 启动或其它可报告事件发生以来,osd_mon_report_interval_min(默认3秒)时间内必须向监视器报告一次,监视器允许 OSD 报告的最大间隔为osd_mon_report_interval_max(默认为15秒),超时将认为 OSD 挂了( down )
4) Osd心跳参数:
osd_heartbeat_interval
描述:默认值2,osd发送heartbeat给其他osd的间隔时间
osd_heartbeat_grace
描述:默认值7,OSD 多久没心跳就会被集群认为它挂( down )了
5) Osd向mon心跳参数
osd_beacon_report_interval
描述:默认值100,osd报告beacon消息间隔
mon_osd_report_timeout
描述:默认值300,宣布无响应 OSD down 前的宽限期,秒
mon_osd_adjust_heartbeat_grace
描述:默认值false,设置为 true 时, Ceph 将根据滞后量伸缩
6) Osd事件参数:
osd_mon_report_interval_min
描述:默认值3,从一 OSD 启动或其它可报告事件发生以来,多长时间内必须向监视器报告一次
osd_mon_report_interval_max
描述:默认值15,监视器允许 OSD 报告的最大间隔,超时将认为 OSD 挂了( down )
mon_osd_down_out_interval
描述:默认值10800,在 OSD 停止响应多少秒后把它标记为 down 且 out
mon_osd_adjust_down_out_interval
描述:默认值false,设置为 true 时, Ceph 将根据滞后量伸缩
3. 参考资料:
1、http://wiki.xsky.com
2、《ceph之rados设计原理与实现》
3、http://docs.ceph.com