5 年前他的一个设计思路,让 TDengine 时间压缩提升近 50 倍
作者 | 尔悦
采访嘉宾 | 廖浩均
小 T 导读:作为创始团队成员之一,廖浩均在 2017 年就正式加入了涛思数据,彼时整个团队才不过寥寥五个人,TDengine 也才诞生不久。作为一位毕业于中科院计算所的计算机应用技术专业博士,廖浩均为什么会决定从一家稳定的上市企业转移阵地到一家数据库初创公司?在进入涛思数据之后,他又见证和参与了 TDengine 的哪些改变与进步?立足当下展望未来,携手 TDengine,他会如何走好接下来的路?在对廖浩均的采访记录中,这些问题的答案也已经跃然纸上。
创始人“三顾茅庐”,博士“大佬”做出最终抉择
作为一个学霸,廖浩均的学业生涯是比较顺畅的,从北京师范大学信息管理与信息系统专业毕业后,他非常顺利地就考取了中科院计算所(中科院研究生院)计算机应用技术专业的硕士,接着一路绿灯开挂式地走完了博士学位。在毕业之际,因为自觉并不太擅长科研领域的工作内容,他毅然而然决定进入工业界就业。
但一向雷厉风行的廖浩均却在接受到涛思数据递出的橄榄枝时犹豫再三,在 Jeff(涛思数据创始人陶建辉) 的“三顾茅庐”后才终于下定决心。
在正式加入涛思前,廖浩均在一家相对稳定的上市企业中工作,按部就班的工作中没有多少惊喜也没有太多的波澜,久而久之他便生出了换份工作的想法,而恰逢其时,通过读书时期实验室师兄的引荐,他结识了正在进行人生中第三次创业的 Jeff。提起来和 Jeff 的初次见面和沟通,廖浩均仍然记忆犹新。
“在和 Jeff 电话简单聊过后,我打算去望京科技园实地拜访,当时觉得时序数据库(Time-Series Database)这个方向还是很有意思的,Jeff 也是一个相当充满激情的人。但两次交流后我仍然无法下定决心加入,主要来源于我对自己的顾虑,虽然我之前做过数据库的相关工作,但是已经有一段时间没有接触数据库技术了,我有些担心自己无法胜任。”
带着这种谦虚的态度,廖浩均决定要和 TDengine 这款产品再彼此多了解一些。在随后几次与 Jeff 更深度的沟通下,他逐渐为这位年近 50 却仍旧奋斗在代码创作第一线上的创始人的热情和坚持折服,也为 TDengine 这款时序数据库所深深吸引,同时也看到了物联网、时序数据库领域广阔的市场机遇,他决定挑战一下自己,抓住这次转换赛道的机会。
“在与 Jeff 的面对面交流中,我更加深入地了解了 TDengine,也看到了 Jeff 的技术能力——做分布式通讯的专家开始跨界搞数据库,而且居然使用不带插件的 vim 编程。此外,我发现当时的涛思数据虽然‘庙小’,但容纳的‘大神’却并不少,不仅有刚毕业的新锐海归,还有工业数据库领域的资深专家。总的来说,打动我加入涛思数据的原因有三点:Jeff 是一个很厉害的专家,他的工程能力和产品认知的敏锐性在我认识的人中无出其右;时序数据这个方向也很有前景;我自己应该能够胜任这个挑战。”
Jeff 的“穷追猛打”下,廖浩均心中沉寂已久的技术热情又开始蠢蠢欲动了,最终他决心 All In 时序数据库,而这个选择的正确性也在后面几年时间里得到了印证。
“其实,在加入涛思之前,我并不是很了解时序数据库这个细分领域中的产品。在2017年,时序数据库这个概念对国内的诸多用户来说还是太前沿,但是万物互联和物联网的迅猛发展确实都能切身体会到。一般来说,此前只有公交车、出租车等机动车上安装有用于上传车辆状态和位置数据的专门设备,后来在智能穿戴设备、2017 年最火爆风口‘共享单车’、自动驾驶等方向上都会产生大量的时序数据……毫无疑问,这些场景都在激发着时序数据应用和管理的需求。按照这个趋势发展下去,时序数据库的发展势不可挡,在我看来,这种直观的感受和体验最有说服力。”
一个被申请了专利的设计思路,将时间压缩提升近 50 倍
在加入涛思数据后,廖浩均主要负责查询处理相关的工作,在读书时他就接触过大量空间数据相关的工作,研究领域主要集中在空间数据索引和查询算法两大方向上,因此在处理工作时也相对比较得心应手。“我在入职两三天后就上手了工作,做的第一件事就是增加 TDengine 的聚合查询功能。”
廖浩均的一个直观感受是,在一个全新的设计理念下开展设计以及进行工程开发,没有其他的任何可借鉴的实践经验,真的非常考验技术人的思考能力和创造性。例如 TDengine 中的多表架构设计,其最开始的形态是采用每个表顺序查询迭代来完成,后来发现这种方法效率太差,百万级别的表查询耗时都会达到小时级别。
“在某天下班前,我打算在服务器上跑一下刚完成的查询代码,结果等了快 10 分钟还没有出结果,后来发现查询跑了 1 个多小时以后进程挂起,最后结果也没出来。当时就头大了,这种查询效率根本没法使用,可是怎么改却没有现成的思路,只能自己尝试。后来憋了好几天,迸发出的灵感也帮助我打造出了全新的处理逻辑,后面我将思路与 Jeff 简单交流了一下,得到认可后就开始动手调整代码。调整后初步测试结果,就将时间压缩到分钟级别,提升近 50 多倍。随着后续又进行了一系列工程优化方法,调整完成以后直接将时间压缩到秒级。这是我印象中特别深刻的一件事。”
在 TDengine 的发展史中,正是这个设计让多表交互式查询处理成为了可能,为 TDengine 能够高效进行查询处理服务成功奠基。之后这个设计思路申请了 PCT 全球专利保护,也成为廖浩均职业生涯中的又一个闪光点。
众所周知,TDengine 还有一个核心技术创新点叫超级表,但其实在超级表的模型问世之前,其已经有一套流程和逻辑了,在超级表模型确定后,廖浩均等人又开始针对 TDengine 的写入、查询、数据存储等多个方面进行调整和适配。
“由于 TDengine 是一款具有一定探索性的产品,其功能的边界和定义并不是非常清楚明晰,因而在架构设计上也很难面面俱到,并确保足够的余量和扩展性设计。如果前期没有做好设计,后面增加功能的时候会面临非常大的困难。架构设计考虑得不完善,需要重构,但是又不可能大规模调整框架设计。只能采用小步快跑的方式,不停进行代码和设计架构的小规模重构和优化工作,还要避免重构工作引入新的 Bug。”
在廖浩均的印象中,针对 TDengine 进行开发和调试 Bug 时,为了定位处理代码中的逻辑错误,就需要阅读和分析大量的日志,在这一工作中,通过日志分析定位代码中的逻辑错误问题是一个非常重要的能力。 “我们最长时间的一次日志分析断断续续花了 1 天半的时间,是分析一个服务器、客户端之间的查询日志,通过日志信息分析还原了 3 个线程之间的、对于一个内存区的使用+线程调度问题处理中出现的 race condition。由于架构设计的原因,需要使用的处理方式和处理技巧相对复杂,后来 Jeff 为 TDengine 增加了对象生命周期管理的模块,才避免了后续继续在这个问题上掉坑。在增加和完善消息交互的流程追踪机制基础上,从几十 GB 的日志中捞出来所需的两三行确定性关键日志成为了常规操作,同时十几、二十分钟就能快速定位出问题,给出错误原因并将错误场景还原。”
TDengine 从 0.x 到 3.0,他既是见证者也是建设者
作为涛思数据的“元老”之一,回顾 TDengine 的一路成长,廖浩均倍感荣耀和欣慰。
“一些朋友可能不太清楚 TDengine 是怎么孵化出超级表概念的,其实这一概念是 Jeff 在与网宿科技交流过程中碰撞出来的,当时的数据库领域中并没有这样一种设计,能够解决需要创建很多表的场景(TDengine 的独特设计要求每个设备有一个写入表),表的模式一致,具体功能上既需要能够单独写入、又需要实现通过一条 SQL 语句就能够查询全部相同模式的表。有趣的是,超级表的设计和整体逻辑是 Jeff 提出来的,但名字却是我取的。”
超级表的问世无疑给 TDengine 注入了满满生机和活力,也让 TDengine 在后续的市场竞争中成功脱颖而出。
据廖浩均回忆,在刚刚加入时,TDengine 的架构还非常简单,也没有太复杂的处理逻辑,只能进行简单的投影查询。“当时整个系统的基础架构以及核心组件,包括通讯模块、消息队列、事件驱动执行模块、SQL 解析、查询执行框架、Driver,这些基本上都是 Jeff 自己在几个月时间内完成的,由于人手和时间的原因,这套服务端查询处理框架从 0.x 版本一直延用到 1.x 版本,在 2.0 版本中才进行了较大规模的逻辑优化和重构。”
回顾 TDengine 从 0.x 到 2.x 的发展,廖浩均感慨颇多。“得益于 Jeff 对时序数据库这一细分领域的前瞻性和洞察力,涛思在较早的阶段就进入其中,占领了一定的产品和市场先机,但这距离我们想要把TDengine 打造成物联网行业首选时序数据库乃至全球化产品的目标还相距甚远,所以从 0.x 到 2.x,TDengine 也在不断进行技术创新和深耕。”
TDengine 0.x 的版本基本上奠定了后续的技术基础,包括管理节点、数据节点、虚拟节点的设计和功能边界、代码实现,消息通讯体系,分布式框架和元数据管理架构等关键内容,具备了基本的 SQL 操作能力和超级表模型,较完备的高性能数据写入流程和缓存中数据组织机制、以及 WAL 设计,具有优异读写性能的文件组设计,数据生命周期管理机制,以及日志模块和参数管理模块,还包括同步异步支持的 Driver 等。
在随后的 1.x 版本中,TDengine 结合用户的需求,加入了预计算功能、增加了乱序数据写入能力,在 SQL 语法上进行增强,修复了系统整体上存在的大量问题并完善各模块的功能,同时从 1.4 版本开始进行开源,将核心代码公开于 GitHub 上,在 GitHub 全球趋势排行榜上多次霸榜,这一举动也为 TDengine 带来了更多技术关注。
“敢于开源代表着我们不惧外界的技术质疑,同时开源也有助于我们更加直接快速地获得用户对于产品的反馈,加快产品演进和研发速度。随着开源力度的加大、引擎研发团队技术人员的增加以及团队自身经验的积累,2.x 版本中我们进行了更优异的模块化和重构工作,对几乎全部的功能组件进行梳理和重构。虽然在用户层面能看到的功能增强和改善并不多,但是从产品角度来说,2.0 真的是 1.x 版本的一次脱胎换骨式的升级。”
如今,距离 2.0 版本发布已经过了两年时间,为了让用户在使用体验上更加顺滑,如廖浩均一般的涛思技术人也在加班加点地对 TDengine 进行新一轮的优化和迭代。在他们的努力和一众用户的支持下,2022 年下半年,3.0 版本也将如期而至,届时 TDengine 将迎来进一步升级和蜕变。
展望未来,携手 TDengine 继续前进
回顾加入涛思数据的这些年,廖浩均表示最大的收获就是结识了一群很优秀的同事,大家为着共同的目标而努力,是一件让人很激动很兴奋的事情。而他本人也在这个过程中受益匪浅,通过参与一套基础软件系统从 0 到 1 的开发,不仅重塑了个人的知识体系,对于数据库系统的理解达到了一个新的层次,也极大提升了数据库相关的工程能力。
谈及自身的下一步发展,他希望还能继续深耕在时序数据库领域,一是源于兴趣,二是源于前景。“物联网时序数据领域还处于快速发展的阶段,未来一定会有较大的发展空间,对于我自己来说,投身于这样一个不断发展的领域,也能鞭策着我不断学习和进步。只有脱离舒适区,做有挑战性的工作,才能让能力提升这件事保持可持续性。如果你也对此感兴趣,那开源社区是一个非常好的学习渠道,通过优秀的开源项目,能够学习到非常多的经验,欢迎你成为 TDengine 的贡献者。”
而谈及 TDengine 的未来,他希望经过时间的洗礼,TDengine 能够发展成为一个具备开箱即用、高性能时序数据处理能力的重要软件产品,涵盖时序数据日常应用中的重要场景所涉猎的功能,具备优秀的伸缩能力、容错能力、异构环境部署能力以及面向用户的功能扩展。在数据中心和边缘侧具备同样的便捷性、易用性的使用体验,进一步为用户提供高性能、高效能、高可靠性、低成本的时序数据处理功能。
想了解更多 TDengine Database的具体细节,欢迎大家在GitHub上查看相关源代码。