1. 心跳介紹
心跳是用于節(jié)點(diǎn)間檢測(cè)對(duì)方是否故障的,以便及時(shí)發(fā)現(xiàn)故障節(jié)點(diǎn)進(jìn)入相應(yīng)的故障處理流程。
問(wèn)題:
- 故障檢測(cè)時(shí)間和心跳報(bào)文帶來(lái)的負(fù)載之間做權(quán)衡。
- 心跳頻率太高則過(guò)多的心跳報(bào)文會(huì)影響系統(tǒng)性能。
- 心跳頻率過(guò)低則會(huì)延長(zhǎng)發(fā)現(xiàn)故障節(jié)點(diǎn)的時(shí)間,從而影響系統(tǒng)的可用性。
故障檢測(cè)策略應(yīng)該能夠做到:
- 及時(shí):節(jié)點(diǎn)發(fā)生異常如宕機(jī)或網(wǎng)絡(luò)中斷時(shí),集群可以在可接受的時(shí)間范圍內(nèi)感知。
- 適當(dāng)?shù)膲毫Γ喊▽?duì)節(jié)點(diǎn)的壓力,和對(duì)網(wǎng)絡(luò)的壓力。
- 容忍網(wǎng)絡(luò)抖動(dòng):網(wǎng)絡(luò)偶爾延遲。
- 擴(kuò)散機(jī)制:節(jié)點(diǎn)存活狀態(tài)改變導(dǎo)致的元信息變化需要通過(guò)某種機(jī)制擴(kuò)散到整個(gè)集群。
2. Ceph 心跳檢測(cè)

OSD節(jié)點(diǎn)會(huì)監(jiān)聽public、cluster、front和back四個(gè)端口
- public端口:監(jiān)聽來(lái)自Monitor和Client的連接。
- cluster端口:監(jiān)聽來(lái)自O(shè)SD Peer的連接。
- front端口:供客戶端連接集群使用的網(wǎng)卡, 這里臨時(shí)給集群內(nèi)部之間進(jìn)行心跳。
- back端口:供客集群內(nèi)部使用的網(wǎng)卡。集群內(nèi)部之間進(jìn)行心跳。
- hbclient:發(fā)送ping心跳的messenger。
3. Ceph OSD之間相互心跳檢測(cè)

步驟:
- 同一個(gè)PG內(nèi)OSD互相心跳,他們互相發(fā)送PING/PONG信息。
- 每隔6s檢測(cè)一次(實(shí)際會(huì)在這個(gè)基礎(chǔ)上加一個(gè)隨機(jī)時(shí)間來(lái)避免峰值)。
- 20s沒(méi)有檢測(cè)到心跳回復(fù),加入failure隊(duì)列。
4. Ceph OSD與Mon心跳檢測(cè)

OSD報(bào)告給Monitor:
- OSD有事件發(fā)生時(shí)(比如故障、PG變更)。
- 自身啟動(dòng)5秒內(nèi)。
- OSD周期性的上報(bào)給Monito
- OSD檢查failure_queue中的伙伴OSD失敗信息。
- 向Monitor發(fā)送失效報(bào)告,并將失敗信息加入failure_pending隊(duì)列,然后將其從failure_queue移除。
- 收到來(lái)自failure_queue或者failure_pending中的OSD的心跳時(shí),將其從兩個(gè)隊(duì)列中移除,并告知Monitor取消之前的失效報(bào)告。
- 當(dāng)發(fā)生與Monitor網(wǎng)絡(luò)重連時(shí),會(huì)將failure_pending中的錯(cuò)誤報(bào)告加回到failure_queue中,并再次發(fā)送給Monitor。
- Monitor統(tǒng)計(jì)下線OSD
- Monitor收集來(lái)自O(shè)SD的伙伴失效報(bào)告。
- 當(dāng)錯(cuò)誤報(bào)告指向的OSD失效超過(guò)一定閾值,且有足夠多的OSD報(bào)告其失效時(shí),將該OSD下線。
5. Ceph心跳檢測(cè)總結(jié)
Ceph通過(guò)伙伴OSD匯報(bào)失效節(jié)點(diǎn)和Monitor統(tǒng)計(jì)來(lái)自O(shè)SD的心跳兩種方式判定OSD節(jié)點(diǎn)失效。
- 及時(shí):伙伴OSD可以在秒級(jí)發(fā)現(xiàn)節(jié)點(diǎn)失效并匯報(bào)Monitor,并在幾分鐘內(nèi)由Monitor將失效OSD下線。
- 適當(dāng)?shù)膲毫Γ?/strong>由于有伙伴OSD匯報(bào)機(jī)制,Monitor與OSD之間的心跳統(tǒng)計(jì)更像是一種保險(xiǎn)措施,因此OSD向Monitor發(fā)送心跳的間隔可以長(zhǎng)達(dá)600秒,Monitor的檢測(cè)閾值也可以長(zhǎng)達(dá)900秒。Ceph實(shí)際上是將故障檢測(cè)過(guò)程中中心節(jié)點(diǎn)的壓力分散到所有的OSD上,以此提高中心節(jié)點(diǎn)Monitor的可靠性,進(jìn)而提高整個(gè)集群的可擴(kuò)展性。
-
容忍網(wǎng)絡(luò)抖動(dòng):Monitor收到OSD對(duì)其伙伴OSD的匯報(bào)后,并沒(méi)有馬上將目標(biāo)OSD下線,而是周期性的等待幾個(gè)條件:
- 目標(biāo)OSD的失效時(shí)間大于通過(guò)固定量osd_heartbeat_grace和歷史網(wǎng)絡(luò)條件動(dòng)態(tài)確定的閾值。
- 來(lái)自不同主機(jī)的匯報(bào)達(dá)到mon_osd_min_down_reporters。
- 滿足前兩個(gè)條件前失效匯報(bào)沒(méi)有被源OSD取消。
- 擴(kuò)散:作為中心節(jié)點(diǎn)的Monitor并沒(méi)有在更新OSDMap后嘗試廣播通知所有的OSD和Client,而是惰性的等待OSD和Client來(lái)獲取。以此來(lái)減少M(fèi)onitor壓力并簡(jiǎn)化交互邏輯。
6. 心跳設(shè)置
6.1 配置監(jiān)視器/ OSD互動(dòng)
您已完成初始Ceph的配置之后,您可以部署和運(yùn)行的Ceph。當(dāng)你執(zhí)行一個(gè)命令,如ceph health 或 ceph -s , Ceph的監(jiān)視器將報(bào)告CEPH存儲(chǔ)集群的當(dāng)前狀態(tài)。Ceph的監(jiān)視器通過(guò)每個(gè)Ceph的OSD守護(hù)實(shí)例,以及相鄰的Ceph OSD守護(hù)實(shí)例,了解Ceph的存儲(chǔ)集群的相關(guān)狀態(tài)。Ceph的監(jiān)視器如果沒(méi)有收到報(bào)告,或者如果它接收Ceph的存儲(chǔ)集群的變化的報(bào)告,Ceph的監(jiān)視器更新的的CEPH集群映射圖的狀態(tài)。
Ceph為Ceph的監(jiān)視器/ Ceph的OSD守護(hù)程序交互提供合理的默認(rèn)設(shè)置。但是,您可以覆蓋默認(rèn)值。以下部分描述如何用Ceph的監(jiān)視器和Ceph的OSD守護(hù)實(shí)例互動(dòng)來(lái)達(dá)到Ceph的存儲(chǔ)集群監(jiān)控的目的。
6.2. OSDS檢查心跳
每個(gè)Ceph的OSD守護(hù)程序檢查其他Ceph的OSD守護(hù)進(jìn)程的心跳每6秒。Ceph的配置文件下的[OSD]部分加入OSD osd heartbeat interval ,或通過(guò)設(shè)定值在運(yùn)行時(shí),您可以更改心跳間隔。如果在20秒的寬限期內(nèi)鄰居的Ceph的OSD守護(hù)進(jìn)程不顯示心跳,Ceph的OSD守護(hù)進(jìn)程可能考慮周邊的Ceph OSD守護(hù)掛掉,并向一個(gè)Ceph的Monitor報(bào)告,這將更新的CEPH集群地圖。一個(gè)OSD osd heartbeat grace 可以在Ceph的配置文件下的[OSD]部分設(shè)置,或在運(yùn)行時(shí),你通過(guò)設(shè)置這個(gè)值改變這個(gè)寬限期。
6.3. OSDS報(bào)告掛掉的OSD
默認(rèn)情況下,Ceph的OSD守護(hù)程序必須向Ceph的監(jiān)視器報(bào)告三次:另一個(gè)Ceph的OSD守護(hù)程序已經(jīng)掛掉,在Ceph的Monitor承認(rèn)該報(bào)告Ceph的OSD守護(hù)掛掉之前。在(早期V0.62版本之前)Ceph的配置文件下的[MON]部分添加 osd min down reports setting,或者通過(guò)設(shè)定值在運(yùn)行時(shí),您可以更改OSD報(bào)告的掛掉的最低數(shù)量 。默認(rèn)情況下,只有一個(gè)Ceph的OSD守護(hù)進(jìn)程是必需報(bào)告另一個(gè)Ceph的OSD守護(hù)進(jìn)程。您可以更改向Ceph監(jiān)視器報(bào)告Ceph的OSD守護(hù)進(jìn)程的Ceph的OSD Daemones 的數(shù)量,通過(guò)添加一個(gè)mon osd min down reporters設(shè)置在Ceph的配置文件中,或者通過(guò)設(shè)定值在運(yùn)行時(shí)。
6.4. 凝視失敗的OSD報(bào)告
Ceph的OSD守護(hù)進(jìn)程如果不能和Ceph的配置文件(或群集地圖)中定義的OSD守護(hù)同行,它將每30秒ping一個(gè)Ceph的監(jiān)視器,為了最新副本的集群映射圖。Ceph的配置文件 下的[OSD]部分加入 osd mon heartbeat interval 設(shè)置,或通過(guò)在運(yùn)行時(shí)設(shè)定值,您可以更改Ceph的監(jiān)控心跳間隔。
6.5. OSDS報(bào)告其狀態(tài)
Ceph的OSD守護(hù)進(jìn)程如果不向Ceph的監(jiān)視器報(bào)告,至少每120秒一次,Ceph的監(jiān)視器會(huì)考慮Ceph的OSD守護(hù)已經(jīng)掛掉。您可以更改Ceph的監(jiān)控報(bào)告間隔,通過(guò)加入 osd mon report interval max 設(shè)置在Ceph的配置文件的[OSD]部分,或者通過(guò)設(shè)置在運(yùn)行時(shí)的值。Ceph的OSD守護(hù)進(jìn)程會(huì)嘗試報(bào)告其狀態(tài)每30秒。在Ceph的配置文件下的[OSD]部分加入 osd mon report interval min s設(shè)置,或者通過(guò)設(shè)定值在運(yùn)行時(shí),您可以更改Ceph的OSD守護(hù)報(bào)告間隔。
7. 配置設(shè)置
修改心跳設(shè)置時(shí),你應(yīng)該將它們包括在 您的配置文件的[global]部分。
7.1 監(jiān)視器MONITOR設(shè)置
| 參數(shù) | 說(shuō)明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| mon OSD min up ratio | Ceph的OSD未掛掉的最低比率在Ceph的OSD守護(hù)程序被仍定掛掉之前 | double | 0.3 |
| mon OSD min in ratio | Ceph的OSD實(shí)例的最低比率在Ceph的OSD守護(hù)程序被仍定出局之前 | double | 0.3 |
| mon osd laggy halflife | laggy估計(jì)會(huì)腐爛的秒數(shù) | int | 60 * 60 |
| mon osd laggy weight | laggy估計(jì)衰減的新樣本的權(quán)重 | double | 0.3 |
| mon osd adjust heartbeat grace | 如果設(shè)置為true,Ceph將在laggy估計(jì)的基礎(chǔ)上擴(kuò)展 | bool | true |
| mon osd adjust down out interval | 如果設(shè)置為true,Ceph基于laggy估計(jì)擴(kuò)展 | bool | true |
| mon osd auto mark in | Ceph將標(biāo)記任何引導(dǎo)的Ceph的OSD守護(hù)進(jìn)程作為在 CEPH存儲(chǔ)集群 | bool | false |
| mon osd auto mark auto out in | Ceph的標(biāo)記引導(dǎo)Ceph的OSD守護(hù) Ceph的存儲(chǔ)集群,集群中的自動(dòng)標(biāo)記 | bool | true |
| mon osd auto mark new in | 頭孢將迎來(lái)啟動(dòng)新的Ceph的OSD守護(hù)在 Ceph的存儲(chǔ)集群 | bool | true |
| mon osd down out subtree limit | 最大的CRUSH單位Ceph的類型,會(huì)自動(dòng)標(biāo)記出來(lái) | String | rack |
| mon osd report timeout | 寬限期秒下來(lái)在聲明反應(yīng)遲鈍Ceph的OSD守護(hù)前 | 32-bit Integer | 900 |
| mon osd min down reporters | Ceph的OSD守護(hù)報(bào)告向下 Ceph的OSD守護(hù)所需的最低數(shù)量 | 32-bit Integer | 1 |
| mon osd min down reports | Ceph的OSD守護(hù)的最低次數(shù)必須報(bào)告說(shuō),另一個(gè)Ceph的OSD守護(hù)下來(lái) | 32-bit Integer | 3 |
7.2 OSD設(shè)置
| 參數(shù) | 說(shuō)明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| OSD heartbeat address | 一個(gè)Ceph的OSD守護(hù)進(jìn)程的網(wǎng)絡(luò)地址的心跳 | Address | The host address |
| OSD heartbeat interval | 多久Ceph的OSD守護(hù)坪及其同行(以秒計(jì)) | 32-bit Integer | 6 |
| OSD heartbeat grace | Ceph的OSD當(dāng)一個(gè)守護(hù)進(jìn)程并沒(méi)有表現(xiàn)出心跳Ceph的存儲(chǔ)集群認(rèn)為,經(jīng)過(guò)時(shí)間的 | 32-bit Integer | 20 |
| OSD mon heartbeat interval | Ceph的的OSD守護(hù)坪一個(gè)Ceph的監(jiān)視器如果它沒(méi)有的CEPH OSD守護(hù)同行,多久 | 32-bit Integer | 30 |
| OSD mon report interval max | Ceph的OSD守護(hù)進(jìn)程報(bào)告Ceph的監(jiān)視器Ceph的監(jiān)視器前認(rèn)為Ceph的OSD守護(hù)下來(lái)的時(shí)間以秒為單位的最大 | 32-bit Integer | 120 |
| OSD mon report inteval min | 秒為Ceph的OSD的守護(hù)Ceph的監(jiān)視器,以防止Ceph的監(jiān)視器考慮Ceph的OSD守護(hù)的最低數(shù)量 | 32-bit Integer | 5 (有效范圍:應(yīng)小于OSD 周一 報(bào)告 間隔 最大) |
| OSD mon ACK timeout | 等待的秒數(shù)為Ceph的監(jiān)視器確認(rèn)請(qǐng)求統(tǒng)計(jì) | 32-bit Integer | 30 |