无需虚拟 IP 的高可用性 Mysql

无需虚拟 IP 的高可用性 Mysql

我正在尝试为我们的生产系统在 mysql 级别设计一个简单的高可用性系统。从我目前所读到的内容来看,最好的解决方案是设置主主复制。不幸的是,我们不能使用虚拟 IP,所以我认为像 MMM 这样的脚本不能按原样使用。

建议的解决方案是通过 haproxy 等连接到 mysql,这将“保证”一次只写入一个主服务器。我找不到有关此配置的太多信息 - 与通常的基于虚拟 ip 的配置相比,其优点/缺点是什么?

答案1

如果您正在使用 Zeus 等负载均衡器,则可以在负载均衡器中创建一个 DBVIP,并将其分配给 MySQL 主服务器的 IP。然后,将 DBVIP 的调度分配给轮询加权轮询或负载均衡器定义的其他方法。

既然我们在谈论 MySQL,请确保您真正使用了多主框架。

首先,确保你使用

/etc/my.cnf对于 Master1

server_id=1
auto_increment_increment=10
auto_increment_offset=1

/etc/my.cnf对于 Master2

server_id=2
auto_increment_increment=10
auto_increment_offset=2

然后,确保在任一主数据库中查询记录时,不要使用 auto_increment 值来查询数据。为什么?

从上面给出的配置来看,Master1 的表的 auto_increment 值的最后一位数字为 1。Master2 的表的 auto_increment 值的最后一位数字为 2。

如果您的 SELECT 子句有 WHERE id = 11,则该 SELECT 只能从 Master1 中检索。

您必须制定以下基本规则:

基本规则 #1
所有以 auto_increment 值为 PRIMARY KEY 的表都将具有一个额外的 UNIQUE KEY 来检索所需数据。该 UNIQUE KEY 在 Master1 和 Master2 上必须相同。

基本规则 #2
所有以 auto_increment 值为 PRIMARY KEY 的表,如果不能有额外的 UNIQUE KEY 来检索所需的数据,则必须使用 SELECT 语句的应用程序来设置 WHERE 子句,以协商选择作为 PRIMARY KEY 的值,从而能够检索所需的行(例如:如果插入数据的服务器上的 server_id 为 2,则必须从代码中获取 ID,减去 MOD(ID,10),然后添加 auto_increment_offset。然后,就可以调用 SELECT)。

如果两条规则都无法遵循,则必须从多主复制拓扑切换到另一个复制拓扑。

相关内容