2014-01-23 60 views
1

我有一個非常具體的用例,因爲我對數據庫複製不太熟悉,所以我很樂意提供有關如何完成遵循最佳方式:數據庫複製:具有本地數據庫的多個地理位置,一個主遠程數據庫

  • Web應用程序+數據庫正在遠程服務器上運行。讓我們把這個設置R稱爲遠程。

  • 現在假設有3個獨立的地理位置需要對數據庫進行讀寫訪問。我會將這些位置稱爲L1,L2和L3。

的主要問題:遠程服務器可能不可用或位置可能並不總是有效,使遠程應用程序不可用的一個互聯網連接;但我們希望應用程序能夠作爲高可用性解決方案(現場)工作,即使在遠程服務器關閉或互聯網連接出現問題時也是如此。

部分解決方案:所以我想爲每個地理位置提供一個本地的Web應用程序副本服務器。 Web應用程序本身可以在需要時從版本控制系統自動更新(例如使用git鉤子)。

到目前爲止好......(至少我這麼認爲?)

但對於我們的數據?真的很棘手的部分似乎是數據庫複製。我們假設沒有DNS或IP故障轉移,並假設用戶首先嚐試直接訪問遠程服務器,如果這不起作用,用戶仍可以使用本地服務器而不是現場服務器。這一切都發生在網絡瀏覽器(或類似的客戶端)內。

一種可能(但不令人滿意)的解決方案是使用從R(主站)到L1,L2和L3(從站)的主從複製。當這樣做異步這應該是相當快?我認爲當主服務器損壞或無法訪問時,這是臨時本地只讀數據庫訪問的可行解決方案。

但是......讀寫支持怎麼樣?我想在這種情況下我們需要多主複製,但恐怕使用像MySQL Cluster或Galera之類的東西進行同步複製會減慢速度,尤其是因爲L1,L2和L3使用較低的帶寬連接。他們通過廣域網連接。 (另外,L1,L2或L3可能並不總是在線。)

真正的問題:您將如何解決這個特定的用例?目前我傾向於多主複製,如果它不會減慢太多事情。應用程序本身將主要由現場員工使用,但也由一些外部人員通過WAN使用。多主複製能夠很好地工作嗎?如果例如L1下降24小時並突然回到在線狀態呢?如果R無法訪問,該怎麼辦?

附加:不是我的主要問題,但我也需要通過SSL安全地發送同步數據,如果可能的話,請考慮到您的答案。

也許我還忘記了一些必要的細節;如果是這樣,請回復一些反饋,我會盡力相應地更新我的問題。

請注意,我還沒有確定數據庫,數據庫模式將從頭開始開發,因此也歡迎使用其他數據庫或數據庫引擎的想法。 (目前我對MySQL和PostgreSQL有最豐富的經驗)

回答

0

由於你還沒有確定,我強烈建議你看一下MS-SQL 合併複製。它強大,高度可靠,通過局域網和HTTPS(所謂的網絡複製)進行復制,而不是那麼昂貴。

術語不同於mySql Master \ Slave的想法。我們在這裏討論一個發佈者和多個訂閱者。在訂戶級別完成的所有更改都會收集併發送給發佈商,然後再重新分配給所有訂戶(如果需要,還可以選擇諸如「過濾訂閱」之類的奇特選項)。然後

標準架構將是:

  • 出版商,某處的服務器,它收集並重新分配用戶之間的變化上。發佈商可能不會被最終用戶訪問。
  • 其他數據庫訂戶服務器,用於本地或網絡訪問,與發佈者複製。訂戶被最終用戶訪問。

我們一直在使用這個架構裏,包括:

互聯網接入
  • 一個用戶
  • 一個用戶的內網接入用戶進行本地訪問的
  • 幾十:一些用戶都在我們的建築項目,在沙漠中的某個地方......

這樣的架構不可用「from the s helf「與MySQL。我想它可能會被構建,但它肯定比購買相應的MS-SQL許可證要昂貴得多。不要忘記,MS-SQL的免費SQLEXPRESS版本可以成爲用戶。

小心:如果您打算通過這樣的配置,我會(真的)強烈建議您將所有主鍵設置爲uniqueIdentifier數據類型,並隨機生成。這將避免典型的複製陷阱,其中PK的自動增量設置爲int,獨立服務器在兩次複製之間生成相同的主鍵(MS-SQL提出了一種避免此類問題的工具,您可以在其中分配每個服務器的PK範圍,但這個解決方案是一個真正的PITA ...)。

相關問題