我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中怎么实现主从同步机制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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中怎么实现主从同步机制

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的状态:

主机的状态:

MySQL中怎么实现主从同步机制

备机的状态:

MySQL中怎么实现主从同步机制

可以看到,我的集群架构为1台主机、4台备机,所以在主机中有4个同步线程(已经发送所有的binlog数据到备机,等待binlog日志更新),1个查看命令线程(show full processlist)。在备机中有1个查看命令线程,1个I/O线程(等待主机发送同步数据事件),1个SQL线程(已经读取了所有中继日志,等待I/O线程来更新它)。

查看同步状态

因为主从同步是异步实时的,也就是会存在延时的情况,我们可以通过show slave status;来查看备机上的同步延时:

MySQL中怎么实现主从同步机制

在主从同步中我们需要关注的一些属性,已经给大家标红了:

  • 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;命令来查看主服务器的运行状态:

MySQL中怎么实现主从同步机制

正常运行的主从同步状态:

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

通过MySQL主从复制线程状态转变,我们可以看到三种状态的不同含义:

# 状态一
# 线程正尝试重新连接主服务器,当连接重新建立后,状态变为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

在这里,我们可以猜测,由于某些原因,从服务器不断的和主服务器进行断开并尝试重连,重连成功后又再次断开。

我们再看看主机的运行情况:

MySQL中怎么实现主从同步机制

发现问题出在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搜索一下,在文章Confusing MySQL Replication Error Message中可以看到原因为两台备机的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 my.cnf 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 my.cnf

#replication
log-bin=mysql-bin
# 这个随机数字相同导致的
server-id=177230069
sync_binlog=1

看完上述内容,你们掌握MySQL中怎么实现主从同步机制的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中怎么实现主从同步机制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql主从同步怎么实现

mysql 主从同步实现什么是 MySQL 主从同步?MySQL 主从同步是一种数据复制机制,其中一台服务器(主服务器)将数据更改复制到一台或多台其他服务器(从服务器)。如何实现 MySQL 主从同步?先决条件:主服务器和从服务器之
mysql主从同步怎么实现
2024-05-22

编程热搜

目录