作家
登录

微信高可用分布式数据库PhxSQL设计与实现

作者: 来源: 2017-04-17 13:05:37 阅读 我要评论

兼容MySQL事务

MySQL事务治理基于连接,同一个事务的所有请求经由过程同一个连接通信。在事务处理中连接损掉,事务将被rollback( http://dev.mysql.com/doc/refman/5.6/en/innodb-autocommit-commit-rollback.html )。

Proxy应用1:1连接模型完全兼容MySQL事务。每当MySQL Client提议一个连接到Proxy,Proxy都邑响应地提议一个连接到MySQL。两条连接中,随便率性一?中断,别的一钢页响应断开,对应的事务会被rollback,如图13所示。

图13 Proxy的1对1事务连接模型

PhxSync的功能和MySQL的semisync插件类似。经由调研,对semisync插件的接口做少量的调剂,就可以应用这些插件接口来实现PhxSync。

MySQL的权限治理基于(用户,源IP)对,源IP是经由过程socket句柄反查获取。当请求经由过程Proxy连接到MySQL时,源IP为Proxy本地IP,权限治理会出现异常。

Proxy应用MySQL协定HEAD保存字段透传真实袈浯IP到MySQ,MySQL再大年夜HEAD保存字段获取精确的源IP进行权限治理,如图14所示。

MySQL版本:Percona 5.6.31-77.0

图14 Proxy经由过程修改MySQL协定兼容MySQL权限

https://mariadb.atlassian.net/browse/MDEV-162

PhxSync功能主如果:

  • 正常运行时提交Binlog:MySQL在正常写入或者更新数据时,会调用after_flush接口。PhxSync插件经由过程实现after_flush接口将MySQL新写入的Binlog提交到本机的BinlogSvr,由本机BinlogSvr经由过程Paxos协定同步到BinlogSvr集群。
  • 重启时校准本地Binlog:MySQL在重启时经由过程萌芽BinlogSvr集群断定本地Pending Binlog的状况。如不雅Pending Binlog未复制到BinlogSvr集群则大年夜本地删除,保持本地的Binlog数据和BinlogSvr集群的Binlog数据一致。

上述对after_flush接口的调剂,和新增的before_binlog_init接口已经提交补丁给MySQL官方( http://bugs.mysql.com/bug.php?id=83158 )。

【PhxBinlogSvr】

PhxBinlogSvr重要负粜ユ储Binlog和Master信息的保护。在数据复制阶段,经由过程Paxos协定包管PhxBinlogSvr各节点的数据一致性(下文称PhxBinlogSvr为BinlogSvr)。

  • PhxPaxos库:BinlogSvr应用PhxPaxos库进行数据的复制。PhxPaxos库是微信团队开源的Paxos类库,具有以下特点:1. 包管各节点的数据一致。
  • 包管集群机械跨越一半存活还能办事。
  • 高机能。
  • 功能完美。
  • 稳定性经由大年夜范围验证。
  • 接口便利易用。
  • 项目地址 https://github.com/tencent-wechat/phxpaxos

BinlogSvr异常情况处理 防止Slave的节点提交数据

当旧Master在提交数据时因为收集问题数据包被卡在收集,且新Mater已经成功切换时,或者工资缺点直接往Slave节点的MySQL写入数据时,则会出现Slave节点提交数据的情况。多节点同时提交数据会出现BinlogSvr的Binlog数据和MySQL存储的Binlog数据不一致的情况。

BinlogSvr存储了集群内的Master信息。当其收到MySQL提交的数据时,可根据Master信息拒绝非Master节点的提交,如图15所示。

图15 BinlogSvr经由过程Master信息拒绝非Master节点的提交

防止Master提交缺点数据

在某些情况下,Master可能会从新发送数据或者发送缺点数据。譬如在收集不好的情况下Master因为提交数据超时而重发数据。磁盘产生故障或者数据被缺点回滚或者修改的时刻,Master会提交缺点的数据。

BinlogSvr应用乐不雅锁机制来防止Master的异常提交。在MySQL提交数据给BinlogSvr时,以本机MySQL已经履行的GTID为乐不雅锁,提交的内容为(本机MySQL已经履行的最新GTID,本次要提交的Binlog)。BinlogSvr经由过程检查请求中(本机MySQL已经履行的最新GTID)和自身保存的最新GTID是否匹配来拒绝从新发送或者异常发送的数据,如图16所示。

图16 BinlogSvr应用乐不雅锁拒绝Master在数据异常的情况下提交数据

  • 支撑MySQL原生复制协定:为了让Slave能大年夜BinlogSvr获取Binlog,最好的方法就是BinlogSvr支撑MySQL原生的复制协定,如许不消对Slave做任何修改,如图17所示。

图17 BinlogSvr支撑MySQL应用原生复制协定获取Binlog数据

  • Master治理:BinlogSvr除了存储MySQL的Binlog数据,还存储了Master信息。同时还承担了Agent的角色,负责监控MySQL的状况,须要时提议选举本身为Master的投票。

绝大年夜多半情况下,半同步复制能包管MySQL主备间的数据一致性,如图2所示。

BinlogSvr经由过程Paxos协定进行Master选举,选举成功后成为Master并拥有租约。经由过程Paxos协定选举包管了最终只产生一个Master且每个节点记录了一致的Master信息。

PhxSQL效不雅 【PhxSQL数据一致性】

经由过程比较PhxSQL集群中各节点的数据(MySQL Binlog,PhxPaxos,BinlogSvr) 断定各节点数据是否一致,如图18所示。


  推荐阅读

  阿里云VPC产品详解

【51CTO.com原创稿件】跟着云计算的快速成长,收集问题争议赓续,为懂得决云上租户收集隔离问题,VPC(专有收集)应运而生,VPC也被认为是将来的趋势。那么,阿里云的VPC是若何赞助用户解>>>详细阅读


本文标题:微信高可用分布式数据库PhxSQL设计与实现

地址:http://www.17bianji.com/lsqh/34798.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)