mysql主从复制原理,异步怎么回事?半同步怎么回事

查看一下代码,该Semi-sync slave net_flush() reply failed 信息来自函数 ReplSemiSyncSlave::slaveReply,函数如下 该错误发生的条件就是执行net_flush(net)函数,没有收到正常的返回,报错了,所以有上面的错误发生,该函数的作用是将从库收到的binlog file 跟binlog pos的信息发送给主库。网络有...
mysql主从复制原理,异步怎么回事?半同步怎么回事
mysql主从复制原理是基于mysql的binlog日志管理模式。针对数据库的操作都会写入binlog日志文件,所以备数据库可以一直监控主数据库的binlog日志,并将该日志中的内容同步在备数据库执行。通过这样的方式就保证了主备数据库的一致性。2016-07-04
研发的同事反馈,mysql的半同步怎么变异步了?开始觉得不足为奇,超时之后,自然变成异步了。但同步binlog的速度变得正常之后,就会自动变成同步了。但抱着严谨负责的态度,马上去检查了一

下数据库的日志跟半同步的状态。
看了一下从库的错误日志,被图片中所示的sem-sync slave net_flush() reply failed 刷屏。。。。。。,汗了,这又是哪一出? 主库却没有任何日志。
虽然此时的主从同步的延迟时间是正常的,维持在0s的延迟,但此时同步状态却是异步的。

好奇怪呢?
查看一下代码,该Semi-sync slave net_flush() reply failed 信息来自函数
ReplSemiSyncSlave::slaveReply,函数如下

该错误发生的条件就是执行net_flush(net)函数,没有收到正常的返回,报错了,所以有上面的错误发生,该函数的作用是将从库收到的binlog file 跟binlog pos的信息发送给主库。
网络有问题? 即使网路抖动性的问题,网路恢复之后应该正常才是。
为什么这个错误持续刷屏? 而主从同步目前是正常的,只是由半同步变成了异步。
当我将slave重启之后,错误信息也很快就出现。
因为该函数是向主库发送同步binlog的确认信息的,也就是ack信息,难道是主库的ack的接收线程出了问题? 而主库没有任何的报错信息 。
关键时刻,自己搞不定的时候,尝试找帮手。我将错误信息,发给oracle公司的mysql开发者宋老师,宋老师是负责replication模块的开发者,对replication相当熟悉,说我可能遇上一个mysql的Bug,让我查看一下Bug 79865 . 在此,非常感谢宋老师的热情的无偿援助。
bug 详情链接: http://bugs.mysql.com/bug.php?id=79865

我们来看看采用了select()多路复用io模型的ack_reciver 线程的代码:

bug的关键点是因为 ret= select(max_fd+1, &fds, NULL, NULL, &tv); select()函数的入参max_fd+1有1024的限制,且这个限制无法通过修改nproc来突破?
(ulimit -n 命令可以修改nproc参数)。

貌似所有的疑问都揭开,但请继续。

作者采用的环境是5.7.15,同时,作者采用的操作系统是centOS 7, 根据上面http://bugs.mysql.com/bug.php?id=79865 后半部分,Meiji Kimura 的描述信息,该bug在centos 6上复现了, 而在centOS7上没有复现。而作者正是采用了centos 7.

2020-07-20
mengvlog 阅读 9 次 更新于 2025-07-20 07:33:44 我来答关注问题0
  • 查看一下代码,该Semi-sync slave net_flush() reply failed 信息来自函数 ReplSemiSyncSlave::slaveReply,函数如下 该错误发生的条件就是执行net_flush(net)函数,没有收到正常的返回,报错了,所以有上面的错误发生,该函数的作用是将从库收到的binlog file 跟binlog pos的信息发送给主库。网络有...

  •  云易网络科技 MySQL复制协议是什么详解MySQL复制协议的作用及实现原理mysql复制协议

    MySQL复制协议的实现原理如下:首先,MySQL服务器上的binlog日志,用于实现数据的同步和跟踪,它记录了对MySQL服务器的更改操作的所有信息,包括:SQL启动、提交、回滚、更改等操作;其次,主从属服务器间建立通信,采用TCP协议来传输,主服务器将自己更改过的binlog日志内容传递给从属服务器,同时从属服务器...

  • mysql>START SLAVE;4. 将原来的主服务器恢复为普通的从服务器,并修改其主服务器地址 mysql>RESET SLAVE;mysql>CHANGE MASTER TO MASTER_HOST = ‘192.168.1.3’, MASTER_USER = ‘root’, MASTER_PASSWORD = ‘password’, MASTER_PORT = 3306;mysql>START...

  • MySQL 组复制模式是基于基本复制模式实现的高可用复制架构,使用组 (Group) 的概念实现多个从服务器之间的数据同步和容错。组复制模式的特点是:主服务器与从服务器之间的复制是异步的,从服务器之间的复制是同步、组内容错隔离,可以在组内实现动态更改和管理。具体操作步骤如下:1. 在每个参与复制的服务...

  • 如果没有重启,则默认还是异步复制,重启后,slave会在master上注册为半同步复制的slave角色。这时候,主的error.log中会打印如下信息:查看半同步是否在运行 主:从:这两个变量常用来监控主从是否运行在半同步复制模式下。至此,MySQL半同步复制搭建完毕~来做个实验,观察半同步状态参数的变化。1、在主...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部