使用 MySQL 複製的分佈式數據庫架構
我的任務是為所有使用我們的服務進行本地化的國家/地區的網路伺服器遷移到雲端。
問題是,它們必須共享相同的數據,因此我需要設置一些在本地讀取/寫入但在其他伺服器之間共享的數據庫架構。
我找到了一篇幾乎是我想做的文章。下面的例子。
http://www.compassitesinc.com/blogs/distributed-database-architecture-using-mysql-replication/
但是我的 DBA 說這是不可能的。所以我的問題是,這可能嗎?如果是這樣,怎麼辦?
我們是一家 LAMP 商店(Redhat、Apache、PHP5、MySql 5.5)。
謝謝你。
比爾卡爾文已經給出了我能想到的最佳答案……但我認為一些額外的解釋可能是為了解釋為什麼你在原始問題中發布的連結可能沒有提供足夠的解決方案。
您的 DBA 至少在某種意義上是正確的。問題是插圖具有欺騙性。中間的三個分佈式節點看起來像是向主伺服器發送更新的數據庫伺服器,這是 MySQL 無法真正提供的。您會注意到這 3 個節點實際上被標記為“Web 伺服器”。
從配置範例中可以明顯看出,此設置中的所有 MySQL 從屬實例都在為應用程序提供對主數據庫的本地副本的只讀訪問權限,但 Web(應用程序)伺服器實際上將其所有寫入發送回到主數據庫——而不是到本地 MySQL 實例。
這就是 MySQL 可以做的——擴展您從非同步副本讀取的能力。您不太可能希望應用程序寫入數據庫的能力依賴於文件包含的單點故障。是的,您可以有多個主伺服器,但是根據應用程序的工作方式,一次只將寫入定向到一個這樣的主伺服器是安全的,因為在多主非同步(普通 MySQL)複製中沒有規定來處理數據衝突時的情況從兩個(或多個)主控器同時寫入。
集群配置中的 PXC 和 MariaDB 沒有同樣的問題,因為集群節點不會非同步操作……雖然有一個不同的問題,因為如果一個節點與其他兩個節點隔離,則無法寫入,因為在網路分裂的情況下,少數伺服器將不接受寫入(以避免不一致)。如果他們每個人都與其他人隔離,那麼他們都不會工作,因為他們都是少數人,不知道他們的同齡人發生了什麼。這並不是說它不是一個很好的解決方案——它只是不是一個完美的解決方案。
但是沒有完美的解決方案。
如果您的數據符合以下條件,那麼還有第三種方法。這將是一個場景,其中每個站點都有自己的一組唯一命名的架構+表集(即,table_schema + table_name 對於每個站點都是唯一的,如果數據庫名稱不同,表名可能相同)被寫入,但需要能夠從其他站點讀取數據。
可以配置MariaDB 多源複製,這樣您就有一個中央伺服器,該伺服器被配置為所有伺服器的從屬遠端伺服器,並作為所有遠端伺服器的主伺服器。這個中央伺服器接收到的每個複制事件都將被寫入二進制日誌並發送到所有遠端伺服器,這些遠端伺服器將在本地執行它。遙控器將記錄其本地更改,將複製事件發送回主伺服器以分發給所有其他遙控器……有點像中心輻射型配置。中央伺服器只會整合數據,它不會被應用程序的實例使用……遠端伺服器甚至不一定必須是 MariaDB——只有中央伺服器——我有 MySQL 5.5 和MariaDB 10.0 系統相互連接並相互複製(5.5 <-> 10.0),在我的操作中沒有問題。“輻條”伺服器的目前限制為 64。
但同樣,這僅在每個站點需要查看但不更改來自其他站點的數據和/或在更新唯一命名的本地表集時訪問一組公共只讀數據時才實用。在這種情況下,站點的隔離只會延遲他們從本地環境外部訪問最新數據,但不會影響他們寫入他們應該能夠寫入的內容的能力。
我們將創建 3 個節點集群,節點分佈在不同的大陸(歐洲、美國、日本),每個節點都將接受寫入查詢。
使用的解決方案是Percona XtraDB Cluster。