2014-02-20 30 views
0

我們正在創建一個應用程序,其中將有一個主服務器,但是我們的客戶端也會在辦公室中有一臺服務器,可能會失去與主服務器的連接。我們正在研究如何配置MySQL,以便1)通常通過互聯網寫入主文件,而從服務器只是被動地下拉2)如果連接失去與互聯網/外部世界,讀寫在本地服務器在辦公室有權訪問,3)當連接恢復時,同步完成工作完美羣集mysql服務器在cnx丟失後重新同步

一個小問題是,可能有2個或3個這些從服務器,所以同步已對多個服務器足夠強大。

請考慮在網絡連接斷開之前,您有三臺帶有100個記錄的聯繫人表的服務器。在最複雜的情​​況下,所有3個位置都會添加一條新記錄。重新連接過程將識別記錄不相同,並且在完成該過程之後,每個表將具有103個記錄,並且主鍵被重新排序!

添加到外鍵的級聯更新 - 關於在哪裏向正確的方向前進的任何建議?我正在考慮爲此編寫一個PHP例程,但不想重新發明輪子。

謝謝!

回答

0

這從根本上將成爲一個非常困難的設計,測試和維護架構。我會強烈建議您重新考慮分區容差(特別是允許寫入未連接到主數據庫的數據庫的能力)是否需要用於您的設計。

如果這是絕對必要的,有幾個陷阱,你將需要處理包括:

  • 您需要停止使用AUTO_INCREMENT主鍵完全,因爲它幾乎是不可能的後安全地同步他們因爲同一個密鑰可能已被多個服務器使用,並且密鑰可能存在於事後不能更新的位置(例如,在URL中!)。通過使用每個服務器的偏移量(例如,服務器A使用ID 100,200,300,服務器B使用101,201,301等)或通過使用GUID主鍵來生成主鍵,以便根本不會發生衝突。

    請注意,GUID主鍵對MySQL服務器性能有明顯的負面影響,因爲它們使索引變得非常混亂。謹慎行事。

  • 如果您認爲將更新同步到數據庫很困難,那麼處理更新和刪除操作將使其看起來比較簡單。一種解決方法可能是避免更新和完全刪除 - 將每個表格視爲「日誌」,每當對象的狀態發生變化時(包括刪除時)插入一個新行,並將最近一行的標識符視爲「當前狀態」。這將使得對數據庫進行任何類型的關係操作基本上是不可能的(因爲在這樣的表上執行任何有用的JOIN都非常困難!),但它至少可以簡化同步的任務。

    如果這是不可能的,情況開始看起來相當嚴峻。當網絡沒有完全連接時,您最終可能需要維護所做的所有更改的日誌,並在每次重新連接服務器時協調這些日誌。這可能不會很好地擴展。

    請記住,任何自動衝突解決方案都可能導致一些數據丟失或意外結果。特別是,如果記錄的單個字段由網絡拆分的兩側更新,則您的同步工具將需要選擇一個新值來「獲勝」,或者以某種方式合併這些值。根據這個領域是什麼以及它代表什麼,這可能是非常困難的,甚至是不可能的。 (對於一個特別糟糕的例子,考慮一下,如果一個字段代表用戶的銀行賬戶餘額發生了什麼,並在一側更新的同步丟失!)

如果這些主題在所有你的興趣,你可能想研究一些基礎理論。幾個特別感興趣的概念將是:

  • CAP theorem,它基本上說,不可能沒有妥協的容錯系統。
  • Vector clocks,這是同步分佈式系統中單個對象更改的一種方法,這將緩解您嘗試調試此係統時的痛苦。

TL; DR:分區公差很難。真的很難。如果可能的話,避免處理它。

相關問題