他是业界主流数据库技术会议的明星讲师,开源社区各种分享活动的活跃分子;他累计申请了10多个技术发明专利,已授权8个;他近一年发布60多篇高质量技术博客文章,阅读量数十万;他和团队对MyRocks的优化实践,被网易技术委员会评选为年度大奖;他与同事合著的《MySQL内核:InnoDB存储引擎 卷1》在京东上销量超6.3万,好评率达98%……
他是温正湖,网易杭州研究院(网易杭研)数据库技术专家。很少有人知道,他其实是半路出家的数据库大神,本科就读于浙江工业大学应用物理系,硕士是在浙江大学光电系。在本文中,温正湖讲述了他加入网易杭研转战数据库内核的故事,总结了解决数据库技术问题的硬核经验,并分享了从一个数据库小白成长到能够独立负责数据库内核并做出贡献的心得。
加盟杭研:挑战数据库内核开发
2013年,中国移动互联网爆发元年,各大互联网公司纷纷加强技术布局以迎接新时代,在华为杭研从事Linux内核存储开发的温正湖,得到了网易杭研的召唤。温正湖本身对稳健的网易以及热心教育、公益的CEO丁磊印象颇佳,又通过加入网易的前同事了解到了网易杭研的工作氛围和技术领域,大为意动。但摆在温正湖面前的是岗位的选择——他钟情的云硬盘开发工作已有人手,网易杭研希望他考虑数据库内核开发,因为有项目使用SSD做InnoDB的二级缓存。彼时温正湖固然有基于Facebook flashcache的SSD缓存项目经验,却对数据库知之甚少,“刚入职时连最简单的SQL都不会写”,所以,选择前者对于他而言更好过渡,选择后者意味着更大的挑战。温正湖的决定,是接受这个挑战。从大环境来看,2013年是MySQL数据库在国内走向兴盛的时候,彼时“去IOE”是一个热门话题。从个人的角度,温正湖认为,首先,数据库在生产和生活中都至关重要,能实实在在地看到其价值;其次,数据库技术是计算机领域最重要的基石之一,体系复杂,技术含量高,从事这样的岗位会有成就感;再者,在数据库相关岗位中,数据库内核开发跟Linux内核存储领域的关系最紧密,而且越底层通用性越强,更有挑战性。至于技术难度,已经被应用物理学专业毕业的温正湖抛到九霄云外——“四大力学都扛过来了,这个事情肯定也能做好”。
就这样,温正湖加入了网易,但他后来的工作,已经不仅仅是数据库内核开发,当然和他希望让工作产生更多价值的目标还是一致的。在他看来,数据库内核岗位虽然相比Linux内核存储更靠近用户,但如果把用户和内核存储的距离设定为100,那么数据库内核最多也就只前进了20。只有了解业务需求,开发的产品或功能应用到业务场景中去,才能真正产生价值,也才能真正获得成就感。
故而,在做了一年多数据库内核开发(InnoDB L2 Cache、Flashback等)之后,温正湖随着网易云计算的发展,开始从事网易RDS云服务开发。先是做了一个将数据库从物理机迁移到RDS上的管控服务(外部实例迁移功能),帮助成百上千个MySQL实例迁移到RDS上。
后来网易开始做公有云服务,温正湖主导了公有云RDS从云服务架构到用户控制台的改造、优化和提升。由于网易杭研DBA团队很晚才介入公有云的运维,温正湖有机会直接面对外部用户,并随着用户规模的增长得到了更好的锻炼。温正湖还记得,他和中顺易的DBA合作,帮助他们解决了不少问题,数据库团队还获得了中顺易的奖金激励。之后,他还负责了网易公有云MongoDB服务的设计、实现和运维,同时也负责了一段时间公司内部的私有云RDS服务。
2017年10月,温正湖重新回到数据库内核上来,负责网易MySQL分支InnoSQL的特性开发、线上问题定位,同时也负责定位解决MongoDB、Neo4j等数据库问题。温正湖表示,之前的工作经历和积累让他能够更好地做好数据库内核这块工作,但 多与业务、DBA和RDS团队接触与沟通仍是将工作做好的关键。
排忧解难:关键是建立知识体系
与问题打交道,温正湖将工作中遇到的问题分为三类:1、大部分问题其实都比较简单。比如其他同事来请教一些技术性问题,这类问题直接提供答案,或者通过代码或文档确认下即可。
2、还有数据库crash之类的问题。只要有core文件,那么基本上也是会有定位思路的。
3、比较棘手的是性能问题、OOM问题、数据库卡住或复制卡住、数据不一致之类的问题。
而对于分析定位故障问题,或者进行性能调优,温正湖认为处理方式基本上是共通的。他分享了以下“套路”:
首先,需要有足够的现场把控能力。通过各种方法和工具来采集尽可能多的现场信息,比如数据库自身的状态和日志。又比如通过GDB调试工具获取调用栈信息,还有系统的I/O、网络和计算资源状态和使用情况等。
其次,要擅于找茬。故障情况总是与正常状态相对应的。需要了解出现问题前发生过什么,做过什么改变,比如是不是数据库版本换了,是不是业务有新的SQL语句,参数配置是不是跟平时的不一样。找茬是为了发现可疑的线索,寻找突破口。
再次,最好有比较广的知识面。数据库类的问题,它可能是因为数据库自身的问题,也可能是所依赖的存储和文件系统,或者操作系统环境问题,甚至是硬件的问题。这些技术知识虽然不是必须的,若能有所了解,可能会事半功倍。比如之前分析过网易云音乐MyRocks性能突然下降的问题,其原因就是RAID卡故障,通过megasas工具能很快发现。
最后,丰富的经验积累也可以提高效率。一个问题第二次出现时,可能只需要确认是不是跟上次一样,无需重头再分析一遍。经验积累不能光靠脑子,还需要勤记。将脑子里的东西dump一份到可持久化的硬盘中,问题再次出现时,脑子里只需要有个索引,知道如何从硬盘里面找到对应的问题分析过程即可。
由于数据库相关技术点非常多,除非工作年限足够长,否则技术人员通常很难对每个技术点都有很深入的理解,温正湖认为,最重要的是要建立技术知识体系。他举例说:“面试时,我都会就事务的ACID属性,从这4个单词层层深入,真的可以问出花来,无穷无尽。”不苛求对原理掌握很好,但千万不能理解错误。
网易作为一家发展多年的大型公司,有成熟的技术体系和运维团队,因而在数据库层面惊心动魄的问题相对罕见,但团队在业务快速发展中还是会遇到一些棘手的问题,解决的方式离不开这些思路。温正湖举了一个MGR在考拉海购业务场景落地使用时的例子。
今年4月底RDS跨机房金融版服务开始在考拉上规模部署,在使用过程中发现某些场景下很大概率会出现某个节点mysqld OOM,已知和网络带宽有关,但问题出在哪些代码逻辑上还在测试和定位,非常恐怖的是,在和DBA一起测试定位过程中发现MGR还存在节点间数据不一致的情况。温正湖曾在2018年初遇到过一个故障切换导致的MGR数据不一致问题,花了两三个星期才定位解决。这次问题需要多久解决,他无法估算,唯一确定的是业务不能等。而网上的搜索也一无所获,让温正湖有种功亏一篑的挫败感。他在例行看MySQL最新发布的5.7和8.0版本release notes时惊喜地发现新版本修复了一个数据不一致问题,与当前遇到的问题极为相似,他马上将patch合到InnoSQL进行测试,果然有效。更让他兴奋的是,在分析已修复的MGR bug列表时,对前述的mysqld OOM问题也有了一些定位思路,通过不断测试验证最终找到了原因(温正湖后来在一篇博客文章中讲了这个OOM问题)。这让他在感叹“山重水复疑无路,柳暗花明又一村”的同时,又加深了一层感受: 一个成熟而强大的开源社区能够提升工作效率,减少重复的工作。
正因为如此,温正湖选择尽可能多跟MySQL社区互动,包括反馈bug并提供修复patch。近两年,温正湖团队已经累计向MySQL和Percona反馈了数十个bug,其中向MySQL提的bug主要跟MGR、XA事务和主从复制相关,向Percona提的bug主要跟MyRocks、SQL审计相关。
享受写作:在网易杭研的快乐成长
温正湖热爱生活,平时喜欢阅读历史、人文、地理和军事类的书籍杂志;也喜欢看电影、慢跑,周末步行去河边、江边、湖边或山脚游玩。但他更热爱的,还是技术写作,不论是技术专利,还是技术博客。温正湖技术博客中的文章都是从工作中来,有新技术调研总结,有源码阅读的梳理,也有数据库问题定位分析。他自豪地说:“能够写出这么多文章,说明我的工作是有内容和价值的。我认为,在不影响正常工作进度的前提下,有千万种理由写博客。”
他给出了自己坚持写博客的主要理由:
首先, 写文章的过程就是知识梳理的过程。可能某个知识点或某个问题,你认为已经懂了或解决了,可它在脑子里还未成体系,往往过段时间就记不清了。而写的过程需要你进一步去思考,去建立相互间的联系,就像是把一些孤立的点通过不同的边连接,变成一个四通八达的图。因此,写文章可以提升对要写内容的理解,这样有助于加深记忆,把别人的知识变成自己的积累。
其次,写文章有助于充分交流。温正湖目前维护了2个技术博客,分别是网易内部的数据库内核团队博客和知乎上的数据库内核专栏,分别针对公司内外。除了涉及到敏感信息,2个博客基本上是同步的。内部博客让更多的同事知道MySQL有哪些好用的功能,或者存在哪些问题,应当如何规避。同时也能够让各业务和产品知道公司内部谁在做数据库内核,遇到数据库问题或有新的需求能够快速对接。
在知乎建立专栏,在会议上分享数据库相关技术和经验,则是希望有一个技术交流平台和窗口。让温正湖高兴的是,到目前为止,专栏得到了不少数据库大佬的关注,也有不少同行加了微信说看了某个专题的所有文章,对工作有帮助。还有些知友对文章做了评论,起到了交流的作用,同时也认识了不少人。
再次, 写文章也是为了提高工作效率。在平时的工作中,很多同事,尤其是数据库云服务和DBA同学会找上来问各种各样的问题,对于一些经常会问道的问题,写成文章,下次有人问的时候,先扔一篇文章过去,不需要每次都被打断手头工作。
总结在杭研的收获,温正湖给出的关键词是“成长”。
首先,技术上的成长,从一个数据库小白成长到能够独立负责数据库内核并做出贡献。告别Linux内核存储的岗位,到来网易杭研做数据库内核开发,温正湖很快意识到,想做好数据库,光有存储背景是远远不够的,数据库在存储之上建造的知识体系才是最核心的,他需要从头开始积累。相信做数据库更有前景,所以他选择坚持下来,踏踏实实做事情,向身边每一位同事学习。
其次,作为个体的成长,更加懂得如何学习提高,如何平衡工作和生活。温正湖表示,除了自己努力外,这也得益于他的几任主管和身边的同事。网易有比较自由,开放的工作氛围,每个同事能充分展现自己的工作风格,发挥自己的技术特长。他所在的团队,牛人辈出,有Oracle MySQL ACE,有多个开源项目的Committer/PMC,有些同事目前已经成为某些互联网巨头数据库领域的负责人。在这样的团队中,温正湖有很强的动力去自我提升,通过观察对比,能够取其所长,学习他们的工作方法,获取足够的养分来进一步提高自己。
对于工作与生活的平衡技巧,温正湖表示,项目紧张的时候,当然是以工作为重点。比如开发数据库云服务时,有定期的版本发布上线计划,上线前几天最忙碌,有时为了赶进度,996也是正常了。而且为了尽可能降低对业务的影响,都选择凌晨上线,工作强度较高是显而易见的。温正湖一般会在工作进入繁忙状态前提高跟家里沟通,之后就可以心无旁骛得做好工作。当然,工作也并非一直忙碌,在相对空闲的时候,他会早点下班回家,周末也会多陪陪家人。
“职业选择对一个人非常重要,就目前来看,我并没有选错职业。”温正湖自信地说。