聊聊SWIM Protocol

go4it發表於2019-05-02

本文主要研究一下SWIM Protocol

SWIM Protocol

SWIM的全稱是Scalable, Weakly-Consistent, Infection-Style, Processes Group Membership Protocol

heartbeats

傳統的諸如heartbeats這種membership protocols,每個node週期性地向網路中的所有其他節點傳送heartbeat來表示自己是alive的,如果peer超過指定interval沒有收到node的heartbeart則該node被認定為dead。這種方式適用於小型網路,其傳送的heartbeart數量為O(n^2),當網路中有成千上萬的node時則會造成巨大的網路負擔;SWIM採用Infection-Style dissemination來解決這個問題

tasks

與傳統的heartbeats相比,SWIM將整個過程分為Failure Detection及Membership update Dissemination兩個task

Completeness與Accuracy

對於failure detection來,有幾個衡量標準:

  • Completeness

是否每個failed node最終都會被檢測到

  • Speed of failure detection

一個node從failed到被檢測到failed的平均耗時

  • Accuracy

false positive rate,即一個node被誤判為failed的概率

  • Message Load

在檢測中每個node的network load是多少,是否均勻分佈

Unreliable Failure Detectors for Reliable Distributed Systems一文中指出對於非同步的網路來說,100%的Completeness與Accuracy無法同時保證,因而SWIM權衡之下選擇了Completeness,同時儘可能減少false positive rate以提升Accuracy

Failure Detection

聊聊SWIM Protocol
SWIM的failure detection過程分為兩個部分,一個是direct ping,一個是indirect ping

  • direct ping

local node從alive nodes中隨機選擇N個node來進行detect;如果direct ping中有的node沒有在timeout時間內返回ack則會進行indirect ping

  • 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

Membership update Dissemination可以將messages分為JOINED、FAILED兩類:

  • JOINED

當一個node加入到該網路時,需要通知其他node更新local membership新增該node

  • FAILED

當一個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

小結

  • SWIM的全稱是Scalable, Weakly-Consistent, Infection-Style, Processes Group Membership Protocol;與傳統的heartbeats相比,SWIM將整個過程分為Failure Detection及Membership update Dissemination兩個task
  • SWIM的failure detection過程分為兩個部分,一個是direct ping,一個是indirect ping
  • Infection-Style的方式進行dissemination,即利用Failure Detection的ping機制,將需要dissemination的訊息piggyback在ping/ack上,來實現類似gossip的訊息傳播,從而減少額外的單獨資訊傳遞開銷

doc

相關文章