2010-10-03 26 views
1

通過CAP theorem,這是不可能的distributed Erlang system同時提供所有三個以下保證的:分佈式Erlang和在CAP定理

  • 一致性(所有的Erlang運行時間,或節點,請參見在同一數據同一時間)
  • 可用性(節點故障不會妨礙倖存者持續經營)
  • 分區容忍性(系統繼續,儘管任意消息虧本經營)

分佈式Erlang系統可以支持,一個兩個的保證。

使用Erlang和OTP,每個保證如何實現?大多數分佈式Erlang應用程序爲A級和P級的更高級別做出了實際選擇,並解決了「最終一致性」問題。看來Erlang本身被設計爲支持分佈式(P),容錯(A),軟實時,不間斷的應用程序。

編程語言(Erlang),運行時系統(ERTS)和一組庫(OTP)用於構建分佈式容錯應用程序;我該如何做定義的分佈式容錯應用程序的三件事?

+5

您更新的問題,就像是說:「我有一把錘子,我怎麼能蓋房子,學校或寄宿學校?」你將得到的最佳答案將解釋CAP理論,但是實施細節很難給出一套簡單的指令。 – mikerobi 2010-10-03 18:28:50

+0

我明白了你的意思,但我認爲它更像是說:「我有一種編程語言,運行時系統和許多用於構建分佈式容錯應用程序的庫(Erlang/OTP)。 _define_分佈式容錯應用程序?「 – Rudiger 2010-10-04 16:37:55

+0

我沒有在Erlang中看到這個一致性項目符號。只是提到由於網絡延遲造成的mnesia及其問題。很多時候,我看到一個cluseter建立在隨機狀態的FSM上。分區T. - 同樣的。嘗試合併狀態或mnesia(拆分表),它通常是通過選擇主節點並在加入節點後轉儲另一半來完成的。矢量時鐘很容易實現。我最近做了它,但在測試中,他們在合併之前爆炸了真實數據。 – user425720 2010-10-04 20:07:45

回答

3

我發現的一個非常好的例子是Riak,這是一個基於Amazon的Dynamo並使用Erlang和OTP構建的分佈式鍵值存儲。 tunable CAP controls可讓您動態「選擇」您的一致性和可用性級別;它選擇專注於CAP的A和P,這使得它最終一致。 Riak是開源的,在線上有很多關於它的實現的好文章。

另一個很好的例子是Dynomite,PowerSet的Dynamo-clone-in-Erlang。雖然該項目已經死了一段時間,但它作爲一個有用的功能設計文檔,介紹如何構建Dynamo克隆。

這兩個項目本身基於亞馬遜的Dynamo,這是一個增量擴展的高可用性鍵值存儲系統。該技術旨在爲用戶提供在保持高可用性的同時權衡成本,一致性,耐用性和性能的能力。這篇論文是一個很好的閱讀。

5

編輯的清晰度

這取決於你的應用程序中,你實現它的設計,而不是平臺。您可以使用任何語言或平臺組合來實現任何2項擔保。

+0

Erlang既是編程語言又是運行時系統。一個分佈式的Erlang系統由許多相互通信的Erlang運行時系統組成。你的回答根本沒有幫助;我可以編寫一個分佈式系統,支持任何Turing tarpit中的兩個保證。 – Rudiger 2010-10-03 17:31:27

+0

@Rudiger,或許一個更好的答案會是它依賴於應用程序,會更清晰。 – mikerobi 2010-10-03 17:33:37

+0

+1 CAP定理與編程語言無關。 Rudiger與答案聯繫在一起,你不能同時擁有這些。開發人員可以選擇任意兩個應用程序。 – Jonas 2010-10-03 17:35:55

0

我認爲這個定理應該只在一層考慮。什麼是圖層?它類似於OSI-ISO層,但對於數據庫:應用程序/數據庫,操作系統,磁盤/硬件。所有CAP條件都不能滿足一個層次。 Erlang/OTP在應用程序層中運行,因此使用Erlang(由於Erlang的靈活性,您可以選擇其中的兩種)以及OS(即文件系統)或硬件層(raid)的最後一種封面。

+0

這不是CAP的工作原理... – Rudiger 2010-10-04 16:38:45

+0

爲什麼?我提出這個解釋是可以接受的可伸縮軟件中的新人。重點是:選擇兩個。無論是Erlang/OTP還是任何其他環境,它總是兩個。我喜歡像維度一樣考慮它,你只能覆蓋三個。 Riak聲稱每個請求都可調,但事實並非如此。爲了得到C,你需要有N = no_of_machines,所以你沒有P.定期N =某事,所以我們有P但沒有C.在這裏被授予。總是存在折衷。對我來說,CAP就像是一套要求,但事實是,沒有產品需要C&A&P。 – user425720 2010-10-04 20:01:12

0

愛爾蘭的實力應該與選擇A & P,但是與任何系統一樣,可以選擇任意兩個或更少。這部分是由於erlangs編程模型和所有通過消息傳遞的通信。如果您使用良好的Erlang風格,則不使用共享內存在進程之間進行通信。