简单谈谈MySQL的半同步复制
作者:linjinhe 发布时间:2024-01-15 01:04:50
简介
MySQL通过复制(Replication)实现存储系统的高可用。目前,MySQL支持的复制方式有:
异步复制(Asynchronous Replication):原理最简单,性能最好。但是主备之间数据不一致的概率很大。
半同步复制(Semi-synchronous Replication):相比异步复制,半同步复制牺牲了一定的性能,提升了主备之间数据的一致性(有一些情况还是会出现主备数据不一致)。
组复制(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半同步复制存在以下问题:
当Slave超时时,会退化成异步复制。
当Master宕机时,数据一致性无法保证,需要人工处理。
复制是串行的。
正因为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
猜你喜欢
- 环境系统:win10cpu:i7-6700HQgpu:gtx965mpython : 3.6pytorch :0.3数据下载来源自Sasan
- 引言善于观察的朋友一定会敏锐地发现ChatGPT网页端是逐句给出问题答案的,同样,ChatGPT后台Api接口请求中,如果将Stream参数
- Python中str is not callable问题详解及解决办法问题提出: 在Python的代码,在运行过程中
- 导读演示了使用PyTorch最近发布的新工具torchserve来进行PyTorch模型的部署。最近,PyTorch推出了名为torchse
- 前言所谓模糊查询就是不需要用户完整的输入或者说全部输入信息即可提供查询服务,也就是用户可以在边输入的同时边看到提示的信息(其实是查询出来匹配
- Div的浮动+循环(描述的不清楚,请看图)在设计和布局的时候,碰到图片循环问题,碰到间距问题,怎么样让循环的图片每行的起始点跟上边的titl
- 一.序单从库名大概就能猜出其作用。sync.Once使用起来很简单, 下面是一个简单的使用案例package mainimport (&qu
- 这学期在学习编译原理,最近的上机作业就是做一个简单的词法分析器,在做的过程中,突然有个需求就是判断一个字符串是否为合法的标示符,因为我是用p
- 可以使用 XDR(简化 XML-Data)架构创建关系数据的 XML 视图。然后可以使用 XPath 查询来查询这些视图。这类似于使用 CR
- Serializer序列化器定义Serializer1. 定义方法Django REST framework中的Serializer使用类来
- 网站用户为什么注册?这个问题在平时我们讨论的并不多。我们常常单纯的在设想如何简化注册流程,如何从细节的关怀入手避免用户注册时填写错误信息造成
- asp.net和php哪个更好?在.net之前,微软的是ASP。在微软的大力推广下,其看起来还是很有前途的。但现在,微软想推广asp.net
- asp连接mysql的问题ASP连接Mysql数据库的问题。下了一个MySql 的ODBC驱动。做了个小测试。顺利通过。先记录下来,中间还有
- mysql5.7设置远程访问不是和网上说的一样建个用户赋个权限就可以访问的。比如下边这个就是建用户赋权限,可能在之前的版本可以,但是我在我的
- 试官: 听说你熟悉python,那么你能简单阐述一下python的装饰器、生成器以及迭代器么?我: emm, 我不清楚,我只是了解过pyth
- 本次转换需要依赖使用工具Navicat Premium。首先,将数据库移至本地SQLServer,我试过直接在局域网上其他SQLServer
- 第1章 argparse简介1.1 解析argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块
- 先来看实现效果。1.遇到问题因为随着功能的增多,table操作栏中的功能按钮增多,操作列长度就增长,导致不是很美观。所以产品要求超过三个按钮
- 本文实例讲述了Python实现的多项式拟合功能。分享给大家供大家参考,具体如下:# -*- coding: utf-8 -*-#! pyth
- 本文实例为大家分享了python实现简单图片物体标注工具的具体代码,供大家参考,具体内容如下# coding: utf-8"&qu