简介

MySQL通过复制(Replication)实现存储系统的高可用。目前,MySQL支持的复制方式有:
本文主要讨论MySQL半同步复制。
半同步复制的基本流程
MySQL半同步复制的实现是建立在MySQL异步复制的基础上的。MySQL支持两种略有不同的半同步复制:AFTER_SYNC和AFTER_COMMIT(受rpl_semi_sync_master_wait_wait_point控制)。
开启半同步复制时,Master在返回之前会等待Slave的响应或超时。当Slave超时时,半同步复制退化成异步复制。这也是MySQL半同步复制存在的一个问题。本文不讨论Salve超时的情形(不讨论异步复制)。
半同步复制AFTER_SYNC模式的基本流程
AFTER_SYNC模式是MySQL 5.7才支持的半同步复制方式,也是MySQL5.7默认的半同步复制方式:
半同步复制AFTER_COMMIT模式的基本流程
MySQL 5.5和5.6的半同步复制只支持AFTER_COMMIT:
AFTER_SYNC和AFTER_COMMIT两种方式的小结
AFTER_SYNC: 日志复制到Slave之后,Master再commit。
所有在master上commit的事务都已经复制到slave。
所有已经复制到slave的事务在master不一定commit了(比如,master将日志复制到slave之后,在commit之前宕机了)
AFTER_COMMIT:Master commit之后再将日志复制到Slave。
所有master上commit的事务不一定复制到slave。(比如,master commit之后,还没来得及将日志复制到slave就宕机了)
所有已经复制到slave的事务在master上一定commit了。
很明显,AFTER_COMMIT在master宕机的情况下,无法保证数据的一致性(master commit之后,还没来得及将日志复制到slave就宕机了)。本文接下来只讨论AFTER_SYNC模式。
MySQL5.7.3开始支持配置半同步复制等待Slave应答的个数:rpl_semi_sync_master_wait_slave_count 。
AFTER_SYNC模式下的异常情况分析
异常情况1:master宕机后,主备切换。
master执行事务T,在将事务T的binlog刷到硬盘之前,master发生宕机。slave升级为master。master重启后,crash recovery会对事务T进行回滚。主备数据一致。
master执行事务T,在将事务T的binlog刷到硬盘之后,收到slave的ACK之前,master发生宕机(存在pendinglog)。slave升级为master。
2.1 slave还没有收到事务T的binlog,master重启后,crash recovery会直接提交pendinglog。主备数据不一致。
2.2 slave已经收到事务T的binlog。主备数据一致。
异常情况2:master宕机后,不切换主机。只需考虑异常情况1中的2.1。
master重启后,直接提交pendinglog,此时,主备数据不一致:
slave连接上master,通过异步复制的方式获得事务T的binlog。主备数据一致。
slave还没来得及复制事务T的binlog,如果master又发生宕机,磁盘损坏。主备数据不一致,事务T的数据丢失。
异常情况处理
从上面异常情况的简单分析我们得知,半同步复制需要处理master宕机后重启存在pendinglog(slave没有应答的binlog)的特殊情况。
针对master宕机后,不进行主备切换的情形:
在crash recovery之后,master等到slave的连接和复制,直到至少有一个slave复制了所有已提交的事务的binlog。(SHOW MASTER STATUS on master and SELECT master_pos_wait() on slave)。
针对master宕机后,进行主备切换的情形:
旧master重启后,在crash recovery时,对pendinglog进行回滚。(人工截断master的binlog未复制的部分?)
思考
为什么master重启之后,crash recovery的过程中,是直接commit pendinglog,而不是重试请求slave的应答呢?
MySQL的异步复制和半同步复制都是由slave触发的,slave主动去连接master同步binlog。
没有发生主备切换,机器重启后无法知道哪台机器是slave。
如果发生主备切换,它已经不是master了,则不会再有slave连上来。如果继续等待,则无法正常运行。
总结
MySQL半同步复制存在以下问题:
正因为MySQL在主备数据一致性存在着这些问题,影响了互联网业务7*24的高可用服务,因此各大公司纷纷祭出自己的“补丁”:腾讯的TDSQL、微信的PhxSQL、阿里的AliSQL、网易的InnoSQL。
MySQL官方已经在MySQL5.7推出新的复制模式——MySQL Group Replication。
参考文献
MySQL半同步复制的数据一致性探讨
MySQL High Availability Solutions
Loss-less Semi-Synchronous Replication on MySQL 5.7.2
Enhanced semisync replication
# MySQL
# 半同步复制
# MySQL半同步复制
# MySQL 半同步复制频繁报错的完美解决方案
# MySQL复制三种模式:同步、异步、半同步复制有什么区别?
# MySQL 半同步复制的实现
# Mysql主从三种复制模式(异步复制
# 组复制)
# MySQL半同步复制原理配置与介绍详解
# Mysql半同步复制原理及问题排查
# mysql半同步复制的项目实践
# 重启
# 还没
# 两种
# 升级为
# 自己的
# 互联网
# 还没有
# 就能
# 机时
# 基础上
# 是由
# 腾讯
# 只需
# 可用性
# 各大
# 上一
# 更高
# 会对
# 网易
# 一个问题
相关文章:
C++中引用和指针有什么区别?(代码说明)
如何做静态网页,sublimetext3.0制作静态网页?
建站之星后台管理:高效配置与模板优化提升用户体验
建站之星北京办公室:智能建站系统与小程序生成方案解析
网站制作公司排行榜,抖音怎样做个人官方网站
如何选择PHP开源工具快速搭建网站?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
建站ABC备案流程中有哪些关键注意事项?
如何用美橙互联一键搭建多站合一网站?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
北京网站制作网页,网站升级改版需要多久?
无锡营销型网站制作公司,无锡网选车牌流程?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
,怎么用自己头像做动态表情包?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
如何选择网络建站服务器?高效建站必看指南
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
建站主机数据库如何配置才能提升网站性能?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
安徽网站建设与外贸建站服务专业定制方案
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
*服务器网站为何频现安全漏洞?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
深圳网站制作平台,深圳市做网站好的公司有哪些?
盘锦网站制作公司,盘锦大洼有多少5G网站?
如何选择靠谱的建站公司加盟品牌?
建站之星如何快速生成多端适配网站?
深入理解Android中的xmlns:tools属性
Swift中循环语句中的转移语句 break 和 continue
如何快速查询网址的建站时间与历史轨迹?
网站制作话术技巧,网站推广做的好怎么话术?
c++ stringstream用法详解_c++字符串与数字转换利器
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
制作网站的公司有哪些,做一个公司网站要多少钱?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
建站之星代理如何优化在线客服效率?
linux top下的 minerd 木马清除方法
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
建站主机选购指南:核心配置优化与品牌推荐方案
,如何利用word制作宣传手册?
如何选择适合PHP云建站的开源框架?
如何配置WinSCP新建站点的密钥验证步骤?
建站主机选哪种环境更利于SEO优化?
视频网站制作教程,怎么样制作优酷网的小视频?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
制作网站公司那家好,网络公司是做什么的?
如何选择美橙互联多站合一建站方案?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
*请认真填写需求信息,我们会在24小时内与您取得联系。