Consul使用gossip協議來管理成員和廣播消息到集群。所有這些都是通過使用Serf庫提供的。Serf使用的gossip協議基於“SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol”,有一些小的修改。更多關於Serf的協議細節見此文檔。
Consul中的Gossip
Consul使用兩個不同的gossip池。我們分別稱為LAN和WAN池。每個數據中心有一個LAN gossip池,它包含數據中心的所有成員——client和server。LAN池用於幾個目的:成員關系運行client自動發現server,減少配置量;分布式的故障檢測允許故障檢測的工作由整個集群承擔,而不是集中在少數server上;最后gossip池允許可靠和快速的事件廣播,比如leader選舉。
WAN池是全局唯一的,以為所有的server都應該加入WAN池,不論是哪個數據中心的。WAN池提供的成員關系允許server執行跨數據中心請求。集成的故障檢測允許Consul優雅的處理整個數據中心失聯,或者遠程數據中心只有一個server。
所有這些特征通過Serf提供。它被用來作為一個嵌入式的包來提供這些特征。從用戶的角度,這是不重要的,因為這些抽象應該被Consul屏蔽。然而這對於開發者理解這個包是如何應用是很有用的。
Lifeguard Enhancements
SWIM假設本地節點是健康的,在這個意義上軟實時處理數據包是可能的。然而,在本地節點正處於CPU或者網絡資源枯竭的情況下,這個假設就不成立了。結果就是serfHealth檢查狀態會偶爾的抖動,導致錯誤的報警,增加遙測噪聲,和簡單的導致整個集群浪費CPU和網絡資源來診斷一個可能並不真的存在的故障。
Lifeguard通過增加SWIM徹底解決了這個問題。Lifeguard的更多的細節請看Serf的gossip協議引導部分。