图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的所有功能。
推荐阅读
【51CTO.com原创稿件】跟着云计算的快速成长,收集问题争议赓续,为懂得决云上租户收集隔离问题,VPC(专有收集)应运而生,VPC也被认为是将来的趋势。那么,阿里云的VPC是若何赞助用户解>>>详细阅读
地址:http://www.17bianji.com/lsqh/34798.html
1/2 1