多主多區域 MySQL 集群
我在全球多個地區託管應用程序(遊戲)。性能對這個應用程序至關重要,因為它是一款遊戲,因此我需要在每個位置託管一個數據庫實例,為本地應用程序實例提供服務。
由於我的應用程序的性質,我只能使用 MySQL。
我的主要要求是這些實例中的每一個都是可寫的。我知道在大多數情況下,當兩台伺服器修改同一條記錄時,這在 MySQL 集群中是一個大問題。
但是,在我的應用程序中,這實際上是不可能的;玩家只能在任何給定時刻連接到單個區域,這意味著只有該區域的數據庫實例才能讀取或寫入該玩家的數據。一致性在這裡也不是很重要,最終一致性可以滿足我的需求。我只需要確保它最終到達那裡。
我以前沒有使用過複製,因此我需要一些指導。實現這一點的正確方法是什麼,我將如何部署這樣的集群?
您可能需要在每個區域中使用MySQL InnoDB Cluster(來自 Oracle)或MariaDB Galera Cluster或Percona XtraDB Cluster等集群以實現高可用性。您可以寫入集群中的任何節點,事務將自動複製到其他節點。請注意,Percona XtraDB Cluster 和 MariaDB Galera Cluster 都是基於 Galera 集群技術的。Galera 還為正常 MySQL 提供庫。
對於自動故障轉移解決方案,您可能需要使用以下解決方案之一:
- 應用程序中的一個庫,用於檢測節點是否關閉,如果是,則嘗試使用集群中的另一個節點。這可以是 MariaDB 的 JDBC 驅動程序 - MariaDB 連接器/J,我相信它也適用於 Percona 和 MySQL。您需要將連接器配置為使用集群。
- 每個集群/區域的數據庫代理,例如 ProxySQL (GPL) 或 MaxScale (BSL,但舊版本自動成為 GPL - 目前最新的 GPL 版本是 2.1)。數據庫代理是數據庫感知的:如果任何節點出現問題,它將將該節點標記為不可用,直到問題得到解決。
然後您可能希望在這些集群之間進行主-主非同步複製。主-主非同步複製簡單來說就是你設置了從節點A到節點B的非同步主從複製,同時也設置了從節點B到節點A的非同步主從複製。
請注意,如果存在兩個節點寫入相同行的風險,非同步主-主複製是出了名的問題。許多關於該主題的教程也沒有提到如何通過為每個節點設置不同的auto_increment_increment和auto_increment_offset值來避免許多碰撞問題。
另請注意,由於延遲和不可靠的網路,集群內的地理分佈式節點**可能不是一個好主意,儘管 Galera 在其文件中似乎並不關心這個問題。
就個人而言,我不想使用 MySQL 8.0,因為新的開發和發布模型存在固有的穩定性問題:主要的新功能現在在更新檔版本 (8.0.x) 中引入。每個人顯然都想使用最新的更新檔版本,因為它包含以前版本的錯誤和安全修復,但由於更新檔版本還包含主要的新功能,因此存在引入新錯誤的嚴重風險。我也不確定您有哪些免費選項可用於 MySQL 8.0 的非侵入式備份。(當然,如果您使用 MySQL Enterprise 許可證,則有付費選項。)您可以使用 Percona Xtrabackup。
也有可能有針對此案例的雲 DBaaS 解決方案,例如 AWS RDS 或MariaDB 平台託管數據庫服務。我不確定這在成本和功能方面如何比較,但它可能比我上面概述的更容易配置和管理。