gossip是一種去中心化、容錯並保證最終一致性的協議。
gossip是為了解決分布式遇到的問題而設計的。由於服務和資料分布在不同的機器上,節點之間的每次互動都伴隨著網路延遲、網路故障等的效能問題。可見,分布式系統會比單機系統遇到更多的難題。
如cap理論 所描述的,cap三個因素在分布式的條件下只能滿足兩個。對於分布式系統來說,分割槽容忍性是其的基本要求。因為分布式系統的設計初衷就是利用集群多集的能力去處理單機無法解決的問題。分割槽容忍性(可擴充套件性)通過通過scale up和scale out實現的,也就是通過公升級硬體或者增加機器來提公升分布式系統的效能。這麼說,可擴充套件性和可用性是相關聯的。可擴充套件性好的系統,其可用性一般會比較高。所以分布式系統的所有問題基本都是在一致性和可用性之間進行協調和平衡。在工程實踐中的經驗如下:
一般來說,交易系統類的業務對一致性的要求比較高,一般會採用acid模型來保證資料的強一致性,所以其可用性和擴充套件性就比較差。而其他大多數業務系統一般不需要保證強一致性,只要最終一致就可以了,它們一般採用base模型,用最終一致性的思想來設計分布式系統,從而使得系統可以達到很高的可用性和擴充套件性。
一致性可以通過資訊在分布式環境下分發來保證,而分發的方式和速度則決定一致性的程度。從客戶端的角度來講:一致性包含三種狀態:強一致性、弱一致性、最終一致性(弱一致性的特例)。在下圖的一致性光譜中我們可以看出,弱一致性性是非同步冗餘,讀寫操作的響應更加快;而強一致性一般都是同步冗餘的,所以伴隨著效能的下降。
而最終一致性還有其他變種:因果一致性(有邏輯關係的操作能讀到更新值)、讀你所寫一致性(read-your-writes consistency,a使用者操作只保證自己的後續操作能讀到更新值)、會話一致性(保證整個會話期間的讀寫一致性)、單調一致性(單使用者的操作順序一致)。
前面提到gossip解決的問題就是在分布式環境下資訊高效分發的問題,這個問題的解決決定著系統的一致性程度。而gossip協議是基於一種叫做swim的協議( s calable w eakly-consistent i nfection-style process group m embership protocol)。swim是一種無中心的分布式協議,各個節點之間通過p2p實現資訊交流同步各節點狀態的方法。看名字也知道這是一種弱一致性的實現。
swim協議給每個程序組成員在本地維護乙個成員表,記錄該組存活的程序。該協議通過失效檢測器(failure detector)和傳播元件(dissemination component)來完成工作。
swim的失效檢測器會檢測失效的節點並將失效節點的更新資訊傳送給傳播元件。swim的傳播元件通過多播(multicast)的形式將失效資訊傳播給組內的其他成員。
協議的可擴充套件性體現在:新成員的加入和退出也以同樣的方式進行多播通訊。而在基本的時間週期內進行失效檢測能夠保證在限定的時間範圍內完成完備性檢查,即每個失效的程序都能最終被檢測到(最終一致性)。通過多播方式傳輸協議消的問題在於效率不好也不可靠,通過在ping和ack訊息中捎帶成員更新資訊能夠降低丟包率和減少傳輸時延。這種傳播方式被稱為可傳導的方式(infection-style)。
我們的辦公室八卦一般都是從一次交談開始,只要乙個人八卦一下,在有限的時間內辦公室的的人都會知道該八卦的資訊,這種方式也與病毒傳播類似。因此 gossip也有「病毒感染演算法」、「謠言傳播演算法」之稱。
在總數為n+1的人群中,被感染(infected)的人數初始化為1,並向周圍傳播。(乙個節點狀態發生變化,並向臨近節點傳送更新資訊)
在每個週期內總有未被感染(uninfected)的人轉變成被感染的人,方式委每個被感染的人隨機感染b個人。(對於節點狀態變化的資訊隨機傳送給b個節點,圖例中的b值為2)
經過足夠的時間,所有的人都會被感染。(隨著時間推移,資訊能夠傳達到所有的節點,下一節會進行簡單的證明)
可以看到,協議的核心內容就是節點通過將資訊隨機傳送到b個節點來完成本次資訊的傳播,其涉及到週期性、配對、互動模式。gossip的互動模式分為兩種:anti-entropy和rumor mongering。
每個節點維護乙個自己的資訊表,即屬性的值以及版本號;和乙個記錄其他節點的資訊表
>
。每個節點和系統中的某個節點相互配對成為peer。而節點的資訊交換方式主要有3種。
上述gossip為什麼能夠完成狀態的同步呢?我們對其做乙個簡單的分析。
我們以上一節的push模式gossip協議進行分析。
在n+1個節點的系統中,每個節點每次隨機向其他b個節點進行資訊通訊,即傳播速率:β=bnβ=bn。未獲得更新資訊的數量為x(初始為n),獲得更新資訊的節點數為y(初始為1)。
在連續時間過程中,x的變化速率dxdt=−βxydxdt=−βxy,即傳播速率 * 乘以 * 兩種型別節點之間可能傳播的次數。可以推導出火的更新資訊的節點數y=n+11+ne−β(n+1)ty=n+11+ne−β(n+1)t
而總時間為 t=clog(n)t=clog(n),即log(n)輪傳播乘以乙個常數時間。被感染的數量 y≈(n+1)−1ncb−2y≈(n+1)−1ncb−2。
那麼當c和b都是獨立於n的很小的數值時。gossip協議能夠保證:
這樣我們不僅證明了gossip的可靠性,並可以保證其在分布式系統應用的高可用性。注意的是,即使有的節點因宕機而重啟或者有新節點加入,但經過一段時間後,這些節點的狀態也會與其他節點達成一致。也就是說,gossip天然具有分布式容錯的優點。
除了改善swim協議中的多播方式,gossip還在很多地方有應用:
總之,gossip簡單、高效,同時具有很好的可擴充套件性和魯棒性,非常適合大規模、動態、資源受限的網路環境。
出處:
Gossip 協議詳解
gossip protocol 也叫 epidemic protocol 流行病協議 gossip protocol在1987年8月由施樂 帕洛阿爾托研究中心發表acm上的 epidemic algorithms for replicated database maintenance 中被提出。原本...
Gossip 協議詳解
gossip protocol 也叫 epidemic protocol 流行病協議 gossip protocol在1987年8月由施樂 帕洛阿爾托研究中心發表acm上的 epidemic algorithms for replicated database maintenance 中被提出。原本...
gossip協議的原理和實戰應用
先理解一下gossip協議 在乙個有界網路中,每個節點都隨機地與其他節點通訊,經過一番雜亂無章的通訊,最終所有節點的狀態都會達成一致。每個節點可能知道所有其他節點,也可能僅知道幾個鄰居節點,只要這些節可以通過網路連通,最終他們的狀態都是一致的,當然這也是疫情傳播的特點。簡單的描述下這個協議,首先要傳...