在编者看到“【重磅】微信开源PhxSQL:高可用、强一致的MySQL集群”时,由衷赞叹,这等造福广大DBA及运维同仁的事情,真心赞。腾讯及微信的开放,真的不是说说而已。

本文由资深DB从业者撰写,相信其本意更多聚焦在技术的逻辑性,及引发的思与辩。祝愿PhxSQL越来越好,让世界看到中国开源的力量。

导语

今天微信在微信朋友圈发表了其在MySQL领域实现的一套高可用、强一致的集群方案,顿时朋友圈刷屏,都在啧啧称赞。

有些人转发是用来Mark一下,留着后面细细品尝,有些人应该是看过了,说是高质量的开源,而还有一些人,说是有Galera或者group replication的味道。

在我知道这事儿之后,心里很高兴,觉得太强大了,想必是一个非常好的方案,首先要感谢微信团队,在开源的路上又带了一个好头。

在看完之后,我心里面是忐忑的,因为目前所能看到的实现架构或者支持的功能与朋友圈转发的架势来看有很大的出入,所以关于微信的这个开源,我问了一下我周边的朋友,我说为啥这个这么火?

我自己觉得有两方面的原因:

  • 一是微信开源这个动作本身,微信在国内的影响力太大了。

  • 二是这个MySQL解决方案,MySQL太需要靠谱的高可用和一致性解决方案了,目前来看,还无出Galera其右者。

腾讯最近在这方面做了很多工作,开源了不少产品,这是值得庆贺的,这是圈内的福利,圈内的良心,如果非常火,这是有道理的,这是圈内的正能量,我一直希望有更多的公司或者个人,能开源更多的好产品,一起进步一起成长。

我花了一个下午的时间认真研究了一下PhxSQL,优点已经在别的文章里面都说得很多了,我就不再赘述了。

从技术方案的角度来看,我来说说在研究或者将来计划使用PhxSQL的话,有什么需要注意的地方。

时间比较仓促,也许有理解不对的地方,也请大家支招。现在还没来得及看代码,以后如果有机会继续深入研究的话,可以在后续文章中加以说明。

我觉得大家在研究的时候,要注意以下几个部分:

一、 架构很复杂,部署一套需要很多模块

这个是很明确的,图1中可以看到phxSQL的架构,原本一套集群只有MySQL三个节点,现在加入了两个新的服务:Phxbinlogsvr、Phxsqlproxy。

很明显,模块越多,整个集群的故障率就越高,不可靠性就越高,部署这么一套集群需要多久?

需要考虑入手门槛。

模块多了,机器压力及相应成本就增加了,同时DBA需要运维的对象就多了,压力变大了,这都是需要考虑的问题。

二、究其根本,还是主从复制机制,摆脱不了这种机制下的弊端

有些评论说到了,其实现架构有Galera或者group replication的味道,在我研究之后,这两者之间还是差距比较的大。

说白了,PhxSQL还是主从架构,只是将原来的Binlog从主节点复制到从节点的架构,修改为从主节点,复制到Phxbinlogsvr集群,然后MySQL从节点再从Phxbinlogsvr中拉取。

这样的实现方式,增加了中间一层服务,势必数据复制的延迟时间就会有所增加,主从延迟之后,还如何能做到对用户无影响的随意切换呢?

或者说,如果当前正在主从延迟(司空见惯了),那自动切换程序如何选择?等待?还是强制切换?

这种情况下,要么牺牲一致性,要么牺牲可用性,很难做到像Galera那样的两全。

三、单点写入,不支持多点写入

接着上面说,Galera或者group replication,最大的革命是支持了多点写入,这个特性我认为是最大的最有意义的特点。

因为目前在MySQL主从复制的方案中,我们所做的高一致性的工作,都是因为不能双写(单点写入)所导致的,而支持了多点写入即可实现对应用程序零影响的去运维了。

而PhxSQL的多点写入,从架构图1中可以看出,支持的多点写入是通过中间层来转发的,中间层Phxsqlproxy还是找到了写节点,将写入打到Master上面,这完全不是一个概念。

如果我想主动切的,还是要把当前的Master设置为Readonly,然后找到新的Master取消Readonly,然后继续写入,那这样势必影响了业务。所以主从复制的模式先天性的不支持多点写入。

四、除了不需要回滚这个特点之外,与半同步无异

从宣传文章中的图2.1来看,这个图所示的是我们平常所使用的半同步的示意图。

上图是我们每个人都熟悉的,而我们可以看看PhxSQL的图2.2。

很明显可以看得出,这个有点像5.7中的等待多点节点ACK的半同步了,但这里等待的是Phxbinlogsvr返回的ACK。

是的,在使用了Paxos协议的情况下,Phxbinlogsvr会向其它几个节点复制Binlog,但集群中只有3个节点的情况下,必须要等其它2个节点的ACK,不然不能超过半数。

那么此时和3个节点的半同步相比,性能似乎也没什么太大的区别。所以从这个图中可以看到,实际上实现的架构就是半同步。

另外,宣传文章中说到了,PhxSQL可以保证的是从库节点不回滚,这个说法我是支持的,半同步确实有时候是需要回滚的,PhxSQL解决了这个问题。解决方案是,针对Master,可能还是存在回滚数据的可能性的,但对于Slave,只需要补数据即可。

但我的疑问是,用这么复杂的架构来解决这个回滚的问题,有多大产出比?

五、Binlog存储到Phxbinlogsvr后,如何实现并行应用

这个算一个问题,在MySQL5.6中,至少是可以并行复制的,或者5.7的话,更好的并行复制。

而在PhxSQL中,因为中间插入一个Phxbinlogsvr,那从Phxbinlogsvr到MySQL的应用,是如何支持并行的,是像原生的把Phxbinlogsvr做为一个主库,向MySQL从节点Send,让MySQL用原生的复制?还是自己做了新的开发?

六、监控由谁来做?

上面已经说过,这么一个复杂的架构,每个模块本身的存活及健壮性如何保证,也就是它们的监控程序如何来做,监控程序是否可以做到公布式的监控?或者这个监控就是相互监控?

这也算一个问题吧,因为监控是集群健壮性必不可少的一部分。

七、和中间层加半同步的区别

最后一点,如果舍弃半同步的数据回滚(假设可以接受),那如果和一个中间层加上半同步的实现方案相比,优势在哪里?

微信最新开源的PhxSQL的更多相关文章

  1. 从mysql主从复制到微信开源的phxsql

    严格的来说,微信开源的phxsql不是数据库,而是一个数据库的插件: 传统的互联网数据库结构一般是这样的: 服务访问数据库是通过分片来的: 除了这种基于hash的分片,还有一种基于range的分片方式 ...

  2. 微信最新跳转浏览器功能源码,实现微信内跳转手机浏览器访问网页url

    微信最新自动跳转外部浏览器下载app/打开指定页面源码 源码说明: 适用安卓和苹果系统,支持任何网页链接.并且无论链接是否已经被微信拦截,均可实现微信内自动跳转浏览器打开. 生成的跳转链接具有极佳的防 ...

  3. [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】

    [教程]微信官方开源UI库-WeUI使用方法 [ 教程]微信官方开源UI库-WeUI使用方法 地址:http://www.weui.org.cn/?/article/1 微信公众号开发-WeUI使用说 ...

  4. 来自后端的突袭? --浅尝最新开源的C# Web引擎 Blazor

    在今年年初, 恰逢新春佳节临近的时候. 微软给全球的C#开发者们, 着实的送上了一分惊喜. 微软正式开源Blazor ,将.NET带回到浏览器. 这个小惊喜, 迅速的在dotnet开发者中间传开了. ...

  5. 来自后端的突袭? --开包即食的教程带你浅尝最新开源的C# Web引擎 Blazor

    在今年年初, 恰逢新春佳节临近的时候. 微软给全球的C#开发者们, 着实的送上了一分惊喜. 微软正式开源Blazor ,将.NET带回到浏览器. 这个小惊喜, 迅速的在dotnet开发者中间传开了. ...

  6. 开包即食的教程带你浅尝最新开源的C# Web引擎Blazor

    在今年年初,恰逢新春佳节临近的时候.微软给全球的C#开发者们,着实的送上了一分惊喜.微软正式开源Blazor,将.NET带回到浏览器.     这个小惊喜,迅速的在dotnet开发者中间传开了.201 ...

  7. 开包即食的教程带你浅尝最新开源的C# Web引擎 Blazor

    在今年年初, 恰逢新春佳节临近的时候. 微软给全球的C#开发者们, 着实的送上了一分惊喜. 微软正式开源Blazor ,将.NET带回到浏览器. 这个小惊喜, 迅速的在dotnet开发者中间传开了. ...

  8. 如何使用 TDengine 2.0 最新开源的集群功能?

    导读:8月3日,TDengine 发布了 v2.0 版本,这次更新最大的亮点是,我们将分布式集群功能开源.开源后,引起了很大反响,又连续几天在 GitHub 趋势榜排名第一.不少关注TDengine的 ...

  9. 微信官方开源UI库-WeUI

    概述 WeUI是一套同微信原生视觉体验一致的基础样式库,为微信Web开发量身设计,可以令用户的使用感知更加统一.包含button.cell.dialog.toast.article.icon等各式元素 ...

随机推荐

  1. P1823 音乐会的等待

    题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...

  2. JavaScript中逻辑运算符的使用

    逻辑运算符用于对一个或多个布尔值进行逻辑运算.在JavaScript中有3个逻辑运算符,如下表所示. 运算符 描述 示例 && 逻辑与 a && b  //当a和b都为 ...

  3. NoSQL与关系数据库

    关系型数据库:完全支持关系代数理论作为基础:有较大的数据规模:固定的数据库模式:查询效率快:强一致性:数据完整性较易实现:扩展性一般:可用性好. NoSQL:部分支持关系代数理论作为基础:有超大数据规 ...

  4. Memcached通信协议

    英文水平很烂,做梦都想着能把英语学习,可以使用一口流利的英文和洋鬼子交流,顺便忽悠下自己的同胞.没有地方学习英语,看还可以,网上有很多关于计算机的英文文献,写还行,说就完全不可能了.在以后的工作中慢慢 ...

  5. Hive扩展功能(二)--HWI接口

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...

  6. mongodb Shell 启动

    开始运行mongodb 准备 上篇说过,通过brew安装的程序目录在 /usr/local/Cellar下面 下面,我们先看一下 mongodb的可执行程序命令 cd /usr/local/Cella ...

  7. RabbitMQ - Publisher的消息确认机制

    queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consumer处理呢?毕竟对于 ...

  8. vue学习总结(简单介绍)

    声明式渲染 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: <div id="app"> {{ message }} < ...

  9. form表单中只有一个input时,按回车键后表单自动提交(form表单的一个小坑)

    form中只有一个input按回车键表单会自动提交 在一个form表单中,若只有一个input,按回车键表单会自动提交,但是当表单中存在多个input时,按回车键不会执行任何操作,这是form表单的一 ...

  10. Android studio 开发一个用户登录界面

    Android studio 开发一个用户登录界面 activity_main.xml <?xml version="1.0" encoding="utf-8&qu ...