位置: 编程技术 - 正文

Mysql半同步复制原理及问题排查

编辑:rootadmin

推荐整理分享Mysql半同步复制原理及问题排查,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

mysql半同步复制和异步复制的差别如上述架构图所示:在mysql异步复制的情况下,Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master Sever就自动返回数据给客户端,而不管slave上是否接受到了这个二进制日志。在半同步复制的架构下,当master在将自己binlog发给slave上的时候,要确保slave已经接受到了这个二进制日志以后,才会返回数据给客户端。对比两种架构:异步复制对于用户来说,可以确保得到快速的响应结构,但是不能确保二进制日志确实到达了slave上;半同步复制对于客户的请求响应稍微慢点,但是他可以保证二进制日志的完整性。

1.问题背景

默认情况下,线上的mysql复制都是异步复制,因此在极端情况下,主备切换时,会有一定的概率备库比主库数据少,因此切换后,我们会通过工具进行回滚回补,确保数据不丢失。半同步复制则要求主库执行每一个事务,都要求至少一个备库成功接收后,才真正执行完成,因此可以保持主备库的强一致性。为了确保主备库数据强一致,减少数据丢失,尝试在生产环境中开启mysql的复制的半同步(semi-sync)特性。实际操作过程中,发现大部分实例半同步都可以正常运行,但有少部分实例始终开不起来(只能以普通复制方式运行),更奇葩的是同一个主机的两个实例,一个能开启,一个不能。最终定位的问题也很简单,但排查出来还是花了一番功夫,下文将描述整个问题的排查过程。

2.半同步复制原理

mysql的主备库通过binlog日志保持一致,主库本地执行完事务,binlog日志落盘后即返回给用户;备库通过拉取主库binlog日志来同步主库的操作。默认情况下,主库与备库并没有严格的同步,因此存在一定的概率备库与主库的数据是不对等的。半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。实现原理也很简单,主库本地执行完毕后,等待备库的响应消息(包含最新备库接收到的binlog(file,pos)),接收到备库响应消息后,再返回给用户,这样一个事务才算真正完成。在主库实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。有关半同步的具体实现,可以参考另外一篇文章,mysql半同步(semi-sync)源码实现。

3.问题分析

前面简单介绍了半同步复制的原理,现在来看看具体问题。在主备库打开半同步开关后,问题实例的状态变量"Rpl_semi_sync_master_status"始终是OFF,表示复制一直运行在普通复制的状态。

(1).修改rpl_semi_sync_master_timeout参数。

半同步复制参数中有一个rpl_semi_sync_master_timeout参数,用以控制主库等待备库响应消息的时间,如果超过该值,则认为备库一直没有收到(备库可能挂了,也可能备库执行很慢,较主库相差很远),这个时候复制会切换为普通复制,避免主库的执行事务长时间等待。线上这个值默认是ms,简单想是不是这个值太小了,遂将其改到s,但问题依然不解。

(2).打印日志

排查问题最简单最笨的方法就是打日志,看看到底是哪个环节出了问题。主库和备库分别有rpl_semi_sync_master_trace_level和rpl_semi_sync_slave_trace_level参数来控制半同步复制打印日志。将两个参数值设置为(+),记录详细日志信息,以及进出的函数调用。

master:

-- :: [Note] ReplSemiSyncMaster::updateSyncHeader: server(-), (mysql-bin., ) sync(1), repl(1)-- :: [Warning] Timeout waiting for reply of binlog (file: mysql-bin., pos: ), semi-sync up to file , position 0.-- :: [Note] Semi-sync replication switched OFF.

slave:

-- :: [Note] ---> ReplSemiSyncSlave::slaveReply enter-- :: [Note] ReplSemiSyncSlave::slaveReply: reply (mysql-bin., )-- :: [Note] <--- ReplSemiSyncSlave::slaveReply exit (0)

从master日志可以看到在-- ::时,主库设置了半同步标记,并开始等待备库的响应,等待s后,仍然没有收到响应,则认为超时,遂将半同步模式关闭,切换为普通模式。但从slave日志来看,在-- ::已经将(mysql-bin., )发送给主库,表示已经收到该日志。这就说明,master日志已经打了semi-sync标,slave收到了日志,并且也回了包,master也确实等了s,就是没有收到包,所以就切换为普通复制。现在问题就变成了,为什么master没有收到?

(3)select函数

Mysql半同步复制原理及问题排查

前面提到了,主库实例上有一个专门接收响应包的线程(ack_receiver),它通过select函数监听socket,发现有slave的响应消息后,读取消息,通知工作线程可以继续执行。那么问题是不是出现在select函数上面?因为select是一个系统调用,一直没有怀疑,但已经跟到这里来了,那就得看看。与select函数相关的有几个重要的宏定义和说明。主要实现在/usr/include/bits/typesizes.h,/usr/include/bits/select.h和/usr/include/sys/select.h这三个文件中。

FD_ZERO(fd_set *fdset):清空fdset与所有文件句柄的联系。FD_SET(int fd, fd_set *fdset):建立文件句柄fd与fdset的联系。FD_CLR(int fd, fd_set *fdset):清除文件句柄fd与fdset的联系。FD_ISSET(int fd, fd_set *fdset):检查fdset联系的文件句柄fd是否可读写,当>0表示可读写。

通过FD_SET可以设置我们想要监听的句柄,句柄信息存储在fd_set位数组中,数组元素的个数由__FD_SETSIZE/决定,对于__FD_SETSIZE=而言,整个数组只有个long int。每个句柄占有一个位,就是个位,可以存储个句柄。假设句柄值为,那么/=2,%=,那么这个句柄在数组的标示在第2个long int的第位置1。那么如果句柄值超出呢,这里不就溢出了?我仔细撸了撸代码,发现根本就没有容错判断,如果句柄值超过就一定会溢出。由于select函数是遍历数组中的每个位,然后去判断该句柄是否可读可写,因此对于超过的句柄,永远也不会去判断,因此主库永远不知道备库是否发送了响应包。

(4)验证

上面只是理论分析,如果实际运行的实例句柄确实是超过了,那么问题就定位到了。

1.得到mysql进程mysql-pid

ps ?aux | grep mysqld | grep port

2.gdb attach到该进程

gdb ?p mysql-pid

3.找到ack_receive线程,并切换

info threadthread thread_id

4.打印socket的值,这里fd值为。

(5)如何解

我们看到了由于__FD_SETSIZE的定义,一般是,导致select函数最多只能监听个句柄,并且最大句柄值不超过。第一个方法是调大该参数,但这种方法需要重新编译linux内核。而且由于select机制,每次都需要遍历 的每一位来判断句柄上是否有消息到来,因此如果设置很大,将导致效率非常低。select是一种比较老的IO复用机制,比较先进的poll,epoll都有类似的功能,并且更强大,也没有句柄总数和最大句柄的限制。有关select,poll,epoll等机制,大家可以去网上查资料,这里不展开讨论。

(6)官方版本

看了最新oracle官方版本git上5.7的源代码,这块也是用select来实现的,所以也存在类似的问题。当然,由于句柄号有复用机制,当实例上连接数很少,或者长连接不多时,不容易出现fd>的情况,所以这个bug不是很容易出现,但问题是普遍存在的。

(7)问题延生

问题定位后,另外一个问题还困扰我了半天。因为mysql内核中有监听的部分有3块,1是监听端口的select,2是线程池的监听epoll,3是半同步的select监听。slave binlog dump的线程就是普通的工作线程,而工作线程的socket会受epoll的监听,这样一来,binlog dump的socket会同时受半同步的select监听和线程池的epoll监听,这不乱了吗?后来仔细看了看代码,才发现线程池的epoll监听采用的是EPOLLONESHOT模式,每次接收消息后会解绑,需要重新注册,因此不会出现同一个句柄被两种监听机制同时监听的情况。

到此,排查问题过程就结束了,结论是比较简单的,但定位这个问题确实花费了一些功夫。由于select一种比较通用的多路IO复用机制,因此有用到select函数的童鞋,可能要注意下它的限制。

MySQL中的行级锁、表级锁、页级锁 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。在DBMS中,可以按照锁的粒度把

MySQL数据库三种常用存储引擎特性对比 MySQL的存储引擎可能是所有关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常

mysql版本5.5.x升级到5.6.x步骤分享 大概步骤是:把配置文件添加:skip-grant-tables参数,把basedir升级成新版本,启动mysql,执行命令:mysql_upgrade升级一下字典信息,然后flushprivileges;刷新授

标签: Mysql半同步复制原理及问题排查

本文链接地址:https://www.jiuchutong.com/biancheng/312474.html 转载请保留说明!

上一篇:关于MySQL 优化的100个的建议(mysql常见优化手段)

下一篇:MySQL中的行级锁、表级锁、页级锁(mysql行锁的作用)

  • 摊薄净资产收益率是什么意思
  • 饮食企业简介
  • 销售不动产税率9%还是5%
  • 附加税的计算公式2023
  • 个人所得税申报截止时间
  • 进项税额和销项税额是什么
  • 民办非企业不注销的法律后果
  • 借款现金分录怎么做
  • 税务登记财务负责人可以是法人吗
  • 融资租赁是怎么操作的
  • 当月开的发票次月预缴税款行得通吗?
  • 该企业本月发生如下经济业务
  • 盈余公积可以随便用吗
  • 当月工资额什么意思
  • 金融服务手续费可以抵扣进项税吗
  • 教育培训机构涉税问题
  • 违约金收税吗
  • 营改增的销售额规定
  • 季报的利润表是填本期金额还是本年
  • 可抵扣的金税盘维护费会计分录怎么做?
  • 开具信息咨询费的发票
  • 促销礼物
  • 国家减免税收
  • 如何修改win10系统电脑密码
  • win10怎么自定义开机音乐
  • 如果工资少发怎么办
  • linux系统怎么打开
  • 前期差错更正怎么理解
  • PHP:Memcached::getByKey()的用法_Memcached类
  • 自己给笔记本更换硬盘
  • linux系统中pwd命令的作用
  • 资产增加为什么记借方
  • 当月工资个税怎么算
  • 已认证留抵待抵扣税额分录
  • php简单文件管理
  • 小规模纳税人免税额度是多少
  • 待提出票据交换及转汇款怎么做账
  • 自产产品对外捐赠销项税额怎么计算
  • 残疾人保证金优惠减免怎么申请退税
  • centos+php+coreseek+sphinx+mysql之一coreseek安装篇
  • 百旺开票软件状态查询在哪里
  • 季报弥补亏损,财报怎么填
  • 二季度平均薪酬
  • 税金及附加包括哪些
  • 销售的百分点怎么计算
  • 现金流量表和资产负债表的区别
  • 内账增值税计入什么科目
  • 高速公路电子发票查询平台
  • 负数发票是可以抵扣吗
  • 小微企业免征的增值税怎么做账
  • 调整以前年度损益调整什么时候结转
  • 减值准备减少记哪方
  • 研发费用账务处理一定在管理费用吗
  • 减免的残保金怎么做分录
  • 通讯发票可以税后抵扣吗
  • 购入汽车当月需要计提折旧吗
  • 预付账款属于哪一类账户
  • 企业初建
  • mysql索引的使用和原理
  • win8系统自带截图
  • linux获取主目录的命令
  • linux常用的几种压缩工具
  • centos 安装chia
  • win7如何设置电脑输入法
  • win10怎么更改磁盘空间分配
  • windows7开机
  • win7开机黑屏怎么
  • 双系统如何迁移到固态硬盘
  • centos7 ifcfg-lo
  • 一键快速关机下载手机版
  • opengl导入obj
  • nodejs的socket
  • 原生js有用吗
  • windows运行bat文件命令
  • uleb128、sleb128和uleb128p1编码格式介绍
  • jQuery实现Select左右复制移动内容
  • bootstrap jumbotron
  • 卷烟批发环节的消费税税率
  • 公司被分立,应将分立后的单位
  • 90平房子税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设