MySQL主从同步机制与同步延时问题追查过程
MySQL主从同步机制与同步延时问题追查过程
前⾔
作为⼀名DBA,在⼯作中会经常遇到⼀些MySQL主从同步延迟的问题,这些同步慢的问题,其实原因⾮常多,可能是因为主从的⽹络问题导致,可能是因为⽹络带宽问题导致,可能是因为⼤事务导致,也可能是因为单线程复制导致的延迟。
今天遇到⼀个问题,Mysql持续报错,主从同步延时数过⼤或错误。所以这篇⽂章给⼤家分享下主从同步的机制原理以及问题排查思路。
故障表现
最直观的表现为:
mysql> show slave status\G;
// 状态⼀
Seconds_Behind_Master: NULL
/
/ 状态⼆
Seconds_Behind_Master: 0
// 状态三
Seconds_Behind_Master: 79
连续查询,⼤部分时间该属性值=0,偶发性出现Null或者79等延时值。导致观察主从同步延时的监控持续报警。
故障原因及解决⽅案
撩到对象流黄水的污句子多台备机的server-id⼀致,导致主机⽆法长时间同某⼀台备机连接,进⽽⽆法正常同步。
修改server-id后,重启数据库恢复。
主从同步机制
MySQL的主从同步,⼜称为复制(replication),是⼀种内置的⾼可⽤⾼性能集解决⽅案,主要功能有:
数据分布:同步不需要很⼤带宽,可以实现多数据中⼼复制数据。
读取的负载均衡:通过服务器集,可以通过DNS轮询、Linux LVS等GSLB(全局负载均衡)⽅式,降低主服务器的读压⼒。
数据库备份:复制是备份的⼀部分,但并不能代替备份。还需要与快照相结合。
⾼可⽤性和故障转移:从服务器可以快速切换为主服务器,减少故障的停机时间和恢复时间。
主从同步分为3步:
1. 主服务器(master)把数据更改记录到⼆进制⽇志(binlog)中。
2. 从服务器(slave)把主服务器的⼆进制⽇志复制到⾃⼰的中继⽇志(relay log)中。
3. 从服务器重做中继⽇志中的⽇志,把更改应⽤到⾃⼰的数据库上,达到数据的⼀致性。
主从同步是⼀个异步实时的同步,会实时的传输,但存在执⾏上的延时,如果主服务器压⼒很⼤,延时也会相应扩⼤。
通过上⾯的图,可以看到⼀共需要3个线程:
1. 主服务器的⽇志传送线程:负责将⼆进制⽇志增量传送到备机
2. 从服务器的I/O线程:负责读取主服务器的⼆进制⽇志,并保存为中继⽇志
3. 从服务器的SQL线程,负责执⾏中继⽇志中秋节简短文案
查看MySQL线程
我们可以使⽤show full processlist;命令来查看MySQL的状态:
主机的状态:
备机的状态:
可以看到,我的集架构为1台主机、4台备机,所以在主机中有4个同步线程(已经发送所有的binlog数据到备机,等待binlog⽇志更新),1个查看命令线程(show full processlist)。在备机中有1个查看命令线程,1个I/O线程(等待主机发送同步数据事件),1个SQL线程(已经读取了所有中继⽇志,等待I/O线程来更新它)。
查看同步状态
因为主从同步是异步实时的,也就是会存在延时的情况,我们可以通过show slave status;来查看备机上的同步延时:
在主从同步中我们需要关注的⼀些属性,已经给⼤家标红了:
Slave_IO_State: 当前I/O线程的状态
Master_Log_File: 当前同步的主服务器的⼆进制⽂件
Read_Master_Log_Pos: 当前同步的主服务器的⼆进制⽂件的偏移量,单位为字节,如图中为已经同步了12.9M(13630580/1024/1024)的内容
Relay_Master_Log_File: 当前中继⽇志同步的⼆进制⽂件
Slave_IO_Running: 从服务器中I/O线程的运⾏状态,YES为运⾏正常
Slave_SQL_Running: 从服务器中SQL线程的运⾏状态,YES为运⾏正常
Exec_Master_Log_Pos: 表⽰同步完成的主服务器的⼆进制⽇志偏移量
Seconds_Behind_Master: 表⽰从服务器数据⽐主服务器落后的持续时长
同样可以通过show master status;命令来查看主服务器的运⾏状态:
正常运⾏的主从同步状态:
Slave_IO_Running: YES
Slave_SQL_Running: YES
Seconds_Behind_Master: 0
问题排查
在理解了主从同步的机制后,再来看今天遇到的问题,通过查看备机状态,我们观察在三种状态下的⼏个关键属性值:
mysql> show slave status\G;中国移动上海网点
#状态⼀:
Slave_IO_State: Reconnecting after a failed master event read
Slave_IO_Running: No
Slave_SQL_Running: Yes
Seconds_Behind_Master: NULL
#状态⼆:
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes护士节祝福语简短
Seconds_Behind_Master: 0
#状态三:
腾冲景点
Slave_IO_State: Queueing master event to the relay log
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 636
通过,我们可以看到三种状态的不同含义:
# 状态⼀
# 线程正尝试重新连接主服务器,当连接重新建⽴后,状态变为Waiting for master to send event。
Reconnecting after a failed master event read
# 状态⼆
# 线程已经连接上主服务器,正等待⼆进制⽇志事件到达。如果主服务器正空闲,会持续较长的时间。如果等待持续slave_read_timeout秒,则发⽣超时。此时,线程认为连接被中断并企图重新连接。Waiting for master to send event
# 状态三
# 线程已经读取⼀个事件,正将它复制到中继⽇志供SQL线程来处理。
Queueing master event to the relay log
在这⾥,我们可以猜测,由于某些原因,从服务器不断的和主服务器进⾏断开并尝试重连,重连成功后⼜再次断开。
我们再看看主机的运⾏情况:
发现问题出在10.144.63.*和10.144.68.*两台机器上,我们查看其中⼀台的错误⽇志:
190214 11:33:20 [Note] Slave: received end packet from server, apparent master shutdown:
190214 11:33:20 [Note] Slave I/O thread: Failed reading log event, reconnecting to retry, log 'mysql-bin.005682' at postion 13628070
拿到关键字Slave: received end packet from server, apparent master shutdown: Google搜索⼀下,在⽂章中可以看到原因为两台备机的server-id重复。
One day it happen to me, and took me almost an hour to find that out.
Moving foward I always use a base myf to I copy to any other server and the first thing is to increase the server-id.
Could MySQL just use the servername intead of a numeric value?
问题修复
定位了问题,我们确认下是否重复,发现两台备机的该字段确实相同:
vim myf
#replication
log-bin=mysql-bin
# 这个随机数字相同导致的
server-id=177230069
sync_binlog=1
更改⼀个其他不同的数字,保存,重启MySQL进程,报警恢复。
总结
最终来看,这个问题的解决⾮常简单,但从刚开始的迷茫到最后的思路清晰,都是我们排查问题所常见的,这篇⽂章的主要收获是让你明⽩主从同步的机制和追
查问题的思路,希望下次我们都能很快的解决主从同步带给我们的问题。
坏账准备的会计分录好了,以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
参考资料
《MySQL基础内幕 InnoDB存储引擎第2版》P8.7 复制
MySQL主从复制线程状态转变
Confusing MySQL Replication Error Message

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。