我有一个奇怪的复制问题。作为参考,我将 MySQL 5.5 与基于语句的复制一起使用。我们在站点 A / 网络 A 上有一个主站和从站,在站点 B / 网络 B 上有一个从站。
网络 A 上的一切都很好。问题发生在站点 B/网络 B 上连接到站点 A 主服务器的数据库上。
现在有几次我看到站点 B 的数据库上的复制停止了。如果我看一下SLAVE_IO_RUNNING
他们都说. 在所有程度上和目的上,一切对我来说都很好。但是,我的监控报告说我们运行的心跳事件落后了。就好像从站连接到主站,但没有接收到任何数据。SLAVE_SQL_RUNNING
SHOW SLAVE STATUS
yes
各种pos
值 ( read_master_log_pos
, relay_log_pos
, exec_master_log_pos
) 都是静止不动的。我还检查了其中一个的中继日志,那时传入的数据就停止了。
如果我同时查看主数据库和从数据库,则没有长时间运行的查询会导致这种情况。一切似乎都按预期运行,并且如前所述,站点 A 的从站都很好并且保持最新状态。
有问题的数据库都在运行不同的查询,所以它不是特定的查询令人不安的事情。
MySQL 的错误日志中没有任何内容。
我们模拟了一次短暂的网络故障(尽管从我们的监控中我们看不到这些时间有任何网络中断)并且数据库按预期工作。一旦网络重新连接,它们就会恢复复制。
这是通过运行来解决的stop slave; start slave;
,此时一切都继续进行,就好像什么都没发生过一样。
还有其他人遇到过类似的问题吗?或者可以阐明可能发生的事情。我的直觉是有一个非常短暂的网络中断,太短以至于监控无法捕捉到,但我不知道为什么这会扰乱 MySQL。
引起我注意的是“NETWORK”这个词。
Master 和 Slave 之间的通信是双向的。
根据MySQL 复制文档
鉴于此对复制的 I/O 方面的描述,您可以寻找什么???
防火墙
Master和Slave之间的连接需要打开防火墙。不幸的是,我曾见过防火墙在主服务器上打开而从服务器照常连接的情况。Slave 会让 I/O 线程显示在进程列表中,就像没有任何错误一样。大师也会这样做。突然间,60 秒后,I/O 线程从 Master 的进程列表中消失,但在 Slave 上仍然可见。
鉴于这种情况(我在两个不同的 AZ(可用区)中的两个 Amazon EC2 服务器之间目击),当时的解决方案是检查安全组并在从属 AZ 中打开端口 3306。
暂停
MySQL 有网络连接超时的设置
来自 MySQL 文档:
担忧
为什么要这样谈论网络???您可能会以数据漂移的形式成为受害者。回来
Jun 17, 2014
,我回答了我的任务是 Mysql Master-Master 复制的帖子?. 我简要提到网络是数据漂移中的无名英雄:你的实际问题
您运行
STOP SLAVE;
并START SLAVE
没有找到根本原因,但确实解决了手头的问题。如何 ???所有这一切都是断开 I/O 和 SQL 线程,然后从头开始重新连接。你也可以这样做
这也很好,特别是如果 SQL 线程很忙并且您不想中断它。
您将需要检查主站和从站之间的连接是否有丢包。
如果您的监控具有与 MySQL 超时值相同的时间粒度,那么当它确实发生时您没有任何提醒。您将不得不更频繁地轮询 MySQL。作为替代方案,您可能会创建某种 SNMP 设置来监视 MySQL,因此如果来自 SNMP 的信息没有及时更新,您可以检测到 MySQL 已关闭或没有响应,而无需连接到 MySQL。
我的回答可能没有完全说明根本原因,但我有两个建议:
建议 #1
查看您的max_allowed_packet设置。在 DBA StackExchange 中,我曾多次亲切地称呼 MySQL 数据包
the Silent Killer of DB Connections
。I/O 线程与 DB Connection 一样多。我会确保max_allowed_packet始终设置为 1073741824(即 1G)。建议#2
您可以手动设置 I/O 线程心跳。如何 ?
根据MySQL 5.5 文档
CHANGE MASTER TO
根据这些段落和slave_net_timeout的默认值(60 秒),I/O 线程似乎应该每 30 秒心跳一次。您可以像这样将心跳周期更改为 10 秒: