作家
登录

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

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

图7 MySQL缺乏主动选主机制

是以MySQL在容灾上无法同时知够数据强一致和办事高可用两个特点。

PhxSQL设计思路

【靠得住日记存储】

实现一个以靠得住日记存储为中间的架构来解决MySQL数据复制时产生的数据不一致问题。

Master将Binlog发送到BinlogSvr集群(靠得住日记存储),Slave大年夜BinlogSvr集群获取Binlog数据完成数据复制。

Master在重启时,根据BinlogSvr集群的数据断定Pending Binlog是否已经被复制。如不雅未被复制则大年夜Binlog File中删除。

应用BinlogSvr集群(靠得住日记存储),使得Master(重启时检查本地Binlog是否和BinlogSvr集群的数据一致)和Slave(大年夜BinlogSvr集群中获取Binlog)的数据保持一致,大年夜而包管了全部集群中的MySQL主备间数据的一致性,如图8所示。

图8 实现一个靠得住日记存储包管各MySQL的数据一致

【请求透传】

在Master进行切换时,切换操作可能会导致部分MySQL Client仍然拜访旧Master并读到旧数据。

下面将解释MySQL在重启时不履行半同步会产生数据不一致的原因。

最直不雅的办法是修改MySQL Client API,在每一次进行萌芽时,先确认当前Master的地位。但此办法有以下缺点:

  • 须要保护一个MySQL Client API的私有版本,保护成本高。
  • 所有的调用端须要集成这个私有的MySQL Client API,操作成本很高。

为了避免修改MySQL Client API,可经由过程增长Proxy进行请求透传来解决上述问题。在每一个MySQL结点上增长一个Proxy,MySQL Client的请求不再直接拜访MySQL而直接拜访Proxy。Proxy根据Master的地位,将拜访Slave机械的请求透传到Master机械,再进行MySQL操作。

经由过程增长Proxy进行请求透传,解决了MySQL Client决裂导致有可能攫取到旧数据的问题,如图9所示。

图9 实现一个靠得住日记存储包管各MySQL的数据一致

【主动选主】

【Proxy(PhxSQLProxy)】

多机主动选主最常见的实现方法是由各个介入者提议投票,获得多半派支撑的机械为Master,同时把Master信息记录到靠得住存储。Master机械按期到靠得住存储延长租约;非Master机械按期检查Master租约是否过时,大年夜而决定是否要提议选举本身为Master的投票。

为了避免修改MySQL代码,在MySQL机械上增长一个Agent,由Agent来替代MySQL提议选主投票和续期租约;靠得住存储持续由BinlogSvr承担。

Agent完成以下功能:

  • Master机械的Agent监控本机MySQL是否正常办事;如不雅正常办事,则按期到靠得住存储延长租约,不然停止续约。
  • 非Master机械的Agent按期大年夜靠得住存储检查Master租约是否过时;如不雅过时,再检查本机MySQL是否已经履行了所有Binlog。如不雅已经履行了所有Binlog,则提议选举本身为Master的投票,如图10所示。

图10 靠得住日记存储和Agent合营实现主动选主机制

当Master出现故障且产生Master切换时,因为原生MySQL缺乏调用端的通知/重定向机制,使得不合的Client可能拜访不合的Master,导致数据的缺点写入和攫取,如图6所示。

PhxSQL架构和实现

大年夜上述思路可以得出PhxSQL的简单三层架构。对于每一个节点,安排3个模块(PhxSQLProxy,MySQL,PhxBinlogSvr)。多个节点上的PhxBinlogSvr构成一个靠得住的日记存储集群和靠得住的Master信息存储集群;PhxBinlogSvr同时承担Agent的义务。PhxSQLProxy负责请求的透传。Master结点上的PhxSync负责将MySQL的Binlog发送到PhxBinlogSvr,如图11所示。

图11 PhxSQL根本架构

请求透传是Proxy重要的功能。重要解决在进行Master切换的时刻,MySQL Client会被决裂,不合的Client可能连接到不合的MySQL。导致出现MySQL Client写入数据到缺点的Master或者大年夜缺点的Master攫取到缺点的数据。

Proxy的请求透传分两种:

  • 读写端口请求透传:Slave节点收到的请求透传给Master节点履行。Master节点收到的请求直接透传给本机MySQL履行。
  • 只读端口请求透传:Master节点收到的请求透传给Slave节点履行。Slave节点收到的请求直接透传给本机MySQL履行,如图12所示。

图12 Proxy请求透传流程

高机能:因为Proxy接收了MySQL Client的请求,为了使全部集群的读写机能接近单机MySQL,Proxy应用协程模型进步自身的处理才能。

Proxy的协程模型应用开源的Libco库。Libco库是微信团队开源的一个高机能协程库,具有以下特点:

  • 用同步方犯写?码,实现异步代码的机能。
  • 支撑切切级的并发连接。
  • 项目地址 https://github.com/tencent-wechat/libco

完全兼容MySQL:为了已有的应用法度榜样可以或许不做任何修改就能迁徙到PhxSQL,Proxy需兼容MySQL的所有功能。


  推荐阅读

  阿里云VPC产品详解

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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