MySQL 多级复制不断中断

MySQL 多级复制不断中断

我的复制设置如下

Master A ----> Slave B ------> Slave C
     \-------> Slave D
      \------> Slave E - H

我使用此设置是因为我需要在办公室服务器(即从服务器 C)上有一个本地副本。我不想给主服务器 A 增加额外的负担,因为它已经从从服务器连接中接收了所有插入和额外负载。

所以我设置了多级复制。主服务器 A 复制到从服务器 B,而从服务器 B 又是从服务器 C 的主服务器。

从 A 到 B 的复制运行正常。从 B 到 C 的复制不断出现“重复键”错误。我在服务器 B 中启用了中继日志,以启用从 B 到 C 的复制。

以前有人遇到过这个问题吗?

Master/Slave B的my.cnf如下:

# Replication setup
log-bin=/var/log/mysql/mysql-bin
server-id=2
sync_binlog=0
binlog_format=mixed
log-slave-updates
replicate-same-server-id = 0
expire_logs_days=15

我做错什么了吗?

答案1

如果您收到重复键错误,则说明有东西正在写入从属 C(可能),或者您正在主服务器上执行非确定性插入/更新操作,而这些操作在 MIXED 格式下无法很好地复制(不太可能)。设置 sync_binlog=0 可能会给您带来一些问题,但这些问题可能很少见,并且只会在服务器崩溃时发生。如果确实是非确定性查询导致了问题,您可能需要考虑 binlog_format=ROW。

无论如何,首先您需要处理数据同步。最简单的方法是从 B 的新备份开始,并确保将 MASTER 更改为正确的二进制日志坐标。如果无法从备份中恢复,那么您可以使用 maatkit.org 上的 mk-table-sync 等工具进行调查。不过,这是一个复杂的工具,如果您不处理 TB 级的数据,我会选择最近的备份。

然后,确保在 my.cnf 中将 C 设置为 read_only,并使用

[mysqld]
read_only

并在服务器上运行它

SET GLOBAL read_only=1;

但是,请记住 read_only 不适用于具有 SUPER 权限的用户,因此请确保除 root 用户之外没有人具有该访问权限,并且您正在使用非特权用户来查询数据库。

老实说,如果只有 7 个从服务器,我会跳过多层设置的复杂性,只将其保持在一个级别。每个从服务器的开销并不昂贵,除非您处理主服务器上非常慢的网络连接。您有证据表明将二进制日志流式传输到从服务器会导致性能下降吗?

答案2

我支持在从服务器上使用 read_only。这至少是一种健全性检查。您确定 server_id 都不同吗?显示实际的重复键错误也可能有帮助(如果可以的话)。C 或 B 上可能存在一些杂散触发器吗?调查生成错误的表。主服务器上有多少个数据库?它们都复制了吗?

相关内容