分布式設計與開發------幾種必須了解的分布式算法

p4cf 9年前發布 | 18K 次閱讀 分布式 分布式/云計算/大數據

分布式設計與開發中有些疑難問題必須借助一些算法才能解決,比如分布式環境一致性問題,感覺以下分布式算法是必須了解的(隨著學習深入有待添加):

  • Paxos算法

    </li>

  • 一致性Hash算法

    </li> </ul>

    Paxos算法

    1)問題描述

    分 布式中有這么一個疑難問題,客戶端向一個分布式集群的服務端發出一系列更新數據的消息,由于分布式集群中的各個服務端節點是互為同步數據的,所以運行完客 戶端這系列消息指令后各服務端節點的數據應該是一致的,但由于網絡或其他原因,各個服務端節點接收到消息的序列可能不一致,最后導致各節點的數據不一致。 舉一個實例來說明這個問題,下面是客戶端與服務端的結構圖:

    分布式設計與開發------幾種必須了解的分布式算法

    當 client1、client2、client3分別發出消息指令A、B、C時,Server1~4由于網絡問題,接收到的消息序列就可能各不相同,這樣 就可能由于消息序列的不同導致Server1~4上的數據不一致。對于這么一個問題,在分布式環境中很難通過像單機里處理同步問題那么簡單,而Paxos 算法就是一種處理類似于以上數據不一致問題的方案。

    2)算法本身

    算法本身我就不進行完整的描述和推導,網上有大量的資料做了這個事情,但我學習以后感覺萊斯利·蘭伯特(Leslie Lamport,paxos算法的奠基人,此人現在在微軟研究院)的Paxos Made Simple 是 學習paxos最好的文檔,它并沒有像大多數算法文檔那樣搞一堆公式和數學符號在那里嚇唬人,而是用人類語言讓你搞清楚Paxos要解決什么問題,是如何 解決的。這里也借機抨擊一下那些學院派的研究者,要想讓別人認可你的成果,首先要學會怎樣讓大多數人樂于閱讀你的成果,而這個描述Paxos算法的文檔就 是我們學習的榜樣。

    言 歸正傳,透過Paxos算法的各個步驟和約束,其實它就是一個分布式的選舉算法,其目的就是要在一堆消息中通過選舉,使得消息的接收者或者執行者能達成一 致,按照一致的消息順序來執行。其實,以最簡單的想法來看,為了達到大伙執行相同序列的指令,完全可以通過串行來做,比如在分布式環境前加上一個FIFO 隊列來接收所有指令,然后所有服務節點按照隊列里的順序來執行。這個方法當然可以解決一致性問題,但它不符合分布式特性,如果這個隊列down掉或是不堪 重負這么辦?而Paxos的高明之處就在于允許各個client互不影響地向服務端發指令,大伙按照選舉的方式達成一致,這種方式具有分布式特性,容錯性 更好。

    說 到這個選舉算法本身,可以聯想一下現實社會中的選舉,一般說來都是得票者最多者獲勝,而Paxos算法是序列號更高者獲勝,并且當嘗試提交指令者被拒絕時 (說明它的指令所占有的序列號不是最高),它會重新以一個更好的序列參與再次選舉,通過各個提交者不斷參與選舉的方式,達到選出大伙公認的一個序列的目 的。也正是因為有這個不斷參與選舉的過程,所以Paxos規定了三種角色(proposer,acceptor,和 learner)和兩個階段(accept和learn),三種角色的具體職責和兩個階段的具體過程就見Paxos Made Simple ,另外一個國內的哥們寫了個不錯的PPT ,還通過動畫描述了paxos運行的過程。不過還是那句話不要一開始就陷入算法的細節中,一定要多想想設計這些游戲規則的初衷是什么。

    Paxos算法的最大優點在于它的限制比較少,它允許各個角色在各個階段的失敗和重復執行,這也是分布式環境下常有的事情,只要大伙按照規矩辦事即可,算法的本身保障了在錯誤發生時仍然得到一致的結果。

    3)算法的實現

    Paxos的實現有很多版本,最有名的就是google chubby ,不過看不了源碼。開源的實現可見libpaxos 。另外,ZooKeeper 也基于paxos解決數據一致性問題,也可以看看它是如果實現paxos的。

    4)適用場景

    弄清楚paxos的來龍去脈后,會發現它的適用場景非常多,Tim有篇blog《Paxos在大型系統中常見的應用場景》 專門談這個問題。我所見到的項目里,naming service是運用Paxos最廣的領域,具體應用可參考ZooKeeper

    一致性Hash算法

    1)問題描述

    分 布式常常用Hash算法來分布數據,當數據節點不變化時是非常好的,但當數據節點有增加或減少時,由于需要調整Hash算法里的模,導致所有數據得重新按 照新的模分布到各個節點中去。如果數據量龐大,這樣的工作常常是很難完成的。一致性Hash算法是基于Hash算法的優化,通過一些映射規則解決以上問題

    2)算法本身

    對于一致性Hash算法本身我也不做完整的闡述,有篇blog《一致性hash算法 - consistent hashing》 描述這個算法非常到位,我就不重復造輪子了。

    實 際上,在其他設計和開發領域我們也可以借鑒一致性Hash的思路,當一個映射或規則導致有難以維護的問題時,可以考慮更一步抽象這些映射或規則,通過規則 的變化使得最終數據的不變。一致性hash實際就是把以前點映射改為區段映射,使得數據節點變更后其他數據節點變動盡可能小。這個思路在操作系統對于存儲 問題上體現很多,比如操作系統為了更優化地利用存儲空間,區分了段、頁等不同緯度,加了很多映射規則,目的就是要通過靈活的規則避免物理變動的代價

    3)算法實現

    一致性Hash算法本身比較簡單,不過可以根據實際情況有很多改進的版本,其目的無非是兩點:

    • 節點變動后其他節點受影響盡可能小

      </li>

    • 節點變動后數據重新分配盡可能均衡

      </li> </ul>

      實現這個算法就技術本身來說沒多少難度和工作量,需要做的是建立起你所設計的映射關系,無需借助什么框架或工具,sourceforge上倒是有個項目libconhash ,可以參考一下

      以上兩個算法在我看來就算從不涉及算法的開發人員也需要了解的,算法其實就是一個策略,而在分布式環境常常需要我們設計一個策略來解決很多無法通過單純的技術搞定的難題,學習這些算法可以提供我們一些思路。

 本文由用戶 p4cf 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!