sherrywong0 2017-10-20
《沉淀》是云栖社区展示专家风采的人物栏目。它呈现每个专家独一无二的人生经历、认识和感悟的同时,也能帮助你沉淀技术,收获对技术和人生的判断。我们的想法是:“若你想精进为一个很厉害的人,不妨细细品味这些技术牛人背后的沉淀。”如果你想了解这些云栖专家更多分享时,请点击云栖专家频道,当然我们也欢迎你往前走一步,成为我们的云栖专家(https://yq.aliyun.com/expert),与技术大牛一起“煮酒论英雄”。
技术人是怎样的一群人?一千个人,或许有一千个答案。毋庸置疑的是,做技术是辛苦的。
有位大牛在《技术人的慰藉》一文中这么描述到:“一个人,一台机器,相对无言,代码纷飞,Bug无情。须梦里挑灯,冥思苦想,肝血暗耗,板凳坐穿。世界繁华竞逐,而你独钓寒江,看尽千山暮雪,听彻寒更雨歇。”
然而,再怎么清苦,在王骞的眼中都是过眼云烟。他的人生,只关心一点——要做技术。只要能够做技术,他就是开心的,生活就是圆满的。
在外人看来,这位性格颇为内向,看起来低调的技术人,却做了一件很高调的事情——成功推动RDS分布式数据库HybridDB for MySQL上线公测,并在2017年成功商业化。这个可以同时支持OLTP和OLAP,提供了10T到1P解决方案的数据库,完善了阿里云RDS团队的产品族,具备了向专业评测机构Gartner定义的数据库魔力象限冲刺的能力。当前,HybridDB for MySQL在线上已经积累了600+DB机器,总数据库规模3.5PB,日常流量3GB/S。
采访中,王骞是那种一个问题,片言只语就完事的人,这对访谈者来说有点不“太友好”——总有一种意犹未尽的感觉。从另一面来看,也正是这种“不友好”,让笔者发现王骞那种寥寥数语点出问题实质的能力,以及在解决问题上给别人的启发。
云栖社区第16期《沉淀》人物栏目,访谈的是阿里云数据库高级技术专家王骞。我们一起看看这位早期在阿里淘宝核心系统做数据库,后续跟随霸爷来到阿里云做数据库的技术人,究竟有哪些沉淀。
入坑数据库
王骞表示,技术问题经过缜密的分析和论证后,最终都能有解决办法或折中,最难的是一位技术Leader,如何做正确的事,实现技术的价值
王骞,花名“皓庭”,2011年毕业于四川大学。毕业后入职淘宝核心系统,参与数据库内核和数据库云服务化等方面的研发。
当时,他的工作主要是两方面: 一个是分析Innodb/Tokudb/Ndb Cluster三个存储引擎的源码,对比异同,找出分布式数据库的选型。另外一个工作是将当时刚刚开源的Tokudb存储引擎源码,Build为一个淘宝服务器上可运行的版本,并服务于聚石塔历史库用户。
Tokudb是一个压缩率高,Insert性能强悍的事务存储引擎。由于当时Tokudb源码依赖很多,整套工具链都要重新搞,所以比较繁琐。但好在王骞就是一个认真严谨的人,他会追着一个目标一直做下去。因此,工具链繁琐对于他而言,并不是什么事。
事实证明也的确如此,繁琐对他而言什么都不是。最终这个引擎成功上线,服务了一些数据量大、写多读少的用户。
后来,王骞跟随大团队来到阿里云,从事分布式和数据库相关的工作。
RDS锤炼
阿里云RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务。基于阿里云分布式文件系统和高性能存储,RDS 支持 MySQL、SQLServer、PostgreSQL 和 PPAS引擎,并且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。
这款全能选手数据库的研发工作中,就有王骞的身影。回顾研发过程,王骞表示,中间遇到很多困难,其中最典型的是解决大量游戏用户连接闪断的问题。这是RDS团队当时一个痛点,而为了解决这个问题,2014年春节前后,他们投入大量人力,通宵钻研解决方案。
作为RDS提升产品稳定性的一个重要项目,王骞当时负责编写一个分布式一致性缓存。这个缓存既要保证RDS管控系统与Proxy元数据间多级级联的数据一致性,又要解决集群脑裂问题,还要在集群与外界断连时有自治能力,复杂度颇高。
攻坚战后,大家最终研发出新的防闪断haproxy,避免在后端MySQL主备切换时影响用户的前端连接。“RDS团队在三周内就攻克了整个项目,年后发布上线也收获了很好的口碑。”王骞几句话,就把短时间攻破项目的惊心动魄一带而过。而在这背后,分布式一致性缓存是怎么解决的?脑裂问题是如何破解的?除此之外,还有哪些问题?
技术人的世界,非常简单。王骞没有做任何情绪铺垫,而是直接告诉云栖社区,他是如何解决一致性缓存问题的:“我设计了多级级联的分布式一致性协议——第一级为支持分布式事务的三节点中心缓存,三个节点都可以接受服务,每一次变更都有一个递增版本号,在多数派上提交后即可返回,这样可以支持强一致;第二级为每链路服务Proxy的本地元数据缓存,每次中心缓存提交后,也会立即向proxy本地缓存同步,这个过程是最终一致的,多个proxy节点间可能存在短暂的不一致。”
至于脑裂,主要分为两种,一种是以中心缓存脑裂,另外一种是Proxy节点脑裂。“中心缓存少数派节点出现脑裂时,可以在网络恢复时自动同步最近的变更,追上后可以继续参与提交。中心缓存多数派节点出现脑裂时,全局禁止变更服务,进入只读状态。外部控制器与中心缓存之间脑裂时,以中心缓存的数据为主,中心缓存全部失效后,则会从外部控制器同步所有持久数据。Proxy节点出现脑裂而导致中心节点无法同步数据,中心缓存会定期向Proxy本地缓存持续同步,保证最终一致性。”
和笔者梳理完问题解决思路后,他也提及问题解决过程中一些记忆深刻的事情。
令王骞最难忘的事情,就是分布式一致性缓存的不变式证明和各种边界测试。为了达到预期的设计,算法的每一块关键实现都要进行覆盖。而且要模拟各个场景,正交的测试Case,经过合并后仍然有60多个。这也就意味着,王骞需要利用各种方式,包括利用iptables控制网络来模拟脑裂、强制破坏活动进程来构造非预期failover场景等……过程的艰辛,可想而知。王骞废寝忘食测试完后,稳定性得到检验,项目也终于按期上线。
实例的迁移、Insert性能和写入性能——数倍,甚至数十倍的提升
2016年,王骞带领他的团队开始进行阿里云分布式HTAP数据库产品HybridDB for MySQL的研发工作。
HybridDB for MySQL是一款分布式HTAP数据库产品,用户无需维护复杂的外部组件进行性能扩展,因为在一个数据库内,它同时支持OLTP和OLAP业务——支持在线扩容,提供MySQL的使用生态。
之所以开发这样的数据库,主要是为阿里内部业务提供一个实时的高标准数据仓库。比如拥有PB级的容量、支持高写入能力,以及在线查询和分析能力,能为集团内的多个业务提供大数据支撑。在起初,这个数据库并不叫HybridDB for MySQL,而是命名为PetaData。对于为什么改名,王骞解读称,这是因为PetaData 落地后,Gartner又提出了HTAP数据库的概念。这和PetaData的方向十分契合——都是融合OLTP与OLAP。“为了体现混合能力和MySQL生态两个方面,产品就由PetaData改为了HybridDB for MySQL,以突出其特点。”
2017年,HybridDB for MySQL正式商业化。而在商业化后不久,它就为用户提供了10T到1P的数据库解决方案,并且在线上已经积累了600+DB机器,总数据规模达3.5PB,日常流量3GB/S……
看完这些靓丽的数据,不禁让人好奇:这样一款成功产品的背后,开发过程中都遇到哪些技术挑战?
王骞告诉云栖社区,开发中的困难集中在两方面。一方面是存储节点的迁移和副本重建问题。在HybridDB for MySQL的部分大用户中,一个存储节点数据量就高达1T+,入库流量10MB/s,实例迁移遇到了很大的挑战。另外一个问题是存储引擎在多索引下的高insert问题。数据库的存储引擎为了事务化的维持多个索引间的一致性,需要同时检查多个索引的数据内容,并与主表一致变更,这个过程会产生大量读IO。
存储节点的迁移和副本重建问题是如何解决的?王骞说,他设计了全新的流式迁移技术,并综合考虑迁移过程中可能存在的各种导致磁盘空间占满等异常状况,从而最终解决了这个问题。言语之间看似轻巧,如果没经历过,你永远都不会发现这件事的难度有多大。进一步追问王骞后,你会发现“全新”流式迁移技术背后是这样的组合拳——源实例全量快照备份直接在主机间对传、 全量快照传输时实时上传Binlog日志、使用并行binlog下载和MySQL并行复制来加速增量同步、使用万兆网机器增加网络带宽。
整套方案下来,1T实例的迁移,由过去的近5天,大幅优化到4个小时。
解决存储引擎在多索引下的高Insert问题,更像是在做一道证明题。 通过一系列复杂的理论论证和分析源码,王骞发现Tokudb的代码本身支持他们需要的特性,但是代码中有一些Bug,导致无法直接使用。
通过解决Bug,最终在Tokudb上实现了某些场景下消除多索引读IO的方案,并使得这些场景下带多索引的Insert性能提升一倍以上,多索引表的写入性能,由3000+提升到40000。
拥趸“老板很满意”的背后是产品存储体系的领先
HybridDB for MySQL除了易用性和生态完善外,也有使用成本低。一位拥趸感谢HybridDB for MySQL帮他们公司节省了大笔IT开支:”老板很满意。”
“对于大规格用户,HybridDB for MySQL节点、售价比同规格的RDS实例要便宜三分之一左右。 ”在这个基础上,还有设计上的考量,也能让用户减少开支。王骞解读:“按照经验数据来算,一份数据,在Innodb存储引擎下会有数据膨胀的问题,通常会膨胀到1.5倍,而在HybridDB for MySQL的Tokudb存储引擎下,则会被压缩,通常压缩比是3-15倍,这会令用户的存储成本大幅降低。 其次,用户可以使用一份数据同时解决OLTP和OLAP的问题,无需分库分表中间件、数据同步以及额外的分析数据库。 ”
用户使用成本得到大幅降低的背后,是产品存储体系的领先。
第一代存储体系,是基于SSD盘的对机存储,成本较高,且机器损坏后只能成对替换,典型用户是早期的性能数据业务;第二代存储体系,是基于混合磁盘的单机存储,集中优化了成本和性能,利用块存储团队提供的Bcache方案,基于混合存储机器设计了低成本高性能的存储体系,典型用户是天象。
目前HybridDB for MySQL已经经历了RDS的两代存储体系,现在正在进入第三代共享存储体系阶段。“最新的存储体系,是基于RDS的共享存储体系,消除了传统的迁移问题,同时大幅度提升IO性能。”王骞道出领先的根本原因。
HybridDB for MySQL如此成功,那未来还打算怎么做?
王骞分享三点:
支持列存索引加强OLAP能力;
支持分布式事务加强OLTP能力;
支持共享存储降低运维难度;
“锋芒毕露”
访谈中,和阿里云数据库团队的产品运营负责人晓哥有过几次沟通。她告诉我,王骞工作非常认真,但就是太低调了,让人觉得他性格比较内向。她提醒我,如果可以,一定要多聊几次。
尽管王骞的确有点内向,但和王骞的多次接触中,笔者发现,有一样东西却是“锋芒毕露”的——做正确的事情。
为什么是这样?他缓缓道来:“计算机和互联网行业发展太快,如果不做正确的事,那么很容易被淘汰,专注、持续的去做,才能让我们紧跟行业的变化,不断迎合用户的需求,站在行业前端。”
何谓正确的事,王骞是这么定义的:
首先,要选对方向,确定所做的事情是在互联网行业发展的方向上;
其次,要找到志同道合的人一起做,一起发展,懂得分享;
最后,要坚持将这些事情不断打磨到最好;
那落在一位技术Leader上,什么是正确的事?王骞说,要极技术,也不技术。“从一行行的代码,变成肉眼可见的服务,需要解决的远远不止是技术问题,任何一个环节的缺失,都有可能让产品口碑受影响。”因此,在技术上,“我便不再纠结于某项高深但复杂的技术,而是倾向选择实现、部署、运维都比较简单的方案,毕竟减少旁支干扰,才能集中精力做正确的事。”
这位曾经醉心于技术的互联网从业者指出,技术问题,经过缜密的分析和论证后,最终都能有解决办法或折中,最难的是一位技术Leader,如何做正确的事,实现技术的价值。
法国哲学家布莱斯·巴斯卡说过一句话:“把什么放在第一位,是人们最难懂得的。”记住,无论任何都要做正确的事(本期接受访谈的云栖专家/皓庭;文/我是主题曲哥哥)。