2012-10-11 14 views
2

什麼是保持多個文件一致性的好算法?在網絡中的多個文件之間保持一致性的好算法是什麼?

這是一個學校項目。我必須在C中實現一些跨網絡的複製。

我有2個服務器,

服務器A1 服務器A2

兩個服務器都有自己的所謂 「data.txt中」

如果我寫的東西給他們中的一個,我自己的文件需要更新另一個。

我還有另一種場景,有3個服務器。

服務器B1 服務器B2 服務器B3

我需要這些並做幾乎相同。

雖然這將是相當簡單的實施。如果一臺或兩臺服務器停機,當恢復時,他們將不得不更新自己。

我相信有算法可以有效地解決這個問題。我知道我想要什麼,我只是不知道我在找什麼!

請問有人能指點我正確的方向嗎?

謝謝!

回答

2

的根本問題在這裏被稱爲「CAP theorem」,它定義了三個屬性,分佈式系統可以有:

  • 一致性:從系統中讀取數據總是返回最先進的最新數據。
  • 可用性:每個響應成功或失敗(不會一直等到事情恢復)
  • 分區容錯:系統可以在其服務器無法相互通信時運行(服務器關閉是一種特殊這種情況下)

CAP定理說,你只能有兩個這些。如果您的系統一致並且分區容錯,那麼它會丟失可用性條件 - 您可能必須等待分區才能得到響應,然後才能得到響應。如果您擁有一致性和可用性,那麼當有分區時,或者有足夠的服務器停機時,您將會停機。如果您有可用性和分區容錯,則可能會讀取陳舊的數據,或者必須處理衝突的寫入。

注意,這分別應用之間的讀取和寫入 - 你可以有一個可用的和分區容錯系統進行讀取,但一致的和可用的系統進行寫入。這基本上是一個主從系統;在分區中,寫入操作可能會失敗(如果它們位於分區的錯誤一側),但讀取操作將會起作用(儘管它們可能會返回過時的數據)。

所以,如果你想對可讀和分區容忍讀取,一個簡單的選擇是隻指定一個主機作爲唯一一個可以寫入並同步的主機(例如,使用cron腳本中的rsync或其他 - 在您的C項目中,您只需使用一些簡單的網絡代碼定期複製文件,然後在修改文件後再執行一次額外的複製)。

如果你需要寫分區容忍性,但是,它的更復雜。你可以讓兩臺服務器不能相互通信,都要寫入數據,並且稍後必須弄清楚數據取勝的原因。這基本上意味着您需要在同步時比較兩個版本並決定勝出。這可以只是簡單的「讓最高時間戳取勝」,或者你可以使用向量時鐘作爲Dynamo實施更加複雜的政策 - 這是適合在這裏取決於你的應用。

+0

如果你存儲的更新,必須注意在腦裂情況下會發生什麼 - 確保你的系統繼續滿足您的一致性約束,即使你有這些掛起的更新緩衝區。分佈式算法是不平凡的極端:)你也可能會有所幫助閱讀:http://en.wikipedia.org/wiki/Paxos_(computer_science) – bdonlan

0

隨着每次寫入服務器A,分叉一個進程將相同的內容寫入服務器B. 這樣,所有寫入服務器A的寫入都會複製到服務器B.如果您有多個服務器,請將分叉進程跨所有備份服務器進行寫入。

相關問題