Phx比武大会即将开始啦!今天,来自微信后台团队的三位剑客正跃跃欲试,将在各位朋友的见证下上演一场精彩的对决。小编想想都觉得很刺激呢。
在比赛开始之前,我们先来了解一下他们的幕后老板——微信后台团队。过去的数年时间里,微信后台系统从无到有,为了满足微信庞大用户群和海量数据的业务需求,不断迭代优化,形成成熟的技术并开始在公司内分享。从小步慢跑到快速成长,经历了平台化到走出国门,微信交出了一份优异的答卷。
现在,微信后台团队也紧跟开源步伐,一下子带出了三位武林高手:轻便简洁的PhxRPC框架,基于Paxos协议的多机状态拷贝类库PhxPaxos以及分布式数据库服务PhxSQL。下面,我们将深入了解这几位选手,看看他们都会展示什么令人惊叹的必杀技?
PhxPaxos(GitHub上他的传记:https://github.com/Tencent/phxpaxos) 是腾讯公司微信后台团队自主研发的一套基于Paxos协议的多机状态拷贝类库。它以库函数的方式嵌入到开发者的代码当中, 使得一些单机状态服务可以扩展到多机器,从而获得强一致性的多副本以及自动容灾的特性。 这个类库在微信服务里面经过一系列的工程验证,并且我们对它进行过大量的恶劣环境下的测试,使其在一致性的保证上更为健壮。
互联网海量服务下的一些敏感的业务场景中(UIN核心资料信息 or 金融数据存储),同时对数据安全(一致性)和可用性有很高的要求。可用性要求数据多机冗余,而一致性要求不管集群里的存储机器在任何苛刻条件的环境,包括宕机,主备切换,超时丢包,网络隔离,Client都可以从这个集群里读取一致的数据。于是产生了比较高的技术难度。
业界如MySQL/Oracle的1主N备在这块的方案都面临 "最大可用(Max Ava)" 与 "最大保护(Max Protect)" 模式之间的选择。最大可用表示主备之间的同步是一种尽力而为的行为,如果备机宕机时则主机单独提供服务,这表示备机宕机并主备有切换时可能会有数据不一致的情况。最大保护即备机寄机时,强行等到备机可用时再恢复对外的服务,虽然保证数据不丢,但基本放弃了可用性。
而基于Paxos协议的数据同步与传统主备方式最大的优点在于,Paxos只要保证任意超过半数的副本在线且相互通信正常,就能保证服务的可用,且数据绝不丢失。裁剪和简化后类Paxos协议和实现可以接地气地用到很多2C的互联网业务开发中,让自己在后续开发中能灵活运用相关的思路去设计一致性和可用性问题的解决方案。
上图为抽像后的框架大体模块架构,简述如下:
raft代码简单而且开源,为啥不用,却要自研paxos?
虽然raft开源,facebook也在使用,但paxos真正理解后实现起来其实更为简单优雅,而且具有大神经典论文的数学证明,更有google和microsoft多年大规模使用作为证明。另外,自己研发的paxos,更能根据存储的特点进行各方面的定制化。微信海量用户的特点,促使在存储方面有大数据高性能的需求。经过微信后台团队的潜心钻研,基于PhxPaxos定制的强一致、高可用、高性能的PhxSQL便横空出世。
PhxSQL(GitHub上他的传记:https://github.com/Tencent/phxsql) 是在MySQL为基础,搭建的一套MySQL分布式系统,涵盖了自动容灾处理,自动数据同步等机制,全程自动化,解救那些被MySQL深深折磨的运维和开发。
互联网应用中账号和金融类关键系统要求强调强一致性和高可用性。当面临机器损坏、网络分区、主备手工或者自动切换时,传统的MySQL主备难以保证强一致性和高可用性。PhxSQL将MySQL集群构建在一致性完善的Paxos协议基础上,保证了集群内MySQL机器之间数据的强一致性和整个集群的高可用性。
1. 支持完整的MySQL功能、客户端无需修改 2. 可完整理论证明的强一致性
总而言之,PhxSQL的优势在于MySQL整个集群的备份和容灾全自动化,近乎0运维介入,大大的减少了人力物力,有效的减低运维成本和提高了服务的可用性。
PhxSQL架构分3层, proxy、percona(MySQL)、binlogsvr。由它们组成的整套服务,部署在同一个机器上。
MySQL的binlog有两种,一种是基于binlog文件名加offset,一种是基于gtid。由于binlog文件名在每一台MySQL上都可能不一样,这种模式下会出现很多问题。因此MySQL的数据同步大多都是基于gtid。
什么是gtid?gtid是以MySQL结点的uuid加上结点的sequence来命名,可以达到全局唯一的效果。全局唯一的特性,和对于一个uuid的sequence的单调递增性,对于binlog是一个很好的设计。同步binlog数据的时候,根据gtid就能很容易的做到去重,查找等操作。
Master有自己的租期,Master通过paxos来进行heartbeat完成续租。当租期到期时,重新选择新的master。当master发生故障时,由于master的租期问题,会在租期期间服务出现无master的状态。但通常租期只有几十秒。通过heatbeat来续租,可以使一个master在无故障状态下一直持有master身份。
由于master的切换是通过paxos来完成,具有原子切换的效果,因此当master出现故障时,旧master租约过期,新master被选举出来。旧master所对应的proxy将会马上重定向到新的master所对应的proxy,达到自动寻找master的功能。
PhxSQL binlogsvr的master自动管理加上PhxSQLproxy的自动路由,实现了自动容灾的功能,期间不需要运维的任何介入。
由于paxos的有序性,很容易可以得知每一个gtid的发送先后,因此每一台MySQL下发的gtid的顺序是一致的,且gtid的可去重性,起到了下发的数据是幂等的效果。保证了每一台MySQL slave的下发数据和master的提交数据是完全一致的。
MySQL的提交,类似乐观锁的机制,每次提交带上本地存储的最新gtid。由于binlogsvr基于paxos存储gtid的原子性和有序性,根据带上的gtid判断是否以最新版本的数据为基础进行提交,防止提交的并发性和落后性。此外,MySQL支持墙头query。当master在写完binlog后发生故障导致binlog未能成功同步到binlogsvr时,在该master重启时会主动回滚该query。
PhxSQL有PhxSQLproxy的前端路由,能很好的保护slave不会被无故写入,造成数据上的错乱,使得MySQL能真正实现事务上的序列一致性。PhxSQL保证了MySQL的本地binlog是binlogsvr的binlog的一个子集。
MySQL的groupcommit特性:master的多次写操作能被合并提交到binlogsvr进行binlog同步。
binlogsvr经过paxos同步到其他binlogsvr。Paxos协议只需要一次RTT时间。Binlogsvr数据同步后会写到binlogsvr自己的db,且paxos协议也会写操作记录到自己的db。这个过程会产生两次磁盘的读写。但paxos的协议需要fsync磁盘而binlogsvr的写入不需要fsync磁盘。因此fsync次数为1。
因此,在整个binlog同步机制中,网络延迟为1个RTT时间,写盘次数为2次,fsync次数为1次。经测试,binlogsvr的写入性能可以达到1w/s。
接下来,将会请出本次比武大会的最后一名选手,一个远程过程调用(RPC)框架——PhxRPC(GitHub上的传记:https://github.com/Tencent/phxrpc)。 微信后台的RPC框架svrkit久经考验功能齐全,支撑了庞大的业务。而PhxRPC提供了一致的接口形式,轻便简洁,上手和维护成本都很低。
相比grpc,PhxRPC的优势是啥?
一般使用RPC框架的业务对性能的要求都不会到极致,而更多追求的是开发效率,所以RPC框架之间的优势对比在现在来说其实已经微乎其微。而更应该关注的是上手成本以及维护效率,这也属于开发效率的一环。如果只是抱着玩玩的心态,任何RPC框架都是一个不错的选择,但真正用到业务上,首先必须得做的就是搞懂这个框架的每一行代码,这样当你的业务出现过载或者各种异常的时候,你才有办法快速得到解决方案。正如文章开头所言,PhxRPC小巧简洁,仅server端核心代码也不到1000行,这能大幅提升运维效率。当然从功能性来说远不比grpc全面,但如果刚好够用,PhxRPC绝对是非常好的选择。选RPC框架,简单适合的小轮更胜于复杂庞大的大轮。
微信后台选手的“亮剑比武”大赛到此结束啦,相信各位朋友对每位选手的精彩展示都赞不绝口了吧?如果你仍意犹未尽,小编可以悄悄告诉你,前往Tencent的GitHub账号(地址:https://github.com/Tencent,点击阅读全文可快速访问) 可以读取他们的“武功秘籍”哟!想要修(xue)炼(xi)的心都按捺不住呢!记住,秘籍不白拿,记得点个star!
PhxPaxos
PhxSQL
PhxRPC
转载自【腾讯开源】公众号,腾讯官方开源资讯,期待您的关注。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。