多主多区域MySQL集群

Opa*_*ium 6 mysql replication multi-master master-master-replication

我在全球多个地区托管一个应用程序(游戏)。性能对此应用程序至关重要,因为它是一款游戏,因此我需要在每个位置托管一个数据库实例来为本地应用程序实例提供服务。
由于我的应用程序的性质,我只能使用 MySQL。

我的主要要求是每个实例都是可写的。我知道在大多数情况下,当涉及到两台服务器修改同一条记录时,这在 MySQL 集群中是一个大问题。
然而,在我的应用程序中这实际上是不可能的;玩家在任何给定时刻只能连接到单个区域,这意味着只有该区域的数据库实例才会读取或写入该玩家的数据。一致性在这里也不重要,最终一致性可以满足我的需求。我只需要确保它最终到达那里。

我以前没有使用过复制,因此我需要一些指导。实现这一点的正确方法是什么?我将如何部署这样的集群?

dbd*_*mon 4

您可能需要在每个区域中使用MySQL InnoDB Cluster(来自 Oracle)或MariaDB Galera ClusterPercona XtraDB Cluster 等集群来实现高可用性。您可以写入集群中的任何节点,事务将自动复制到其他节点。请注意,Percona XtraDB Cluster 和 MariaDB Galera Cluster 都是基于 Galera 集群技术。Galera 还提供常规 MySQL 的库。

对于自动故障转移解决方案,您可能需要使用以下解决方案之一:

  1. 应用程序中的一个库,用于检测节点是否已关闭,如果是,则尝试使用集群中的另一个节点。例如,MariaDB 的 JDBC 驱动程序 - MariaDB Connector/J我相信它也适用于 Percona 和 MySQL。您需要配置连接器以使用集群。
  2. 每个集群/区域的数据库代理,例如ProxySQL(GPL)或MaxScale(BSL,但旧版本自动成为GPL - 目前最新的GPL版本是2.1)。数据库代理是数据库感知的:如果任何节点出现问题,它将将该节点标记为不可用,直到问题得到解决。

然后您可能希望在这些集群之间进行主主异步复制。主主异步复制简单来说就是设置从节点A到节点B的异步主从复制,同时也设置从节点B到节点A的异步主从复制。

请注意,如果存在两个节点写入相同行的风险,异步主主复制就会出现问题。关于该主题的许多教程也没有提到如何通过为每个节点设置不同的auto_increment_incrementauto_increment_offset值来避免许多冲突问题。

另请注意,由于延迟和不可靠的网络,集群内的地理分布式节点可能不是一个好主意,尽管 Galera 在其文档中似乎并不关心这个问题。

就我个人而言,我不想使用 MySQL 8.0,因为新的开发和发布模型存在固有的稳定性问题:主要的新功能现在在补丁版本 (8.0.x) 中引入。显然每个人都希望使用最新的补丁版本,因为它包含以前版本的错误和安全修复,但由于补丁版本还包含主要新功能,因此存在引入新错误的严重风险。我也不确定 MySQL 8.0 的非侵入式备份有哪些免费选项。(当然,如果您使用 MySQL Enterprise 许可证,则可以选择付费选项。)您也许可以使用 Percona Xtrabackup。

也可能有适合此用例的云 DBaaS 解决方案,例如 AWS RDS 或MariaDB 平台托管数据库服务。我不确定这在成本和功能方面如何比较,但它可能比我上面概述的更容易配置和管理。