从服务器离线并重新上线后,MySQL 复制挂起

从服务器离线并重新上线后,MySQL 复制挂起

我有一台主服务器和多台从服务器,它们复制单个数据库。我在 SLES 11 中使用 MySQL 5.0。在容错测试期间,我发现当从服务器的网络连接中断(电缆拔出)然后恢复时,复制会挂起。它没有显示任何错误,从服务器似乎正在运行,但和值与Read_Master_Log_PosExec_Master_Log_Pos服务器上的日志位置不匹配。

Slave_IO_State“等待主机发送事件”。

Slave_IO_RunningSlave_SQL_Running都是“是”。

Master_Log_File匹配Relay_Master_Log_File

如果我停止并启动从属服务器或者重新启动 mysql 守护程序,则复制将再次开始工作。

对于我能做些什么,您有什么想法吗?

答案1

当 MySQL 从属服务器连接到主服务器时,它会请求二进制日志流,并且主服务器会在二进制日志事件发生时自动发送它们,除非您使用半同步复制,否则无需从属服务器进行确认。

除了 TCP 堆栈处理的低级确认之外,从属设备不会发起任何流量。连接中断(在堆栈的各个层,不限于拔出电缆)可能导致连接以多种方式中断,包括主设备的 TCP 堆栈由于超时或 ICMP 不可达消息而断开连接,或者机器之间的状态防火墙“忘记”了 TCP 会话并默默地丢弃后续数据包,而从属设备则静静地等待主设备发送的下一个数据包。

这里的解决方案是全局变量slave_net_timeout

在从属服务器认为连接中断、中止读取并尝试重新连接之前,等待来自主服务器的更多数据的秒数。

这是在从服务器上配置的。当从服务器连接到主服务器时,在请求二进制日志流之前,它会要求主服务器发送心跳事件,这些事件的格式与二进制日志事件类似,并且像主服务器的二进制日志中的下一个事件一样进行流式传输,但实际上不会增加​​二进制日志位置计数器。它们在正常操作中基本上是零开销,因为除非主服务器没有为从服务器slave_net_timeout设置的一半生成新的二进制日志事件(默认值;或您可以在期间配置的其他值) ,否则不会发送它们CHANGE MASTER TO),因此心跳事件实际上仅在流量非常少时才会生成……所以据我所知,将此值设置得低至几秒钟不会造成任何实际危害。

如果从属设备发现超时已到期,它将关闭其连接并重新连接到主设备。

万一主服务器没有意识到从服务器已经离开,当从服务器重新连接时,主服务器将关闭原始连接,因为 MySQL 主服务器在接受新的从服务器连接时,会检查另一个具有相同连接的从服务器是否server_id已连接,如果是,则断开原始连接。顺便说一句,这就是为什么两个配置相同的从服务器server_id(不支持的配置)无法成功保持与同一主服务器的连接的原因——只要其中一个连接,就会导致另一个被撞,然后循环随之而来,每个从服务器都会强制断开另一个从服务器的连接。

在 my.cnf 中将此变量设置为适当的低值并重新启动从属服务器应该可以解决此问题。

相关内容