本文主要研究一下SWIM Protocolhtml
SWIM的全稱是Scalable, Weakly-Consistent, Infection-Style, Processes Group Membership Protocolnode
傳統的諸如heartbeats這種membership protocols,每一個node週期性地向網絡中的全部其餘節點發送heartbeat來表示本身是alive的,若是peer超過指定interval沒有收到node的heartbeart則該node被認定爲dead。這種方式適用於小型網絡,其發送的heartbeart數量爲O(n^2),當網絡中有成千上萬的node時則會形成巨大的網絡負擔;SWIM採用Infection-Style dissemination來解決這個問題git
與傳統的heartbeats相比,SWIM將整個過程分爲Failure Detection及Membership update Dissemination兩個taskgithub
對於failure detection來,有幾個衡量標準:網絡
是否每一個failed node最終都會被檢測到dom
一個node從failed到被檢測到failed的平均耗時異步
false positive rate,即一個node被誤判爲failed的機率wordpress
在檢測中每一個node的network load是多少,是否均勻分佈ui
Unreliable Failure Detectors for Reliable Distributed Systems一文中指出對於異步的網絡來講,100%的Completeness與Accuracy沒法同時保證,於是SWIM權衡之下選擇了Completeness,同時儘量減小false positive rate以提高Accuracyscala
SWIM的failure detection過程分爲兩個部分,一個是direct ping,一個是indirect ping
local node從alive nodes中隨機選擇N個node來進行detect;若是direct ping中有的node沒有在timeout時間內返回ack則會進行indirect ping
local node從alive nodes中隨機選擇K個node來對direct ping目標node進行indetect ping,這K個node會把結果forwards給這個local node,最後local node檢查若是這個K個node沒有一個返回ack,則將該目標node標記爲failed,而後經過Membership update Dissemination將該node的FAILED信息傳播到網絡中的其餘node
Membership update Dissemination能夠將messages分爲JOINED、FAILED兩類:
當一個node加入到該網絡時,須要通知其餘node更新local membership新增該node
當一個node被檢測爲failed時,須要通知其餘node更新local membership移除該node
這個過程可使用multicast來實現
Infection-Style Dissemination multicast實現的Dissemination是不可靠的並且低效的,一個更加robust版本的SWIM採用Infection-Style的方式進行dissemination,即利用Failure Detection的ping機制,將須要dissemination的消息piggyback在ping/ack上,來實現相似gossip的消息傳播,從而減小額外的單獨信息傳遞開銷
Suspicion Mechanism 爲了更好地減小false positive rate以提高Accuracy,能夠引入Suspicion Mechanism,即當local node檢測到該node failed時將其標記爲suspected;被標記爲suspected的node在最終被確認爲failed以前被當作是alive;其餘node若是檢測到該node是alive則對該node取消suspected,恢復alive;若是在指定時間該node沒有被恢復爲alive則被標記爲failed
Time bound failure detection 隨機選擇node進行ping可能會形成必定的延時,可使用round robin的方式來取代隨機選擇,當全部node都選擇過了以後再從新shuffle該node list