因为MySQL没有供给在重启时的插件接口,为了后续保护便利,在MySQL代码层抽象出了一个新插件接口before_binlog_init用于校准Binlog。
【MySQL的容灾缺点总结】
- MySQL在容灾方面存在的问题:
- Master切换时主备数据不克不及包管一致:Master重启并切换可能导致MySQL主备间数据不一致。Master重启并切换可能导致MySQL Client产生幻读。
- 原生MySQL缺乏高可用机制:Master切换导致调用端决裂。缺乏主动选主机制。
- 对于原生MySQL,在高可用和强一致两个特点中,只能二选一:
- 请求MySQL主备间的数据强一致,不做主备主动切换。
- 借助MHA实现高可用,容忍MySQL主备间的数据不一致。
本文具体描述了PhxSQL的设计与实现。大年夜MySQL的容灾缺点开端讲起,接着阐述实现高可用强一致的思路,然后具体分析每个实现环节要留意的要点和解决筹划,最后展示了PhxSQL在容灾和机能上的结不雅。
设计背景
互联网应用中账号和金融类关键体系要乞降强调强一致性及高可用性。当面对机械破坏、收集分区、主备手工或者主动切换时,传统的MySQL主备难以包管强一致性和高可用性。PhxSQL将MySQL集群构建在一致性完美的Paxos协定基本上,包管了集群内MySQL机械之间数据的强一致性和全部集群的高可用性。
原生MySQL的容灾缺点 【MySQL容灾筹划】
MySQL有两种常见的复制筹划,异步复制和半同步复制。
1、异步复制筹划
Master对数据进行commit操作后再将数据异步复制到Slave。
但数据无法包管成功复制,也就无法包管MySQL主备间的数据一致性,如图1所示。
图1 MySQL异步复制流程
2、半同步复制筹划
PhxSync
Master对数据进行commit操作前将数据复制到Slave,确认复制成功后再对数据进行commit操作。
图2 MySQL半同步复制流程
【MySQL重启流程】
半同步筹划中的“半”是指Master在等待Slave的ACK掉败时将退化成异步复制。同时,MySQL在重启时也不会履行半同步复制。
如图3中的id(Gtid)=101数据是Master机械中新写入到Binlog File的Binlog数据。但Master在复制数据到Slave的过程中MySQL宕机导致复制掉败。MySQL重启时,数据(id=101)会被直接进行commit操作,随后再将数据异步复制到Slave。(下文将已经写入到Binlog File但未进行commit操作的数据(id=101)称为Pending Binlog。)
图3 MySQL重启时直接提交Pending Binlog
该情况下MySQL轻易出现Master-Slave之间数据不一致的情况,官方也描述了该问题。
http://bugs.mysql.com/bug.php?id=80395
【MySQL重启缺点】
当对上述例子中的Pending Binlog(id=101)进行复制时Master宕机导致复制掉败,随后Slave1切换成新Master并开端供给办事(写入id=201的数据)。此后,当旧Master重启时,Pending Binlog(id=101)不会被从新进行复制而直接进行commit操作,大年夜而导致旧Master比新Master多了一条数据,旧Master无法成为新Master的Slave,须要人工处理掉履┞封条数据之后,才能让旧Master作为Slave供给办事,如图4所示。
图4 MySQL重启缺点导致主备数据不一致
上述case只短谏Master的数据造成影响,不会使得MySQL Client攫取到缺点数据。但当Master持续出现两搭钮机后产生Master切换,两搭钮机距离较短使得Pending Binlog未能及时复制到Slave,且时代有萌芽请求时(Master宕机→Master重启→萌芽数据→Master宕机→Master切换),MySQL Client会产生如图5所示的幻读(两次读到的结不雅不一致)。
请求透传
图5 MySQL重启缺点导致Client产生幻读
【MySQL Client决裂】
图6 MySQL进行Master导致Client端决裂
【MySQL缺乏主动选主机制】
因为半同步复制不须要等待所有Slave的ACK,是以当Master出现故障时,须要选有最新Binlog的Slave为新的Master;而MySQL并没有内置这个选主机制,如图7所示。
推荐阅读
【51CTO.com原创稿件】跟着云计算的快速成长,收集问题争议赓续,为懂得决云上租户收集隔离问题,VPC(专有收集)应运而生,VPC也被认为是将来的趋势。那么,阿里云的VPC是若何赞助用户解>>>详细阅读
地址:http://www.17bianji.com/lsqh/34798.html
1/2 1