改变奴隶主:
MysqL> change master to -> master_host = 'master.com',-> master_user = 'replica',-> master_password = 'password',-> master_port = 3306,-> MASTER_CONNECT_RETRY = 5,-> MASTER_RETRY_COUNT = 0,-> MASTER_AUTO_POSITION=1;
主配置文件:
[MysqLd] user = MysqL pid-file = /var/run/MysqLd/MysqLd.pid socket = /var/run/MysqLd/MysqLd.sock port = 3306 basedir = /usr datadir = /data/MysqL_data tmpdir = /tmp lc-messages-dir = /usr/share/MysqL skip-external-locking binlog-format = MIXED interactive_timeout=180 wait_timeout=180 key_buffer = 16M max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 8 myisam-recover = BACKUP max_connections = 300 query_cache_limit = 1M query_cache_size = 16M general_log = 1 log_error = /var/log/MysqL/error.log server-id = 1 log_bin = /var/log/MysqL/MysqL-bin.log log_bin_trust_function_creators = 1 log-slave-updates = true # enable GTID gtid-mode = on enforce-gtid-consistency = true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 binlog-checksum=CRC32 master-verify-checksum=1 expire_logs_days = 10 max_binlog_size = 100M
奴隶配置:
[MysqLd] user = MysqL pid-file = /var/run/MysqLd/MysqLd.pid socket = /var/run/MysqLd/MysqLd.sock port = 3306 basedir = /usr datadir = /data/MysqL_data tmpdir = /data/MysqL_data/tmp lc-messages-dir = /usr/share/MysqL skip-external-locking binlog-format = MIXED interactive_timeout=180 wait_timeout=180 key_buffer = 16M max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 8 myisam-recover = BACKUP max_connections = 100 query_cache_limit = 1M query_cache_size = 16M general_log = 1 log_error = /var/log/MysqL/error.log server-id = 2 log_bin = /var/log/MysqL/MysqL-bin.log log_bin_trust_function_creators = 1 log-slave-updates = true # enable GTID gtid-mode = on enforce-gtid-consistency = true sync-master-info=1 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 expire_logs_days = 10 max_binlog_size = 100M
我没有看到显示奴隶状态有任何问题,但问题仍然在打扰我.任何帮助都会提前感谢.
解决方法
SET GLOBAL SLAVE_NET_TIMEOUT = 60; STOP SLAVE; START SLAVE;
你是否正确怀疑这将解决问题,因为似乎没有发生超时……也不是你想要发生超时,但这应该仍然是解决方案.我会解释一下.
当复制似乎停顿而没有错误时,IO = Yes,sql = Yes,Seconds_Behind_Master = 0,这意味着挂起的复制连接.奴隶认为它是连通的,并认为没有新事件到来.
在MysqL本机异步复制中,从属设备负责启动与主服务器的连接,然后其角色变为被动 – 随着复制事件的发生,主服务器通过该连接自动将复制事件推送到从服务器,从服务器层启动7,没有做任何回应.当然,TCP确实如此,但主人和奴隶都没有意识到这一点.在复制事件发生之前,连接只是空闲,没有发生交互.只要双方都看不到TCP FIN或RST关闭连接,就会假设连接正常.
如果主站和从站通过任何以有状态方式处理TCP连接的设备(防火墙,NAT设备,EC2安全组)连接,则会在低流量时段发生故障 – 因为有状态通常意味着超时计时器.如果连接空闲时间过长,“网络”(我将用于将事物连接到其他东西的一般术语)将从其状态表中逐出连接 – 连接被“遗忘”.十五分钟是常见的价值.
当发生这样的超时时,除了简单地从其内部存储器结构中移除连接之外,网络通常什么都不做.电线上通常不会发生任何事情.假设连接的各方已经放弃它,或者流量已经移动到另一个网络,因此正在清除其连接内存的设备 – 没有主动尝试通知其他节点该连接不再是可行的.
然后,下次主机发送事件时,在超时失效后,网络可能会通过重置主机方向的“未知”连接而不是从机的方向进行响应,因为主机是启动数据包是“未知”连接的一部分.因此奴隶认为它有一个连接,而实际上管道的另一端没有任何东西.
设置slave_net_timeout
以明显和非显而易见的方式解决了这个问题.不明显的是我们特别感兴趣的那个,而显而易见的是我们的后备.
当从属设备连接到主设备时,它会要求主设备发送心跳消息.心跳是虚拟复制事件,实际上不会写入主机的binlog或从机的中继日志.它们仅在MASTER_HEARTBEAT_PERIOD
秒没有发生真正的复制事件时生成.
MASTER_HEARTBEAT_PERIOD,如果未使用CHANGE_MASTER_TO显式设置,则默认为slave_net_timeout / 2.
因此,设置slave_net_timeout对解决方案的非显而易见的贡献是主设备现在将主动发送流量以保持其他空闲连接,每30秒(60/2),并且后退是在60秒之后什么都没有,奴隶将自动断开连接并重新连接到主设备 – 实际上与停止和启动从设备相同 – 尽管如果连接完好无法发生这种情况,因为主设备将发送这些心跳作为需要.
如果这解决了您的问题,请记住您还需要通过更新my.cnf并重新启动服务器来对slave_net_timeout进行持久更改 – 否则设置将在下次服务器重新启动时恢复,并且MysqL 5.7之前的默认值为3600 .
或者,您可以简单地将MASTER_HEARTBEAT_PERIOD更改为较小的值,但这只能解决问题的一半.当连接确实失败时,从属设备会花费过多的时间来注意它.
不相关:请注意,MASTER_CONNECT_RETRY = 5太低了.你想要更高,或者奴隶可能在停电期间太快地放弃主人.