MySQL 同步 3 台伺服器數據的解決方案
我有 3 台伺服器,它們前面有一個負載均衡器,並將請求隨機發送到這些伺服器。
所有這 3 個伺服器中的腳本都是相同的,但是我需要在所有這些伺服器中同步數據庫,或者複製數據庫或您建議的任何內容,我不知道它的確切名稱!我聽說過很多事情:
- MySQL 複製(主-主)
- MySQL 複製(主從)
- MySQL 集群
- MySQL 複製(組複製)
- Percona 伺服器
- MySQL的傢伙
- 任何其他腳本,如這個 PHP 包或這個
這些有什麼區別?哪一個最適合我的情況?
這些是我的需求和考慮:
- 我有 3 個地理分佈的伺服器,我想同步它們。
- 我想使用 InnoDB(不喜歡使用 MySQL Cluster 的 NDB Cluster 引擎),我也有一些記憶體表,但使用記憶體表並不重要,我可以切換到 InnoDB。
- 我想要隱藏到應用層的東西,我想像以前一樣插入/選擇等等,而不改變我的任何程式碼行。
- 我想要一些主/主複製或同步,或者當我的每個主伺服器出現故障時不會發生任何故障,因此它必須具有自動節點故障檢測功能。
您能建議我一個解決方案,例如 percona 伺服器或其他任何東西嗎? 我想如果我選擇percona,我必須選擇Percona XtraDB Cluster,而不是普通的Percona Server!
您在這裡提出了一些很好的問題,但您正處於一個重要的十字路口,並且在實施後撤消架構錯誤非常困難且成本高昂。
您應該問自己的第一個問題是您真的需要多主拓撲嗎?大多數組織和應用程序在 MySQL 非同步複製中執行良好,在需要故障轉移時使用故障轉移腳本。
如果您認為多主拓撲是正確的選擇,則需要確認您的應用程序和要求是否合適。我已經看到了一個危險信號。
我有 3 個地理分佈的伺服器,我想同步它們。
使用 Group Replication (MySQL) 或 Galera(Percona XtraDB Cluster 和 MariaDB Cluster 使用)等多主解決方案的 WAN 複製具有類似的限制。如果您的應用程序可以容忍額外的延遲並且您的應用程序也不處理大型、長時間執行的寫入事務,則有一些解決方法。這將我們帶到了下一點……
我想要隱藏到應用層的東西,我想像以前一樣插入/選擇等等,而不改變我的任何程式碼行。
這對於多主數據庫解決方案並不總是可行的。您的應用程序與數據庫互動的方式對於數據庫層的成功至關重要。如果你的應用程式碼寫得不好,數據庫就會表現不佳。
我強烈建議您聯繫專家,幫助您設計適合您情況的理想解決方案。
完整披露:我為 Percona 工作,但其他供應商也可以在這裡提供幫助。
祝你好運!
Master-Slave 和 Master-Master 是較老的技術;它們有局限性,尤其是在從失敗的 Master 中恢復時。不推薦這些,因為有更好的方法。對於 3 個數據中心:S <- M -> S 或 M <-> M -> S,其中每個主/從位於不同的數據中心。
MySQL Cluster,又名 NDB Cluster,是一種特殊的動物。它不適合大多數人。
Galera Cluster,又名 Percona Cluster (PXC) 和 MariaDB Cluster,已經相當成熟且可用。
Group Replication,又名 InnoDB Cluster,是最新的產品。自甲骨文發明以來,它適用於 MySQL,而不是 MariaDB。
我還沒準備好說最後兩個(Galera vs Group Replication)中的哪一個是最好的。兩者都有以下特點:
- 幾乎同步。除了“關鍵讀取”之外,它是同步的。
- 最好至少有 3 個節點,在 3 個物理位置的每一個中都有一個(或多個)。這樣一來,如果一個數據中心變暗,集群仍然存在。
- 有各種代理/負載均衡器可以在節點之間分配查詢。這是一個“必要的”附加組件。(循環法通常是唯一需要考慮的算法。)
- 您在 LAN 中使用 HA。由於延遲增加,WAN 需要一些特殊的調整。
- 僅完全支持 InnoDB。MyISAM 和 MEMORY可能在特殊情況下工作。查詢記憶體不可用。您提到了使用 MEMORY 表來提高性能——我建議您在用盡其他技術之前不要這樣做。
這裡有一些與 Galera 打交道的技巧。(其中一些也適用於其他複製技術。)
我會選擇 PXC 或 MariaDB 集群。