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 阅读 34 次 更新于 2025-09-10 07:12:10 我来答关注问题0
  •  文暄生活科普 MySQL 主从复制 —— 全同步复制、异步复制、半同步复制

    注意:MySQL 主从复制默认采用的复制策略就是异步复制。四、半同步复制半同步复制是 MySQL 5.5 版本之后开始支持的一种复制方式。它要求主库在提交事务后,不直接将结果返回给客户端,而是等待至少有一个从库收到了 binlog,并且写入到中继日志中,再返回给客户端。优点:提高了数据的一致性,因为主库...

  •  文暄生活科普 看完这篇还不懂 MySQL 主从复制,可以回家躺平了

    MySQL主从复制是基于主服务器在二进制日志(binlog)中跟踪所有对数据库的更改。要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收已经记录到日志的数据,并在主服务器上执行相同的更新。从服务器执行备份不会干扰主服务器,主服务器可以继续处理更新。四、过程 MySQL的主从复制工作...

  •  文暄生活科普 MySQl主从复制

    如果等待超时,则切换为异步模式再提交。半同步模式能够缩小主从数据库的数据延迟,提高数据安全性。但性能上会有一定的降低,响应时间会变长。全同步模式:主节点和所有从节点都执行了commit并确认后,才会向客户端返回成功。全同步模式能够确保数据的一致性,但性能上会有较大的影响。综上所述,MySQL主从...

  • 查看一下代码,该Semi-sync slave net_flush() reply failed 信息来自函数 ReplSemiSyncSlave::slaveReply,函数如下 该错误发生的条件就是执行net_flush(net)函数,没有收到正常的返回,报错了,所以有上面的错误发生,该函数的作用是将从库收到的binlog file 跟binlog pos的信息发送给主库。网络有...

  •  翡希信息咨询 介绍几种 MySQL 官方高可用方案

    架构原理:MySQL Replication 是官方提供的主从同步方案,用于实现数据从一个 MySQL 实例(主服务器)自动复制到一个或多个其他 MySQL 实例(从服务器)。主节点处理写操作,从节点异步或半同步复制数据。主要特性:异步复制:默认情况下,主服务器在写入数据后即认为操作完成,不等待从服务器确认。半同步...

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

mySQL相关话题

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