新聞中心
從Ceph看分布式系統(tǒng)故障檢測
作者:王康 2017-12-19 10:37:16
存儲
存儲軟件
分布式 不同的分布式系統(tǒng)由于其本身的結(jié)構(gòu)不同,以及對一致性、可用性、可擴(kuò)展性的需求不同,會針對以上幾點(diǎn)作出不同的抉擇或取舍。下面我們就來看看Ceph是怎么做的。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供淳安網(wǎng)站建設(shè)、淳安做網(wǎng)站、淳安網(wǎng)站設(shè)計、淳安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、淳安企業(yè)網(wǎng)站模板建站服務(wù),10多年淳安做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
節(jié)點(diǎn)的故障檢測是分布式系統(tǒng)無法回避的問題,集群需要感知節(jié)點(diǎn)的存活,并作出適當(dāng)?shù)恼{(diào)整。通常我們采用心跳的方式來進(jìn)行故障檢測,并認(rèn)為能正常與外界保持心跳的節(jié)點(diǎn)便能夠正常提供服務(wù)。一個好的故障檢測策略應(yīng)該能夠做到:
- 及時:節(jié)點(diǎn)發(fā)生異常如宕機(jī)或網(wǎng)絡(luò)中斷時,集群可以在可接受的時間范圍內(nèi)感知;
- 適當(dāng)?shù)膲毫Γ喊▽?jié)點(diǎn)的壓力,和對網(wǎng)絡(luò)的壓力;
- 容忍網(wǎng)絡(luò)抖動
- 擴(kuò)散機(jī)制:節(jié)點(diǎn)存活狀態(tài)改變導(dǎo)致的元信息變化需要通過某種機(jī)制擴(kuò)散到整個集群;
不同的分布式系統(tǒng)由于其本身的結(jié)構(gòu)不同,以及對一致性、可用性、可擴(kuò)展性的需求不同,會針對以上幾點(diǎn)作出不同的抉擇或取舍。下面我們就來看看Ceph是怎么做的。
Ceph故障檢測機(jī)制
Ceph作為有中心的分布式結(jié)構(gòu),元信息的維護(hù)和更新自然的都由其中心節(jié)點(diǎn)Ceph Monitor來負(fù)責(zé)。節(jié)點(diǎn)的存活狀態(tài)發(fā)生改變時,也需要Monitor來發(fā)現(xiàn)并更新元信息并通知給所有的OSD節(jié)點(diǎn)。最自然的,我們可以想到讓中心節(jié)點(diǎn)Monitor保持與所有OSD節(jié)點(diǎn)之間頻繁的心跳,但如此一來,當(dāng)有成百上千的OSD節(jié)點(diǎn)時Monitor變會有比較大的壓力。之前在Ceph Monitor and Paxos中介紹過Ceph的設(shè)計思路是通過更智能的OSD和Client來減少對中心節(jié)點(diǎn)Monitor的壓力。同樣的,在節(jié)點(diǎn)的故障檢測方面也需要OSD和Monitor的配合完成。下面的介紹基于當(dāng)前***的11.0.0版本。
OSD之間心跳
屬于同一個pg的OSD我們稱之為伙伴OSD,他們會相互發(fā)送PING\PONG信息,并且記錄發(fā)送和接收的時間。OSD在cron中發(fā)現(xiàn)有伙伴OSD相應(yīng)超時后,會將其加入failure_queue隊列,等待后續(xù)匯報。
參數(shù):
osd_heartbeat_interval(6): 向伙伴OSD發(fā)送ping的時間間隔。實際會在這個基礎(chǔ)上加一個隨機(jī)時間來避免峰值。
osd_heartbeat_grace(20):多久沒有收到回復(fù)可以認(rèn)為對方已經(jīng)down
OSD向Monitor匯報伙伴OSD失效
1. OSD發(fā)送錯誤報告
- OSD周期性的檢查failure_queue中的伙伴OSD失敗信息;
- 向Monitor發(fā)送失效報告,并將失敗信息加入failure_pending隊列,然后將其從failure_queue移除;
- 收到來自failure_queue或者failure_pending中的OSD的心跳時,將其從兩個隊列中移除,并告知Monitor取消之前的失效報告;
- 當(dāng)發(fā)生與Monitor網(wǎng)絡(luò)重連時,會將failure_pending中的錯誤報告加回到failure_queue中,并再次發(fā)送給Monitor。
2. Monitor統(tǒng)計下線OSD
Monitor收集來自O(shè)SD的伙伴失效報告;
當(dāng)錯誤報告指向的OSD失效超過一定閾值,且有足夠多的OSD報告其失效時,將該OSD下線。
參數(shù):
osd_heartbeat_grace(20): 可以確認(rèn)OSD失效的時間閾值;
mon_osd_reporter_subtree_level(“host”):在哪一個級別上統(tǒng)計錯誤報告數(shù),默認(rèn)為host,即計數(shù)來自不同主機(jī)的osd報告
mon_osd_min_down_reporters(2): 最少需要多少來自不同的mon_osd_reporter_subtree_level的osd的錯誤報告
mon_osd_adjust_heartbeat_grace(true):在計算確認(rèn)OSD失效的時間閾值時,是否要考慮該OSD歷史上的延遲,因此失效的時間閾值通常會大于osd_heartbeat_grace指定的值
OSD到Monitor心跳
- OSD當(dāng)有pg狀態(tài)改變等事件發(fā)生,或達(dá)到一定的時間間隔后,會向Monitor發(fā)送MSG_PGSTATS消息,這里稱之為OSD到Monitor的心跳。
- Monitor收到消息,回復(fù)MSG_PGSTATSACK,并記錄心跳時間到last_osd_report。
- Monitor周期性的檢查所有OSD的last_osd_report,發(fā)現(xiàn)失效的節(jié)點(diǎn),并標(biāo)記為Down。
參數(shù):
mon_osd_report_timeout(900):多久沒有收到osd的匯報,Monitor會將其標(biāo)記為Down;
osd_mon_report_interval_max(600):OSD最久多長時間向Monitor匯報一次;
osd_mon_report_interval_min(5):OSD向Monitor匯報的最小時間間隔
總結(jié)
可以看出,Ceph中可以通過伙伴OSD匯報失效節(jié)點(diǎn)和Monitor統(tǒng)計來自O(shè)SD的心跳兩種方式發(fā)現(xiàn)OSD節(jié)點(diǎn)失效?;氐皆谖恼麻_頭提到的一個合格的故障檢測機(jī)制需要做到的幾點(diǎn),結(jié)合Ceph的實現(xiàn)方式來理解其設(shè)計思路。
- 及時:伙伴OSD可以在秒級發(fā)現(xiàn)節(jié)點(diǎn)失效并匯報Monitor,并在幾分鐘內(nèi)由Monitor將失效OSD下線。當(dāng)然,由于Ceph對一致性的要求,這個過程中客戶端寫入會不可避免的被阻塞;
- 適當(dāng)?shù)膲毫Γ河捎谟谢锇镺SD匯報機(jī)制,Monitor與OSD之間的心跳統(tǒng)計更像是一種保險措施,因此OSD向Monitor發(fā)送心跳的間隔可以長達(dá)600秒,Monitor的檢測閾值也可以長達(dá)900秒。Ceph實際上是將故障檢測過程中中心節(jié)點(diǎn)的壓力分散到所有的OSD上,以此提高中心節(jié)點(diǎn)Monitor的可靠性,進(jìn)而提高整個集群的可擴(kuò)展性;
- 容忍網(wǎng)絡(luò)抖動:Monitor收到OSD對其伙伴OSD的匯報后,并沒有馬上將目標(biāo)OSD下線,而是周期性的等待幾個條件:1,目標(biāo)OSD的失效時間大于通過固定量osd_heartbeat_grace和歷史網(wǎng)絡(luò)條件動態(tài)確定的閾值;2,來自不同主機(jī)的匯報達(dá)到mon_osd_min_down_reporters。3,滿足前兩個條件前失效匯報沒有被源OSD取消。
- 擴(kuò)散:作為中心節(jié)點(diǎn)的Monitor并沒有在更新OSDMap后嘗試廣播通知所有的OSD和Client,而是惰性的等待OSD和Client來獲取。以此來減少M(fèi)onitor壓力并簡化交互邏輯。
本文題目:從Ceph看分布式系統(tǒng)故障檢測
文章地址:http://m.5511xx.com/article/cdspcis.html


咨詢
建站咨詢
