全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

简单谈谈MySQL的半同步复制

简介

MySQL通过复制(Replication)实现存储系统的高可用。目前,MySQL支持的复制方式有:

  1. 异步复制(Asynchronous Replication):原理最简单,性能最好。但是主备之间数据不一致的概率很大。
  2. 半同步复制(Semi-synchronous Replication):相比异步复制,半同步复制牺牲了一定的性能,提升了主备之间数据的一致性(有一些情况还是会出现主备数据不一致)。
  3. 组复制(Group Replication):基于Paxos算法实现分布式数据复制的强一致性。只要大多数机器存活就能保证系统可用。相比半同步复制,Group Replication的数据一致性和系统可用性更高。

本文主要讨论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默认的半同步复制方式:

  • Prepare the transaction in the storage engine(s).
  • Write the transaction to the binlog, flush the binlog to disk.
  • Wait for at least one slave to acknowledge the reception for the binlog events for the transaction.
  • Commit the transaction to the storage engine(s).

半同步复制AFTER_COMMIT模式的基本流程

MySQL 5.5和5.6的半同步复制只支持AFTER_COMMIT:

  • Prepare the transaction in the storage engine(s).
  • Write the transaction to the binlog, flush the binlog to disk.
  • Commit the transaction to the storage engine(s).
  • Wait for at least one slave to acknowledge the reception for the binlog events for the transaction.

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半同步复制存在以下问题:

  1. 当Slave超时时,会退化成异步复制。
  2. 当Master宕机时,数据一致性无法保证,需要人工处理。
  3. 复制是串行的。

正因为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小时内与您取得联系。