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