早期 es 版本有 split brain 問題,俗稱腦裂。ES 採用的是一種 P2P 的 gossip 選舉方式,Gossip 算法由於 Cassandra 而名聲大噪。
背景:
Gossip 算法, 靈感來自辦公室八卦, 只要一我的八卦一下, 在有限的時間內全部人都會知道該八卦的信息,
這種方式也與病毒傳播相似, 由於 Gossip 有衆多的別名"閒話算法"、"疫情傳播算法"、"病毒感染算法"、"謠言傳播(Rumor-Mongering)算法".
但 Gossip 並非一個新東西, 以前的泛洪查找、路由算法都歸屬於這個範疇, 不一樣的是 Gossip 給這類算法提供了明確的語義、具體實施方法及收斂性證實.
特色:
Gossip 算法又被稱爲反熵(Anti-Entropy), 熵是物理學上的一個概念, 表明雜亂無章, 而反熵就是在雜亂無章中尋求一致,
這充分說明了 Gossip 的特色:在一個有界網絡中, 每一個節點都隨機地與其餘節點通訊, 通過一番雜亂無章的通訊,
最終全部節點的狀態都會達成一致. 每一個節點可能知道全部其餘節點, 也可能僅知道幾個鄰居節點,
只要這些節能夠經過網絡連通, 最終他們的狀態都是一致的, 固然這也是疫情傳播的特色.
要注意到的一點是, 即便有的節點因宕機而重啓, 有新節點加入, 但通過一段時間後,
這些節點的狀態也會與其餘節點達成一致, 也就是說, Gossip 自然具備分佈式容錯的優勢.
本質:
Gossip 是一個帶冗餘的容錯算法, 更進一步, Gossip 是一個最終一致性算法。
雖然沒法保證在某個時刻全部節點狀態一致, 但能夠保證在」最終「全部節點一致, 」最終「是一個現實中存在, 但理論上沒法證實的時間點。
由於 Gossip 不要求節點知道全部其餘節點, 所以又具備去中心化的特色, 節點之間徹底對等, 不須要任何的中心節點。
實際上 Gossip 能夠用於衆多能接受「最終一致性」的領域:失敗檢測、路由同步、Pub/Sub、動態負載均衡。
但 Gossip 的缺點也很明顯, 冗餘通訊會對網路帶寬、CPU 資源形成很大的負載, 而這些負載又受限於通訊頻率, 該頻率又影響着算法收斂的速度。
總結:
Gossip 是一種去中心化、容錯而又最終一致性的絕妙算法, 其收斂性不但獲得證實還具備指數級的收斂速度。
使用 Gossip 的系統能夠很容易的把 Server 擴展到更多的節點, 知足彈性擴展垂手可得。
惟一的缺點是收斂是最終一致性, 不適應那些強一致性的場景, 好比 2PC。算法