
MySQL通过复制(复制)实现了存储系统的高可用性,目前MySQL支持的复制方法是:
异步复制(异步复制):最简单的原理和最好的性能。但主要的准备之间的数据不一致的概率是非常大的。
半同步复制(半同步复制):与异步复制相比,半同步复制牺牲了某些性能,提高了主机和主机之间的数据一致性。
组(组复制复制):分布式基于Paxos算法的数据复制的一致性强。只要大多数的机器是活的,制度是保证可用。半同步复制相比,数据的一致性和系统可用性高复制组。
本文主要讨论MySQL的半同步复制。
半同步复制的基本过程
MySQL的半同步复制的实现是基于mysql.mysql异步复制支持两个稍微不同的半同步复制:after_sync和after_commit(受rpl_semi_sync_master_wait_wait_point)。
当半同步复制打开,主人会等待奴隶的响应或超时才返回。当Slave随着时间的推移,半同步复制退化为异步复制。这也是一个问题,在MySQL的半同步复制的存在。本文不讨论Salve超时的情况(不讨论了异步复制)。
对after_sync模式半同步复制的基本过程
的after_sync模式是半同步复制是由MySQL 5.7的支持,也是默认的半同步复制模式的mysql5.7:
在存储引擎中准备事务。
写交易的binlog,冲binlog磁盘。
等待至少一个奴隶确认接收
将事务提交给存储引擎(s)。
对after_commit模式半同步复制的基本过程
MySQL 5.5和5.6的半同步复制仅支持after_commit:
在存储引擎中准备事务。
写交易的binlog,冲binlog磁盘。
将事务提交给存储引擎(s)。
等待至少一个奴隶确认接收
对after_sync和after_commit两方法的总结
after_sync:在日志复制到主是奴隶,然后提交。
对主提交的所有事务都已复制到奴隶。
所有已复制到主事务中的奴隶事务都不提交(例如,在提交之前,主文件将复制到从属日志)。
然后复制日志的奴隶后after_commit:主犯。
所有主机上的所有提交事务不一定都复制到奴隶。(例如,主提交,还没有登录到从属副本)。
所有复制到奴隶的事务都在主进程上提交。
显然,在after_commit掌握的情况下,不能保证数据的一致性(主犯,没有能够登录到奴隶抄下来)。本文遵循只有after_sync模式。
mysql5.7.3开始支持配置半同步副本等待奴隶的反应数:rpl_semi_sync_master_wait_slave_count。
在after_sync模式异常情况分析
1:主延时开关的异常。
主执行,在binlog刷T事务到硬盘,总停机时间。Slave升级为主人。主人什么时候重启,崩溃恢复回滚T.主数据的一致性的交易。
主执行T的binlog刷交易到硬盘后,奴隶主在收到ACK(pendinglog)停机。Slave升级到大师。
2.1奴隶也未收到该交易的binlog然而,当主人重新启动,崩溃恢复将pendinglog直接的主要数据是不一致的。
2.2从已收到的交易中心主数据的binlog是一致的。
2的异常:主机关闭,而不是切换主机。仅考虑异常1的2.1。
当主人重新启动,pendinglog是直接提交。这时,主要数据是不一致的:
从连接到主并获取该交易的binlog异步复制的主要数据是一致的。
在奴隶可以复制交易binlog,如果主人发生宕机,硬盘损坏,数据不一致,对交易数据丢失。
异常处理
从以上异常情况的简单分析我们得知半同步复制处理主下来后重启(从没有pendinglog响应binlog)特殊情况。
主人下来了,不要换箱:
在崩溃恢复,主人等待连接和从复制到至少一个从副本binlog所有事务已提交。(对大师的地位和选择master_pos_wait()对奴隶)。
主人掉了,主动待机开关的情况:
当老法师重启的pendinglog回滚在崩溃恢复时间。(手动截断的硕士binlog不复制吗部分)
反射
为什么大师重启,崩溃恢复的过程中,是直接提交pendinglog,而不是重试请求的奴隶的反应吗
异步和半MySQL同步复制所引发的奴隶,而奴隶是主动连接主同步binlog。
没有主切换发生,机器重启后无法知道哪个机器是从机。
如果有一个切换,它不再是主人,那么将不会有更多的奴隶。如果你继续等待,它不能正常工作。
总结
MySQL半同步复制存在以下问题:
随着时间的推移,Slave将退化为异步复制。
当主位下降时,数据的一致性不能得到保证,需要进行人工处理。
副本是串行的。
因为在这些问题的主要数据一致性的MySQL的高可用性服务的互联网服务7×24的影响,因此企业纷纷使出自己的补丁:腾讯tdsql,WeChat PhxSQL,Ali AliSQL,网易innosql。
MySQL的官员纷纷推出MySQL组复制mysql5.7 -一个新的复制模式。
参考
MySQL半同步复制的数据一致性
MySQL高可用性解决方案
损失少半同步复制MySQL 5.7.2
增强semisync复制