清华五年,我写了一个时序数据库......

2021-07-27 15:24:29 浏览数 (1)

本文字数:8888字

阅读时间:23分钟

先自我介绍一下,乔嘉林,网名铁头乔,2016年西安交大计算机系本科毕业之后,来到清华大学软件学院直博,师从王建民教授,大师兄黄向东,今年顺利毕业。回首往事,没有虚度年华,也不算碌碌无为,主要在做一款时序数据库:Apache IoTDB。

五年时间,见证了 IoTDB 从发布第一个版本,到应用于数十家企业;从公开源代码,到成为 Apache 基金会顶级项目;从只有实验室同学参与,到形成百余贡献者的开源社区。博士阶段最开心的不是论文中稿,而是做的系统能够运行在祖国的大地上。

毕业的事情忙完之后,便开始准备这篇文章了,总结了一下博士阶段的经历和教训,历时两周终于完成,献给大家。

前言

读博第一阶段

读博第二阶段

后记

前言

为什么读博?

选择读博的都是勇士,我读博的理由有三点:

(1)科研初体验还不错:15年在中科院自动化所实习,过了两周读论文写代码的生活,这种生活简单纯粹,像是回到了高三。

(2)简单的执念:清华是我从小的梦想,觉得在清华多待两年,就能多跟老师学点知识。

(3)想了解自己:本科经常听说读博压力大,想看看自己在这个过程中会有什么想法,做出什么选择。

读什么方向?

做系统。15年在西安神州数码实习,7人一组,两周做一个银行贷款系统,也是第一次领略到做系统的魅力,当把系统从用户到后台每一步都调通的时候,就像打通了任督二脉,这种爽劲也支撑我演示前一晚写代码写到2点多。

作为组长,我的职责就是把流程跑通,然后大家一起完善业务逻辑。演示当天,还有半个小时展示,系统又出幺蛾子,于是继续调,终于在演示之前搞定,顺利通过。

这次经历让我对做系统产生了浓厚的兴趣,而且很期待有一个紧密的团队,大家一起写代码,就像一起扛过枪上战场。那个时候对系统的感觉就是构建一个虚拟国家,定义各种规则,让各个部门协同运转起来。

但是同时,我也意识到,这种系统第一次做很新鲜,如果总做类似技术栈的系统,也会感到无聊。做系统不是单纯的堆功能、拼广度,而要追求深度。因此,读研的方向选择了做系统,希望能够学一学大型系统里的知识和优化方法。

初见导师

读研时候有一次听刘璘老师说,读博就像是选择一种婚姻,一辈子就一次,也不会有心境再来一次。这也说明了选择导师的重要性。结合自身的经历,我觉得选导师的原则就是:你想成为像导师一样的人。

15年与导师第一次见面,这次见面给我留下的最深刻的印象就是:王老师的精神状态比很多20多岁的年轻人还要好。

为什么这么说呢,以我本科为例,大四经常和舍友玩游戏到一两点,早上没课就睡到十一点。上午无精打采,下午逐渐恢复正常,晚上贼精神。到了暑假寒假,作息就更混乱了,闲的难受。后来也意识到这种生活没什么意思,我需要一些长远的目标,来保持良好的精神状态。

保研面试

在保研面试时,我说自己的梦想就是做系统,当架构师。

于是,一个斗志昂扬的23岁年轻人,就这样通过了面试、走进了读博生活。

读博第一阶段

本科毕设

博士的生活要从2016年3月来清华做毕设开始算,那个时候大家正在开发一种叫做 TsFile(Time series File) 的文件格式,主要用来存储时间序列数据。

我的第一个任务就是实现 Spark 和 TsFile 的连接器。对于一个本科只写过一些数据结构与算法,github、maven 都没怎么用过的人来说,从哪下手都不知道,只能在 github 上找类似的项目,然后看他们的源码。

以前自认为写代码不发愁,很多时候写一遍代码,没有bug直接能跑。那时候才意识到仅会给输入输出,写个算法是不够的。很多时候不是哪个算法写不出来,而是不知道在哪写这个算法。而在大型项目中,经常需要尝试新技术,走通一条技术路线,显然我在这方面缺乏经验。

进度缓慢,于是开始堆时间,每天早上8点多到实验室,晚上10点多出实验室。也因此没怎么锻炼身体。碰巧这时候又遇到了我的中国好舍友,孙林。他买了各种各样的零食,但是他不怎么吃,都给我吃了,于是一直 62.5Kg 的我,这时候到了 73Kg。

于是我逐层分析原因,从本科没重视实践,只学了书本知识,到高考没考好,再到初中经常玩电脑。把当时的困难归咎于过去的经历。甚至在想,如果当初没来清华,可能就不会遇到这些困难。

后来想通了,悟已往之不谏,知来者之可追。过去的事情已经无法改变,无论我做何选择,总会在前进的道路上遇到困难,而这时候只能硬着头上。

当你真心想做一件事时,全世界都会来帮你。当时有三个复旦的同学也来我们实验室,嘉烨、仔仔和齐童,其中嘉烨做的工作和我相关,于是我有了可以请教的人,在他的帮助下,我又开始有了进展。

此外,有时候遇到问题,我开始在其他开源项目里提问,有个国外小哥经常及时帮我解答,有时候甚至直接给我丢过来一段代码,这也是第一次接触开源。

于是,项目逐渐步入正轨。还好大四下学期提前来适应了一下实验室生活,不然博一又要上课,又要做项目,估计忙不过来。所以,如果有机会提前进入下一阶段,就要主动。

团队成型

2016年秋天,IoTDB 初始团队成立。

(1)东哥:在我逐步适应项目节奏时,那个男人回来了,他就是从遥远的澳大利亚留学归国的东哥。作为我们组的头,统筹全局。

在科研方面,带我一篇篇读论文,每篇论文读完之后讨论半个多小时,也让我这个科研小白逐渐学会了怎么读论文。

项目方面,他需要做 IoTDB 的规划和项目实施,经常熬夜。所以我就尽量帮他分担一些工作。

(2)宗姐姐:实验室的行政老师,和我们打成一片,在生活上对我们非常关照,思想上排忧解难。

铁头乔也是宗姐姐叫出来的,我觉得非常适合自己,哈哈哈。

(3)大哥:实验室的山东大汉,比我高一级,他平时开发经常涉及到位运算,但是从他嘴里说出来的位都成了“味儿”,大家可以感受一下,“这一味儿与上那一味儿”。大哥是海底捞黑海会员,于是有时候也不可避免地成为了大鸽。

我经常会找大哥要接口,我们的经典对话就是,“大哥,这个接口能不能支持?”,大哥回:“你问我支持不支持,那肯定要支持啊!”

(4)康博:比我高一级的博士师兄,主要做写入和存储引擎,康博是典型的很负责任的清华学子。

在我们研一准备考试时候,又有新任务,康博说了一句让我至今印象深刻的话:“交给我们,让他们去复习考试吧”。

(5)馨逸:我们级唯一的女生。也是我们实验室唯一的产品经理,在馨逸的努力下,我们有了第一版高质量用户手册和Apache IoTDB沿用至今的logo图标。

馨逸买了零食之后,她的桌子放不下,就放在作为同桌的我的桌子里了,就被我吃吃吃。

(6)小飞飞:实验室的另一位山东小汉,是大哥的接班人,也是我们每天的快乐源泉。

有一次写代码写的比较晚,一直在优化一个数据结构 DynamicOneColumn(DOC),我和小飞飞骑车回宿舍的时候,小飞飞就快乐地唱了起来:“DOC~ DOC~ 我是一个DOC~”。

(7)老年人:康博的接班人,他的爱好和老年人一毛一样。性格也比较稳,被东哥认定为磐石。

当时做毕设时候,我们去吃快餐炸鸡,老年人说:“来个冰激凌,吃点甜的,每天过的太苦了。” 老年人的口头禅:“这个鬼东西”。

(8)徐总:清本毕业,自成一派,负责SQL解析和RPC,平时负责审PR,被东哥认定为利刃,把好最后一道关。

徐总非常自律,从来不吃外卖,实验室集体加班时候也不吃外卖,只吃食堂,风雨无阻。

横空出世

我们每个月会进行 IoTDB 的版本发布。第一个版本发布是 2017 年4月1日愚人节,我们发布了 0.1.0 版本,也标志着一个产品的诞生。

这时候的 IoTDB,在我看来就像是一个刚出世的孩子,无法预料它会发展成什么样子,又会对我的人生轨迹产生怎样的影响。

公众号的前身

2017年夏天考完最后一科,正好去做了一个膝盖的手术,做完手术后只能在家做康复训练,并且注册了一个公众号 “乔村儿”,也就是这个公众号的前身,主要用来记录和分享生活,也收获了很多:

(1)与家人分享日常生活。可能男生都或多或少跟家人交流不多,通过写作的方式,让家人感受到我的关心。虽然不能常回家陪伴,但是可以让我的文字陪伴他们。很开心的是,有一次姐姐说,爷爷在给奶奶读手机上的东西,一看是我写的文章。

(2)与朋友紧密联系。许久不见的朋友,读到我的文章之后,也来分享自己的生活。也让自己时刻意识到,生活有千百种过法,我只是其中一种,就让我们在各自的生活中加油吧!

(3)在更广阔的的天地寻找自己的位置(来源于阿德勒心理学)。生活不能全部被工作和科研占据,当工作的小圈子遇到问题,需要有更广阔的的圈子接纳自己。而公众号就是一个更广阔的共同体。

(4)锻炼文字表达能力。我从来不喜欢写作文,但是写这些还可以。写得多了,对于写作也就不发愁了,也算克服了一项缺点。

青海西宁的日子

2017年10月左右重返学校后,我和学弟江天(我的天)被派往青海西宁,和昆仑数据的团队一起参与青海新能源大数据平台建设,应该是国内第一个风电物联网平台。

我们的目标有两个,一个是用国外产品接住线上数据,第二就是验证 IoTDB。不得不说,这一次近距离体会到了和国外技术的差距。也从这次实践中,我们开始重视乱序数据的处理,并且完善自己的产品。

出差过程中也结识了一帮好朋友,我的天话不多,代码写得贼6,平时比较宅,晚上下班却乖乖被我拉出去,在冬天的西宁吹着冷风溜达。

还有昆仑数据的一帮兄弟,统筹帷幄的蒋总,数据平台总负责人鹏哥,负责数据接入的景帅,负责查询的一鸣,驻场的陈明、远程支援的振兴哥,还有上飞机前一分钟还坐地上抱着电脑运维的远哥。

那时候每天中午大家会去一个小饭馆吃碗面,晚上就找大饭店吃一顿好的,涮羊肉、涮牛肉、烤鱼,附近的饭店基本都被我们吃遍了。周末不忙的时候大家还会一起爬个山,在西宁的日子还是很不错的。

读博之路如此艰辛我始料未及

这是2017年龟给我分享的一句话,我觉得非常贴切那时候的我。我高中最差的科目就是语文,大学好不容易不用学语文了,可把我高兴坏了。读了博发现要发英文论文才能毕业,我就意识到了,这将是我人生中最艰难的一段时期。

尽管项目开始有了起色,但是论文的压力又逐渐增大。此时,机器学习方向逐渐火热。相比之下,数据库系统方向不是那么好发论文。这时候有两个选择摆在我面前,是去做机器学习,还是继续数据库系统方向。

当这个问题从脑子里冒出来的时候,其实就已经有了答案:还是做系统。

读博并不是为了毕业的那个时刻,而是为了过程中的每一天,每一件事。当下定决心在一条路走到黑的时候,就没有那么多时间纠结和彷徨了,也就进入了博士第二阶段。

读博第二阶段

积极的生活状态

2018年过了几个月非常规律的生活。

7点30:起床

7点50:去食堂点一碗小米粥和两个鸡蛋,后来打饭阿姨看到我直接给我固定套餐。

8点30-12点:干活

12点-12点30:去离实验室最近的食堂吃饭

12点30-13点30:午休

13点30-17点:干活

17点-18点30:去操场锻炼,吃饭

18点30-22点:干活

回顾整个博士阶段,这应该是我最喜欢的生活节奏。如果说找到健康的生活节奏是安装了一台高级发动机,那接下来的事情就是找到前进的方向。

走向开源

2018年夏天,王老师做了一个开创性的决定,要把 IoTDB 捐给 Apache 基金会,从内部项目转为开源项目。原因有几项:

(1)当时的开源大数据软件大多是国外贡献的,国内大多是在使用,我们应该为中国的开源软件做出自己的贡献。

(2)学校里很多项目随着一波学生毕业也就停掉了。而系统软件是需要五年、十年的投入,并且需要众多优秀的贡献者参与,形成良好的社区才能长久发展。

就这样,我们提交了申请书,经过投票进入了 Apache ,成为 Apache 唯一的物联网时序数据库项目。

所有进入 Apache 的项目都要先进入孵化器,完成相应的任务(建设社区)后,才能毕业成为顶级项目。而无法毕业的就会退休,退出 Apache 基金会。

在进入 Apache 后的一段时间,我们把项目代码从清华的仓库迁移到了 Apache 的仓库。并且按照 Apache 的要求做了很多事务性工作。同时,在项目导师的指导下,我们尽量把讨论放到了邮件列表中(这是一件很痛苦的事情)。

尽管我们是 Apache 开源项目,但是并不知道怎么建设开源社区。好像进入 Apache 开源对我们来说,只是增加了一些繁琐的工作。github star 也并不多,更不知道怎么吸引社区开发者和用户。在幻想一进入 Apache 之后就能拥有活跃的社区开发者和用户的我们,被泼了一盆冷水。

第一道坎:上海地铁

2019年5月30号要上线上海地铁,需要写入延迟低于200ms。线上系统是用的 KairosDB,我们首先需要适配 KairosDB 接口,于是从2月开始,学弟刘睿带一个实习生做了 IoTDB 兼容 KairosDB 的 Rest 接口:IKR(起名就是这么直接),到5月基本完成。

经过初步测试,我们的写入延迟有时候会达到几十秒,平均延迟也不满足要求。说实话,这个时候我对存储引擎并不熟悉,看了看代码只觉得很复杂。但是我也知道,这是 IoTDB 的一道坎,迈过去了就一马平川。

这时候,正值女朋友毕业旅行,我跟她说:“你去吧,等你回来之前我肯定把系统搞好!”

送走了女朋友,我拉上了我的天和天安两大主力学弟,在东哥初步趟了路之后,开始重写存储引擎。

已经毕业的大哥听说我们的计划之后,说你们不要太激进。确实,我没什么把握,但是还是想拼一把。借用 stormzhang 的一句话,就是干!

就这样,三个人结对编程,每天早上9点到晚上11点,花了一周时间,基本写好了一版,开始测试。测试能看到初步结果需要半个小时,这半个小时就像等出高考成绩一样忐忑。而第一次的测试结果也没有让我们失望,果然不稳定,稳定才见鬼了。但是不怕,我们还有一周,带周末的那种。

找问题,完善方案,继续修改,提交测试。这个过程持续到了第二周的周六。周六下午组会东哥需要汇报一周的工作,我们周六上午10点出了一波结果,发现还有问题,东哥说:“我心脏难受。。。”

经过了一周的磨合,我隐约感觉,这次改完估计就稳了。11点开始提交测试,测到下午1点30,看写入延迟监控,系统一切正常,平均延迟25ms,起飞!

后续芮蕾和苏月适配完查询引擎,成功上线上海地铁,替换了之前的 9 台 KairosDB 集群。

同级硕士毕业

我这个人经常后知后觉,在我忙完上海地铁项目,才发现同级的硕士朋友们已经离校了(尤其是拉开抽屉,发现没有零食了...)。对于博士生来说,这是一个标志性的时刻。曾经用在东哥身上的 “干走了一届又一届硕士”,我也能够体会到是什么感觉了。

作为还在学校的我们,能做的唯有坚持,不让大家的努力白费,希望他们之后在和别人聊天,听到 IoTDB 在某个场景里被用起来的时候,能够开心地和别人说:“我也是 IoTDB 的贡献者”。

借用《1408幻影凶间》结尾的台词:We are here to do the job, and we don't rattle(我们是为了这个故事而来,我们要镇定自若)。

从哪里入手呢?好的开源项目都有活跃的社区,因此,我的想法就是建设开源社区。社区是一帮有共同目的的人,接下来就是怎么找到这些人。

盘点了一下手上的资源,我们可以在一些大会上进行宣传,也能够通过实验室的一些项目打磨产品,但是这还不够。我们需要更多的用户、贡献者和更丰富的测试场景。

实验室没有专门做社区运营的同学,也没有打广告的预算,只能自己想办法了。

社区建设

“乔村儿”断更的时候,我并没有停止写作,而是新开了一个技术公众号“数据库漫游指南”。刚开始并没有推广 IoTDB,主要原因是那时候还不稳定。但是,在经历了上海地铁的洗礼之后,我对 IoTDB 和自己的运维能力已经有了的信心,于是开始在公众号上进行宣传,后来直接改成了 Apache IoTDB。

除了公众号,也在CSDN、OSChina上写文章,包括版本发布、使用教程、常见问题、运维经验等,前前后后估计写了上百篇。此外,组建了微信和QQ用户群,并且把自己的微信放到了公众号上,很多加过来的用户跟我说的第一句话就是:“看了你的文章,很有帮助,希望进群”,这也是对我的激励。

此外,还有一些用户加好友的备注是“IoTDB爱好者”,这应该是每个软件开发者最开心的时刻了。当然,也不乏扔臭鸡蛋的,而我们需要做的就是及时改进,勇往直前。

我曾经想过要不要弄个机器人加群,后来想想还是算了,毕竟不是所有人都习惯在群里说话,直接加到我,能够让用户和开发者第一时间找到我,离社区更近一些。

找到第一个贡献者

开源社区的发展是从找到第一个社区贡献者开始。对于我来说,就是刘大伟。

2019年底大伟哥进入我们社区,他比我大两岁,是四维智联的架构师,也是我的老乡。正好年底升级查询引擎,就拉上他一起讨论设计方案,而且初步实现就交给了大伟哥。

查询引擎涉及的地方非常多,他第一版改完之后,上百个测试类不通过,搁谁都头大。本来我预想的是等我忙完,我们就一起来修测试,没想到他一个人把测试一点一点都调好了,那段时间他经常搞到晚上两三点。实话说,这股精神我非常佩服。

除了社区的活动,我们也会经常约饭,并且一起参加其他开源社区的活动。大伟哥凭借优秀的人格魅力,已经成为社区的明星人物,现在也是社区的 PMC。

如何参与开源社区?我尝试从大伟哥的经历总结一下:贡献、认可、热爱。这三个词每一个都不是单向的,而是社区和贡献者之间的双向互动。

第一个开源用户

2020年疫情爆发,开始在家办公,疫情期间我们主要做了一件事:和大唐先一的张景一起,让 IoTDB 在湖南几个电厂上线。

最开始景哥跟我交流,说:“5月有个项目准备上线 IoTDB,能不能支持一下”。我说:“只要你们决定用,我们就全力支持。”

正值重构完查询引擎,bug 比较多,时不时就给我反馈测试问题,而我们就通过微信沟通,一步步排查。

就这样,过了一段时间解 bug 的日子,每次我自认为没啥 bug 了,就跟女朋友说:“这肯定是最后一个 bug。” 然后马上就来打脸,她就在旁边乐。

有的bug我自感一天搞不定,没思路,就拉上田原、我的天、劳模昊男四堂会审。事实证明,及时求助他人,确实能够加速问题的解决。虽然过程比较艰难,磨合了三四个月,最后终于成功上线。

我对用户的态度就是大哥的那句话:“你问我支持不支持,那肯定要支持啊!”

开源社区

在参与开源项目的日子里,也接触到了不少中国的开源人物。包括我们项目的姜宁导师;开源布道师李建盛老师;在家脱产写了一年代码的APISIX的温铭总;Sharding Sphere 的亮哥和娟神;海豚调度的冬哥;Pulsar的翟哥、示说网的程总等等。

关于社区建设,我时不时会想,如果有个人能够全职宣传就好了,但是 Apache APISIX 的温总的一句话改变了我的想法:“社区建设这么重要的事,当然要自己上了。” 一件让 CEO 亲自上阵的事情,值得我们认真对待。

我们的开源社区也在不断壮大,现在已经有122位贡献者了。其中不仅有战队,如东方国信的超哥、厚亮、海媚、艳虹;阿里的金竹老师团队;云智慧的红闪;用友的永伟、瑞杰;华为的秉华、超哥、一夫、鲁铭。也有如宗翰、魏小涵、宇翔、刘煜、亚东、佳俊等单兵联盟。此外,也有非技术同学的加入,如禹任、李琳、泰丞等等,大家一起组织活动,编辑公众号文章。

铁打的实验室流水的兵,实验室的队伍也在不断融入新鲜血液,我们的团队也在壮大,我也有了自己的小弟,田原、书记泽嵩、老中医恺丰、愈园、祥威、新宇、凌哲、Steve宇荣、旭鑫。在学校的好处就是能够接触年轻人的新思维,心态永远年轻。

收获

个人收获:2020年,学院奖学金的评审规则进行了修改,增加了开源贡献。这也标志着,不仅仅发论文能够受到学院的认可,做系统、做软件的同学也能够受到认可。对于我们实验室这些做系统的同学来说,无疑是一个好消息。在学生时代的最后一年,我也有幸获得了国家奖学金和清华软件奖。

产品方面:不完全统计,IoTDB 已经有数十家用户,部署的实例有数百个,在多个场景中实现了对 InfluxDB 等国外产品的替代,实现了工业软件的国产化。

社区方面:随着社区的成长,每个参与社区的人都会共享社区发展的成果,近期最直接的例子就是招聘 IoTDB 人才的岗位越来越多。可以说,社区是一个为大家创造机会的平台,我也希望能够让参与 IoTDB 的朋友们有所回报,不仅是精神方面,还有物质方面。

毕业

不得不说,博士毕业都要脱层皮,预答辩、毕业论文、格式审查、盲审、学位答辩,每个环节都有可能挂掉,庆幸的是在朋友们的帮助和鼓励下,都顺利通过,也深刻感受到了开源对于我的影响。毕业答辩时,评委老师说了一句话:做系统不容易,尤其是做生产级的系统。

如果说淮海战役是人民群众用小车推出来的,那我的博士之路则是学校和开源社区共同铺就的。

毕业答辩很多素材和场景都来源于社区,感谢中车的晓晨哥、大唐的张景、瑞恩的李总、嘉信的万总、绍兴的发哥、拓维的斌哥、华哥、鹤爷、平哥、天远的翟哥。感谢所有 IoTDB 的用户、贡献者和帮助过我的朋友们。

五年的博士生涯即将结束,但对于数据库系统软件却刚刚起步,我会继续在 Apache IoTDB 社区发光发热,和社区的朋友们一起打造世界级的时序数据库产品。

后记

总结

总结一下经验教训:

(1)在团队中,做一个许三多一样的人,利人就是最大的利己。

(2)时常反思,找到原因后不纠结,想如何解决问题,并且避免再次掉坑。

(3)坚持长期主义,多阅读、多分享。

(4)坚持锻炼,为祖国健康工作50年。

(5)建设开源社区没有捷径,唯有付出真心。

一句话概括:找到热爱的事业,用创业的态度去对待

< END >


0 人点赞