1
2
0
0
专栏/.../

PingCAP “一号员工”唐刘:回顾我与 TiDB 的十年成长之旅

 社区小助手  发表于  2025-04-21
转载

作者:唐刘|PingCAP

导读

作为 PingCAP 的“一号员工”,TiDB 研发副总裁唐刘亲历了 TiDB 从一个开源小项目到全球知名分布式数据库的蜕变。本文,唐刘从亲历者视角,回顾了 TiDB 的技术演进、产品迭代和全球化历程,还分享了自己从程序员到技术管理者的成长与感悟。

这是一段关于技术理想、客户成功与团队协作的旅程,也是一次对开源精神、创新勇气和商业智慧的深度剖析。通过唐刘的视角,我们得以窥见 TiDB 背后的点滴故事,以及那些推动它走向成功的信念与坚持。

人生最宝贵的财富,莫过于回忆与反思。

时间一晃,十年已过。从2015年4月1日 Max 在愚人节严肃地问我“愿不愿意一起创业”开始,我就踏上了 TiDB 这趟列车,一路跌跌撞撞,也一路风光无限。

这十年间,我完整地参与了 TiDB 从零到一,从开源小项目到全球化产品的每一步。如今站在时间的节点上,我想写下这段旅程的真实经历与感悟,既是记录这段珍贵的历史,也希望我的故事能给同样热爱技术与创业的朋友们一些启发和帮助。

这一系列的文章,并不是要炫耀成功或者粉饰困难,而是想真诚地分享:

  • 创业之初,一个单纯的技术理想如何一步步走向现实;
  • 技术开发与产品商业化之间,程序员经历了怎样痛苦而又必要的蜕变;
  • 开源与客户成功如何成为 TiDB 最重要的成长基因;
  • 全球化的征程上,如何用技术与产品赢得全球客户的信任;
  • 作为一名程序员,又如何一步步成为一名管理者,甚至技术领导者。

我相信,这些真实的故事才是最有价值的,也是最值得被记录下来的。

好了,废话不多说,让我们一起进入这场回忆与成长的旅程吧!

一:旅途的开始——4月1号的愚人节邀请函

愚人节那天,我收到了创业邀请

2015年4月1日,愚人节。对程序员来说,这通常只是个能放心开玩笑的日子,但我没想到,那天居然收到了一条特别离谱的消息。

发消息的人是 Max,我们之前在开源社区有过不少合作,但从没真正见过面。消息很简单,大意是:

“我们打算创业了,做个分布式数据库,开源的。你愿不愿意一起干?”

看到这消息,我脑袋一下子就短路了:这也太荒谬了吧?愚人节跟我开这种玩笑?

我当时毫不犹豫地回复了一句:“你是不是在玩我?”

结果 Max 立马回了一条:“我很认真。”

一瞬间,我愣住了——玩笑开得挺像真的。

为什么会找到我?

为什么 Max 突然会想到我?后来仔细想了想,这其实都得归功于开源。

我们之前在开源社区里合作了一些项目,彼此之间通过写代码、发 Issue、提 PR,虽然完全没见过面,但早就摸清了彼此的技术品位和脾气秉性。开源社区的好处就在这里:程序员不靠相貌、靠代码,大家的水平和性格,都写在 GitHub 上。

如果没有开源,我们完全是陌生人,哪怕面对面见了面,也不会产生信任。但开源却让我们在未谋面的情况下,迅速建立了相互的认可。

这么说吧,开源社区就是程序员世界里的“相亲平台”,比见面喝咖啡有效多了。

两个震撼:开源和远程办公

虽然心里还是有点怀疑,我还是跟 Max 聊了几句,越聊越觉得他们似乎真的不是在开玩笑。

毕竟,做个开源的分布式数据库,还要“影响世界”,这件事放在十年前,听起来就是典型的程序员中二病发作的症状。梦想是挺伟大的,但也挺傻的,尤其是我们几个连数据库源码都没碰过的程序员,居然敢干这么大的事。

不过我还是拒绝了,因为 Max 成立的公司在北京,而我那时候已经定居珠海,不想去北京。

但 Max 接下来的一句话,让我直接傻眼了:“你可以不来北京,直接在家办公就行。”

你要知道,那可是十年前啊!公司创始人居然主动提出让员工远程办公,这在当时是非常前卫甚至疯狂的事情。

这一刻我突然觉得,这家公司,要么成不了,要么就真的会很酷。

第一次线下见面,居然像多年好友

于是,我立刻买机票飞去了北京,见到了 Max,还有其他两个创始人—— Ed 和 Dylan。

你们能相信吗?那是我们第一次见面,但彼此之间居然没有半点陌生的感觉,就像多年好友重逢一样。这真的是非常神奇的经历。

现在回头看,为什么我们能这么快地建立信任?归根到底,还是开源的力量。

从此,开源就成了 TiDB 骨子里的基因,也成了日后我们走向全球市场的一把利器。

“真开源”,透明到几乎“打脸”

从创立第一天开始,我们就决定走“真开源”路线。什么叫“真开源”?

就是把几乎所有的代码、所有的问题、所有的 bug、所有的 issue 和 PR,全都公开放在 GitHub 上面,完全透明,让客户和同行随便看、随便吐槽。

有人问我们:“你们这么公开透明,bug 全都暴露在外,不怕客户看到吗?”

我们却觉得反而很放心,为什么?因为这种透明反而让客户更加信任我们。

客户能直接看到我们是怎么工作的,bug 是怎么发现又怎么修复的,产品是怎么一步步成长起来的。事实也证明,这种透明度反而为我们赢得了巨大的客户信任,甚至比那些刻意隐瞒问题的企业更容易被客户所接受。

我们为什么要做一个分布式数据库?

谈到 TiDB 最初的起点,那就是“解决分库分表(sharding)的痛苦”。

作为互联网行业出身的程序员,我们深受 MySQL 分库分表的折磨,每次修改表结构都要折腾到半夜,痛苦到怀疑人生。

于是,我们希望:搞一个真正能无限扩展(Scalable)的分布式数据库,彻底终结程序员的 sharding 噩梦。

这个想法最初特别朴素:我们只是想解决自己的痛点。但后来发现,这种纯粹的初心,竟然成了 TiDB 的核心竞争力,也成了众多客户选择我们的重要原因之一。

不知者无畏,程序员开启的“打怪升级”之旅

回想起来,我们几个人当时并没有任何数据库开发经验。我们只是数据库的重度使用者,根本没碰过数据库源码,更别说开发一个新的分布式数据库。

为什么我们敢这么干?只能说,有时候无知反而是一种优势,俗话说得好,“不知者无畏”。

正是带着这种无知者的勇气,我们踏上了 TiDB 这场充满未知的冒险之旅。

而我,也因为当时一时脑热,成了 PingCAP 的第一个正式员工,并从此开启了我此后长达十年的 TiDB 开发旅程。

多年以后,我回想起当时的决定,依然觉得庆幸和自豪。

二:技术驱动的幸福时刻

做产品什么时候最爽?

做技术的总喜欢问一个很哲学的问题:“写代码的哪个阶段最快乐?”

可能每个人都有自己的答案,但对我来说,答案非常简单:产品还没给客户用的时候,那段时光最幸福。

没错,客户没进门之前,程序员只需要安心写代码,完全不用操心客户的抱怨、需求、紧急电话,更不用半夜爬起来救火。那是一种纯粹的技术快乐,专注于代码本身的乐趣。

但问题在于,做产品最终还是要给客户用的,这快乐的时光,注定无法长久。

从零开始造一个数据库,我们真没那么疯狂

TiDB 的开发一开始就让人觉得是件很疯狂的事情——毕竟,一个数据库不是说写就能写出来的。

不过我们也不是毫无准备,毕竟这世上早有 Google 发过论文,比如 Spanner。除了论文,还有比我们早一年创办的 CockroachDB(俗称“蟑螂数据库”)和经典的 HBase 都给了我们很多启发。

程序员造轮子并不可耻,但如果闭着眼睛瞎造就挺蠢的。我们理智地站在这些巨人的肩膀上,借鉴了大量已经验证过的架构设计思想。

为什么我们选了 Go?

造数据库第一步就是挑选语言。我们毫不犹豫地选了Go。

为什么?因为我们几个人最熟悉、最喜欢的语言就是Go。程序员都明白一个道理:在未知领域里闯荡,最安全的选择永远是自己熟悉的语言。

我们的策略也很简单粗暴:先让程序跑起来再说。

MySQL 兼容是好事,但坑也是真多

早期,我们决定兼容 MySQL 语法。这个决定直接奠定了日后 TiDB 成为最佳 MySQL 替代方案的基础。

然而,这个决定背后的坑之深,远超我们的想象:

  • MySQL各种奇葩语法坑;
  • 稀奇古怪的兼容性问题;

只能说,MySQL 兼容是一把双刃剑,但总体而言,好处还是大于坏处。

简单粗暴的“优化器”和“执行器”

虽然今天 TiDB 已经有很先进的优化器和执行引擎,但当年我们完全没有优化器相关的知识,也没有人做过数据库优化器开发。

怎么办? 我们只能祭出程序员的万能法则:“不懂就先写个最简单的”,于是搞了个 rule-based 优化器,简单到让人难以置信。执行引擎就更直接了,我们直接用了最经典的 Volcano 模型,也就是“火山模型”,一层一层往下next调用,简单有效。

正是这种“无知者无畏”的简单策略,让我们迅速做出了第一个可用的版本。

“测试驱动”是真正的信仰

从 TiDB 开发的第一天起,我们就确立了测试驱动的策略。 原因也很简单,毕竟我们做的是数据库,客户的数据可不是闹着玩的,出一次大问题,我们就能直接失业。

我们甚至一度要求测试覆盖率达到 100%,听起来挺疯狂,但确实帮我们抓出了大量潜在的 bug。

除了常规的单元测试,我们还干了一些非常极端的事儿:

  • 移植了 SQLite 的 sqllogic test,当时觉得这事儿有点浪费时间,现在回想起来,却无比感谢当年咬牙做了这个决定。
  • 学习 Clojure 语言,硬着头皮做了Jepsen 测试,揪出了无数隐藏的事务 bug。
  • 对核心算法用上了 TLA+ 形式化证明,虽然这玩意儿真不好搞,但做出来之后让人睡得更安心了。
  • 引入 Chaos 工程,搞了个 Chaos 测试工具,最后甚至做出了一个非常受欢迎的开源项目 Chaos Mesh

Rust 和 TiKV 的诞生:避开 C++ 这个“大坑”

计算层搞定后,我们接下来面临的挑战是存储层。当时我们坚决不选 C++,因为这玩意儿复杂到无法控制,招多少人可能都 hold 不住,直接放弃。

恰巧这个时候 Rust 刚发布 1.0 版本,于是我们咬咬牙选择了 Rust:

  • Rust 性能好,内存安全性高,几乎能做到代码编译过了就能稳定运行,这个特性简直神奇。
  • Rust 社区很热闹,TiKV 因此也吸引了一大批社区贡献者。

不过Rust的问题也很明显:

  • 编译速度慢得要命,严重拖累开发速度;
  • 早期生态几乎为零,什么轮子都得自己造,费了不少劲。

在提到 TiKV 的时候,不得不提犯的一个巨大的错误,就是起了个让人误解的名字 —— Region。

Region 本是 HBase 里面的数据分片概念,结果碰巧云计算厂商也用 Region 表示地理区域。结果现在跟客户聊 Region,经常鸡同鸭讲,痛苦无比。

这给我们敲了个警钟:命名,真不是拍脑袋的事儿。随便起个名字,将来可能要花巨大的代价去填坑。

现在想想,如果我们早清楚的看到云的趋势,我们也不会取这么一个傻的名字了。

与 Spanner 的差距和妥协

虽然我们很多架构设计借鉴了 Spanner,但当年我们的客户基础设施跟 Google 的环境差太远了。Google 有TrueTime、Colossus 存储系统,而我们客户都是传统 IDC、物理机或虚拟机环境。

所以我们不得不做出妥协,设计了 Shared-Nothing 架构。

在当时,这个架构特别合适。但随着云时代的到来,这个架构逐渐显现瓶颈,未来 TiDB 也必须逐渐摆脱这些旧包袱。

小结:技术驱动的黄金时代

回头再看,TiDB 最初的那段时光,真的是程序员最幸福的时代:

  • 天天专注于技术,单纯而快乐;
  • 不断挑战新的技术问题,收获巨大的满足感;
  • 用纯粹的技术热情,吸引了大量志同道合的黑客们加入我们团队。

这一切,也为我们后来的发展埋下了坚实的基础。

三:商业化,我们怎么活下去?

灵魂拷问:“客户在哪儿?”

TiDB 一开始的开发阶段,大家沉浸在技术驱动的幸福里,大家很难坐下来一起认真思考一个灵魂问题:

“我们到底靠什么赚钱?”

对于当时的我们来说,写出牛逼的代码最重要,至于赚钱,好像没那么紧迫。再加上程序员普遍都有点“理想主义”,一听到“商业化”、“赚钱”这些词,总觉得俗不可耐。

但现实终究是现实。公司毕竟不是慈善机构,不赚钱迟早要凉。所以,越早解决“客户在哪”、“客户为什么要买”这些问题,就越能少吃点苦头。

现在回想起来,对我自己来说,真后悔没早点想清楚这些问题。毕竟,早一点考虑客户的需求,对公司发展、对自己的成长都会更有帮助。

从“技术自嗨”到“客户导向”的痛苦转型

程序员最难的转型是什么? 答案可能就是从“技术导向”到“客户导向”。

我们早期吃过最大的一个苦头,就是完全技术导向的思维,直接导致了一次惨痛的教训。

TiDB 有个参数之前默认是 false,这样性能很好,但宕机可能丢数据。我们在 2.0 版本做了个看似合理的决定:默认改成 true。

结果没想到,这个小小的配置改动,给当时一些开源用户带来了灾难性的后果 —— 升级完性能暴跌,业务直接崩了。

事后我们才意识到: 更好的处理方式是老用户升级保持旧配置,新用户默认新配置。这么简单的一个道理,我们居然没想到,只因为脑子里一直是“技术自嗨”,根本没考虑真实的客户场景。

类似的错误后面也出现过几次,每一次都像在提醒我们:

“做产品要以客户场景为中心,而不是自以为是的技术逻辑。”

惨痛的教训:游戏公司上线失败事件

印象最深的一次教训,发生在一家游戏公司身上。这家公司要做一款全球化的游戏,选中了我们 TiDB 作为底层数据库。

上线当天,情况比我们想象的惨烈多了。我们亲眼看着一个 SQL 热点,生生把 TiDB 打崩了。当时那种感觉,真的是叫天天不应、叫地地不灵。

回头想想,我们如果:

  • 早一点 Review 客户的 SQL;
  • 提前做一些热点拆分的工具;

或许这次灾难本可以避免。

但现实没有“如果”,客户的业务因此上线失败。这次惨痛的失败,让我们深刻认识到:

  • 客户的真实场景远比我们想象复杂;
  • 数据库生意不仅仅是技术问题,还涉及交付、服务和支持;
  • 对客户业务永远要保持敬畏。

从此,我们再也不敢轻易“技术自嗨”了。

银行上线成功:转型的关键里程碑

幸好,失败之后,我们很快就有了一个翻身机会:一家银行的核心系统改造项目。

这一次我们彻底务实了一回:

  • 和客户一起梳理了每一条业务逻辑;
  • 提前 Review 所有可能踩坑的地方;
  • 发现能力不足立马改进;
  • 做足了上线方案和应急预案。

最后的结果非常理想,项目顺利上线,客户也给了我们非常大的肯定。这次成功,真正树立了我们的信心,让我们逐渐从“技术导向”转变为“客户成功导向”。

那时候我们终于明白:

“产品好不好,客户说了才算。客户成功了,产品才真正成功。”

商业化转型的漫长之路

客观来说,从技术驱动到真正的商业化驱动、客户驱动,这个转型过程是漫长而痛苦的。坦白说,到今天为止,我们身上依然有着技术驱动的“顽疾”。

但数据库这门生意,我们越来越清楚:

  • 它不只是一个技术产品,更是一整套服务体系;
  • 除了产品本身的质量,交付、支持、售后缺一不可;
  • “客户成功”才是真正的终极目标。

小结:赚钱不丢人,客户成功才是真牛逼

写到这里,我想告诉所有程序员一句话:

“赚钱不是丢人的事,客户愿意掏钱买你的产品,才是真正对你技术的认可。”

我们写的代码最终都是为了给客户创造价值,让客户成功,公司才能真正成功,我们这些写代码的人,也才能真正实现自我价值。

四:可扩展性的力量

从被吐槽到爆发式增长:TiDB 3.0 的转折点

早期 TiDB 虽然打着“分布式数据库”的招牌,但说句实话,性能真的不怎么样。经常客户用了就吐槽:“扩展性倒是好,可这性能实在是太差了。”

我们心里很清楚,要真正赢得客户的认可,性能必须过关。于是,我们在 TiDB 3.0 版本上下了大力气 - 在一些关键路径上做了多线程处理优化,性能一下子提升了好几倍。

3.0 版本发布之后,我们惊喜地发现客户开始迅速增长——

“当性能过了门槛,扩展性立刻就变成了我们的超级武器。”

单车打不开的尴尬事故

扩展性强,意味着客户增长速度快。但客户规模上去了,问题也随之变大。

记得有一次早晨,我出门扫码开共享单车,突然发现打不开锁,周围一群人也都在抱怨:“怎么回事,今天单车都坏了?”

结果不久后得知,原来是我们 TiDB 数据库挂了,导致整个单车系统无法开锁。

那一瞬间我真的超级尴尬,自己的产品搞砸了自己的生活,这种滋味非常难受。

但也正是这件事情让我第一次真正意识到——

“原来 TiDB 已经被很多公司用在了真正核心的业务系统上。”

客户相信 TiDB,就是因为相信它的扩展能力,但一旦我们掉链子,客户受到的影响也会更大。

磁盘爆满的午夜惊魂

另一个印象深刻的案例发生在一个互联网头部客户的现场,当时客户的 TiDB 集群规模已经超过百 TB。

结果有一天半夜,他们磁盘被写爆了,TiKV 开始频繁崩溃,整个系统岌岌可危。客户急忙找我们救火。

当时情况特别棘手:

  • 删除日志、垃圾数据,结果发现删的速度远赶不上写入的速度;
  • 调度数据迁移,又因为 Raft Snapshot 也会占用磁盘空间,越迁越爆。

我们在客户办公室熬到了凌晨四点,最终想了个折中的办法:

  • 大幅降低调度频率,控制 Snapshot 产生;
  • 同时限制业务写入速率,让系统慢慢恢复平衡。

虽然最后解决了问题,但这个深夜的经历,再次提醒我们:

“扩展性强意味着责任更大,客户越信任我们,我们身上的担子就越重。”

为什么客户放弃了竞争对手?

在海外市场,我们曾经输给过某些知名竞争对手。客户一开始都会选择更有名的竞品,结果过了半年,客户又回来了。

原因很简单: 竞品虽然名气大,但到了真正业务规模上来之后,扩展性撑不住。

而 TiDB 却能实实在在地经受住百 TB 甚至 PB 级别数据规模的考验。

这个时候,我们才真正体会到,扩展性不是喊口号,而是客户真正选型时绕不开的刚需。

客户增长太快带来的隐患

TiDB 在 3.0 后发展太顺利,客户增长速度快到不可思议,甚至一度让我们产生了盲目的自信。但后面我们逐渐发现,这种盲目自信埋下了不少隐患,尤其在产品质量上,后来爆发了不少问题。

但这一切,都是后话了。

小结:扩展性的力量与责任

TiDB 靠扩展性赢得了客户,也背负了更大的责任。越是客户核心的业务系统,越容不得半点闪失。

这段时间我们深刻理解到一句话:

“扩展性,既是我们的超级武器,也是沉甸甸的责任。”

五:从混乱无序到初见曙光(产品驱动与客户成功驱动的转变)

TiDB 4.0 的发布之痛

TiDB 早期发展太快了,以至于我们逐渐陷入了一种无序而混乱的状态。最典型的例子就是4.0版本的发布。

当时我们延续着“一年一个大版本”的节奏,看似很稳,但实际内部非常紧张:每年大量的新功能堆叠在一起,导致测试周期严重不足,产品质量逐渐失控。

结果 TiDB 4.0 发布后,我们连续发了 12 个补丁版本才把质量稳定下来,客户的抱怨、投诉几乎把我们的信心打到了谷底。

那时候我经常半夜被电话吵醒,每天早上第一件事就是看有没有客户因为版本 bug 又炸了。

痛定思痛,我们开始反思:

“是时候改变我们的做法了。”

没有 PM 的自负

回头看,我们当时犯了一个特别大的错误,就是整个公司几乎没有 PM(产品经理)的角色。

最搞笑的是,我们当时甚至自信满满地说:“我们不需要 PM,程序员自己就是最好的 PM。”

事实证明,这种想法蠢到极点。

没有 PM 导致:

  • 功能优先级没人管;
  • 产品战略没人想;
  • 客户场景没人深度研究;

最后,我们的产品变成了一锅乱炖,没有清晰的战略方向,功能叠加得很随意,也无法真正解决客户最核心的痛点。

PM 角色的引入:从技术到客户成功的转型

后来,我们终于认清了一个事实:

“程序员不可能做好所有的事情,产品必须由专门的角色负责。”

于是,我们开始认真引入了专业的 PM 角色。他们的加入,带来了一个非常关键的变化:

  • 明确了功能开发的优先级;
  • 每个版本都有了明确的主题;
  • 真正以客户需求为中心,逐渐转变成产品驱动和客户成功驱动。

这次转型带来的最大变化,就是让我们从“技术自嗨”变成真正“解决客户问题”,逐渐找回了客户的信任。

从“一年一版本”到“两个月火车发布”,再到“半年发布”模式

TiDB 4.0 的发布惨痛教训,让我们认识到: “一年一版本”看似稳定,实则风险巨大。

于是我们改成了“两个月一次”的“火车发布”模式,快速迭代、小步快跑,每次发布的功能不多,质量更好掌控。

但新问题又来了:版本太多了,客户都不知道怎么选。如果发现一个 bug,要在好几个版本之间不停地 cherry-pick,研发成本又特别高。

于是,我们最后找到了折中的方案——“半年发布”模式:

  • 既能兼顾稳定性,又能控制版本数量;
  • 同时也给研发团队足够的时间保证产品质量。

以质量为第一导向:从 6.0 版本开始的彻底转型

经历了 TiDB 4.0 的惨痛经历后,我们在 TiDB 6.0 开始,把质量明确放在了第一位。

这一次,我们真正下了大功夫:

  • 大幅优化了内存使用,解决了 OOM 的问题;
  • 系统地改善了磁盘 IO 抖动问题;
  • 将大量精力放在稳定性优化上,而不是盲目追求新功能。

结果 TiDB 6.0 发布后,客户反馈一下子好了很多。

云时代下,重新回到“一年一个 LTS 版本”

但云时代来了,情况又发生了变化:

  • 我们可以在云上快速发布功能,让客户提前用起来;
  • 通过云的快速反馈,验证功能稳定后,再整合到一年一次的 LTS 版本发布中。

这个策略让我们既能保持产品创新速度,又能保证稳定性。用云的力量实现快速反馈,再用LTS版本提供长期稳定的保障,这个组合拳效果非常好。

数据库的本质思考:客户数据处理工具

走到今天,我们逐渐开始认真思考:

“数据库的本质到底是什么?”

答案其实很简单:

  • 数据库不需要很多 fancy 的功能;
  • 最重要的是能方便、稳定、安全地帮助客户处理好他们的数据。

这个认知彻底改变了我们后续的开发策略,TiDB 越来越成为一个真正面向客户场景的数据库产品。

小结:从无序到产品驱动与客户成功驱动

回顾这段历程,我们从混乱无序,逐渐走向了清晰的产品驱动和客户成功驱动。

这个转型虽然漫长而痛苦,但最终我们看到了曙光,真正学会了:

  • PM 的重要性;
  • 质量第一的原则;
  • “小步快跑”到“云时代”的灵活发布策略;
  • 以及数据库本质的重新思考。

六:TiDB Cloud,那段辛酸又收获颇丰的云旅程

云时代的误解:把数据库“搬到云上”就完事了?

TiDB Cloud 的故事说起来挺长的。坦白说,这几年做 TiDB Cloud,真的是走了不少弯路。

最初我们对“云”的理解实在太简单了:

“不就是把 TiDB 数据库放到云上跑起来嘛,这有什么难的?”

结果现实狠狠地教训了我们一次又一次,才终于明白: “云数据库”绝对不是简单地把数据库搬到云上这么简单。

这就像是刚接触 Kubernetes(K8s)时,我们觉得:“不就是写个 YAML 文件部署一下嘛?” 但真上了生产环境才发现,事情比我们想象得复杂百倍。

早期 Kubernetes 的坑与教训

在很早(2018年),我们就决定把 TiDB Cloud 构建在 Kubernetes 之上。当时 AWS 还没有成熟的EKS 服务,我们居然天真地选择了一个叫 Gardener 的开源项目自己运维 K8s 集群。

这一决定后来变成了我们巨大的噩梦:

  • Gardener稳定性奇差,维护成本爆炸;
  • 我们甚至有专门的工程师每天被折磨得痛不欲生;
  • 后来花了整整数年,才成功从 Gardener 迁移到云厂商托管的 EKS 集群

这次教训深刻提醒我们:

“云时代,要充分相信云厂商的进化速度。”

本地盘到云盘的转型:理念的颠覆

更严重的错误是我们早期过于固执于本地磁盘:

  • 觉得本地盘性能好,死活不肯用云盘;
  • 为了让 K8s 支持本地盘的调度,花了无数精力;
  • 结果后面发现,云盘性能突飞猛进,而本地盘运维实在复杂得吓人。

客户增长后,光本地盘的运维成本,就能把我们活活折磨死。

现在回头再看,我们早期的坚持真的是:

“程序员的完美主义,碰到了云时代的现实,结果就是狠狠地被现实揍了一顿。”

云服务运维的“新世界”:我们是卖服务的

做传统的软件公司,我们只管把软件交付给客户,运维是客户的事。

但云服务不同,客户买的就是服务。

  • SLA 得管好;
  • 运维窗口得规划好;
  • 安全合规问题一个不能落;
  • 客户一旦出问题,我们得随时顶上。

做了云服务之后,我才真正体会到:

“能做好服务运维,比写个好软件难上十倍。”

但也正是这种痛苦的磨练,让我们逐渐成长为一个真正具备云服务意识的团队。

下一代 TiDB Cloud:从 Shared Nothing 到 Shared Everything

TiDB 最初架构是 Shared Nothing(共享无物),非常适合 IDC 时代,但在云时代却逐渐暴露了问题:

  • 节点挂了就得重新调度数据;
  • 存储容量扩容依赖物理节点,扩容成本极高。

于是,我们开始大规模转型:

  • 将TiDB的数据存储从云盘迁移到 S3 对象存储;
  • 架构从 Shared Nothing 变成了更弹性的 Shared Everything 架构;
  • 进一步服务化拆分,真正变成了微服务架构,极大提高了扩展性与灵活性。

有人问:“放到 S3 性能不就差了吗?” 答案是:“不会,因为我们在缓存、访问路径等多层面都做了深度优化。”这个有空后面再说。

拆分微服务的最大好处就是资源利用率和灵活度明显提升。比如:

  • 可以把一些重 IO 的操作(如 Compaction)独立成服务;
  • 客户高负载时弹性扩展,低负载时迅速回收资源,云成本下降显著。

转型之后,我们终于真正在云时代找到了正确的打开方式。

小结:TiDB Cloud 的辛酸史与未来

回顾 TiDB Cloud 这段旅程,实在是一把辛酸泪,但也充满了收获:

  • 早期对云的误解,让我们交了不少学费;
  • 从 K8s、磁盘选择,到微服务架构,每一次的踩坑,都让我们更接近云的真谛;
  • 客户运维体系的建立,也让我们真正成长为一个云服务导向的团队。

如今,TiDB Cloud 已经占了公司超过一半的营收。这说明了什么? 说明了云不只是未来,更是现在。

尽管过程艰难,但我们终于找到了属于 TiDB Cloud 的正确道路。未来,我们相信 TiDB Cloud 还能走得更远。

七:全球化之路,程序员的国际化挑战

国际化:这是一场信任游戏

PingCAP 在真正走到全球市场面前时,我们就发现:

“为什么全球的客户会相信一帮草根做出来的数据库产品?”

毕竟数据库不是一般的软件,客户要把核心数据放进去,简直就是把命运交到你手里。

要建立信任,哪有那么容易?

开源是我们全球化的最大底牌

好在 TiDB 从一开始就是开源的。这给了我们一个天然优势:

  • 客户可以直接下载代码试用;
  • 他们自己遇到问题可以翻翻代码,看看 bug 怎么回事;
  • 信任的门槛一下子降低了很多。

我记得日本的一家支付公司就是这么认识我们的:

他们最初用的是 AWS Aurora,但每次一搞促销活动,Aurora 就会被业务负载压垮。 后来客户自己去 GitHub 翻开源数据库时,找到了 TiDB,一试效果不错,果断迁移。现在他们的支付规模越来越大,TiDB 也成了日本市场支付行业的主流选择之一。

开源的力量,真的不容小觑。

连续跑了三年,TiKV 崩了,我们却笑了

更神奇的是上面这个日本客户,后来给我们报了个 bug:“我们的 TiKV 节点突然崩了!”

我们一看才发现:

“哥们,你这个节点三年都没重启过啊!”

居然有 TiKV 节点连续稳定运行了三年,我们先是吓了一跳,接着是狂喜——

因为这说明了 TiDB 产品的稳定性已经到了一个新的高度。这件事也成了后来全球客户推广时的最佳案例之一。

另外一次,日本 AWS 出现了 AZ 挂掉的严重事故,这个客户的业务服务受到了影响,但 TiDB 数据库本身居然还能继续对外提供服务。这件事直接大幅提升了全球客户对 TiDB 的信任。

捐赠 CNCF:开源不仅仅是放代码

为了提高 TiDB 在全球的知名度,我们还干了两件大事:

  • 把核心分布式存储 TiKV 项目捐献给了 CNCF(Cloud Native Computing Foundation),成功成为 CNCF 毕业项目;
  • 把内部开发的 Chaos 测试工具 Chaos Mesh 也捐给了 CNCF,让更多开发者能用来验证系统的可靠性。

这两个项目的开源和捐赠,让全球客户和社区更加认可我们,知名度也迅速提升。

Rust 语言带来的“神助攻”

此外,我们早年大胆选择 Rust 开发 TiKV,这个决定也给了我们意外的全球化助力:

  • Rust 社区本身全球活跃,TiKV 自然也吸引了全球开发者;
  • 很多国外工程师愿意贡献代码,TiKV 的生态不断完善。

TiKV 逐渐在国际上成了 Rust 社区的明星项目,间接帮助我们拓展了更多海外客户。

国际化的真正挑战:本地化做不好,国际化也没戏

早期我们以为“国际化”就是把产品文档翻译成英文,日文或者其他,再派个销售飞过去卖就行了。

后来我们才明白一句话:

“最好的国际化,就是本地化。”

不同地区的文化差异太大,技术再牛逼,客户支持做不好,客户一样骂你没商量。

于是我们开始认真做全球本地化:

  • 在欧美、日本、东南亚成立本地研发中心;
  • 提供 7x24 小时的全球本地化技术支持;
  • 雇佣本地的销售与售前工程师,真正理解客户文化和需求。

这才让我们真正建立了全球化的竞争优势。

参观计算机历史博物馆的愿望

记得 2018 年,我和 Ed 在美国 Mountain View 参观了计算机历史博物馆。当时我们互相开玩笑说:

“希望有一天 TiDB 也能登上这里的展柜。”

如果那一天真的到来,那意味着 TiDB 真正被全球客户认可,变成了一个有国际影响力的数据库产品。

这个梦想到现在依然激励着我们继续在全球市场努力前进。

小结:全球化,从程序员到真正国际化团队

TiDB 的全球化之路,充满了艰难和挑战,但也收获了无数宝贵经验:

  • 开源为全球化打开了信任之门;
  • Rust语言和 CNCF 项目,帮我们在全球社区建立了声誉;
  • 本地化才是国际化的真正精髓;
  • 全球化团队建设,是真正支撑全球客户成功的基石。

如今 TiDB 已经在全球拥有了大量客户,我们终于能够自豪地说:

“我们是一个全球客户信任的开源数据库。”

八:客户成功,是程序员最大的骄傲

客户成功到底是什么?

客户成功,是 PingCAP 成立以来最核心的价值观。

作为程序员,我们最开始都以为:

“写出优雅、高效、牛逼的代码,就是成功。”

但做了几年数据库后,我们才慢慢明白: 真正的成功,只有一个标准——

客户成功。

如果客户的业务因为使用了我们的数据库而变得更好,那么我们的数据库才真正算成功。

客户是最好的老师

我们为什么这么强调客户成功?

一方面很现实:客户掏钱买单,公司才能活下去,我们也才能安心写代码。

但更重要的一方面是,我们发现客户本身就是我们最好的老师:

  • 客户往往比我们更懂业务场景;
  • 客户的真实需求推动我们技术进步;
  • 客户甚至帮我们突破了想象不到的边界。

我记得北美有个客户,他们的研发负责人以前在 Google 负责 Spanner 和 Bigtable,整整干了 20 多年分布式系统。当我们 TiDB 出现一些问题时,他们给了我们不少宝贵建议。

这种来自客户的“高手过招”,真正让我们团队水平大幅提升。

客户推动 TiDB 突破边界:50TB 单表导入

更夸张的案例发生在另一个北美客户身上,他们提出一个我们完全没想到的需求:

“能不能支持导入单表 50TB 的数据?”

50TB 单表,这在当时对我们来说简直就是一个疯狂的要求。 最初几次尝试全部失败了,客户非常愤怒,甚至威胁:“一个星期内搞不定,合同就终止!”

我们连夜死磕技术难题,优化流程、提升性能,最终成功了。

刚想松口气,又有个客户来了更大的挑战:“我们这里有个单表要导入 100TB 数据,可以吗?”

幸好有之前的 50TB 经验,客户自己竟然导入成功了。

这次经历给了我们巨大自信:

“原来 TiDB 可以做到我们从没想过的极致场景。”

SaaS 场景与百万表支持:客户教我们做产品

另一个让我们印象深刻的是一个头部的 SaaS 客户。

客户问:“TiDB 能不能支持 100 万张表?”

我们当时非常震惊:

  • 一般 OLTP 系统咋可能有这么多表;
  • 但这家公司是 SaaS 模式,每个租户单独数据库,每个数据库又几张表;
  • 因为租户数量巨大,一个集群必须承载百万张表的需求。

这种规模,我们之前从未考虑过。

为了满足客户需求,我们直接对TiDB底层架构做了大规模重构:

  • 优化 Schema 层;
  • 重构优化器;
  • 大量减少单表管理的内存占用。

最终成功支持了百万张表的极限场景。

后来其他 SaaS 客户听说了这件事,也开始尝试和选择了 TiDB。 可以说,这个客户需求,直接帮助我们打开了一个全新的市场领域。

研发支持客户,到底值不值得?

TiDB 研发早期,有一种争论:“研发要不要直接支持客户?”

毕竟研发团队都喜欢安静地写代码,谁也不愿意天天接客户电话、跑客户现场。

但我们最终还是决定:研发必须支持客户。

我们甚至专门成立了一个叫 Customer Advocate 的项目:

  • 对于重要客户,分配一位研发负责人;
  • 研发负责人需要深入理解客户场景和需求;
  • 一旦客户有问题,可以求助这位研发负责人协调解决。

有一个研发负责人一年跟同一个客户开了超过 200 次会,听起来简直疯狂。

但结果却非常好:

  • 客户获得了最专业的支持;
  • 工程师获得了最真实的场景反馈;
  • 产品获得了更高的客户满意度和忠诚度。

客户自己也开始用脚投票,先将他们的 HBase 切换到 TiDB,现在开始切更大规模的 Aurora。

客户成功的价值:最好的产品,来自客户的场景

回头看,我们才深刻认识到:

  • 客户是真正的专家;
  • 真实的业务场景比纸面上的技术设计更重要;
  • 只有深入客户一线,我们才能真正做出客户想要的数据库产品。

这种坚持客户成功的策略,也为我们赢得了大量全球客户的认可。

小结:程序员最大的骄傲是客户成功

从“技术导向”到“客户成功导向”的转变, 对我们这群程序员来说,并不是一件容易的事。

但当我们真正做到时,我们才发现:

“客户成功,才是我们作为程序员最大的骄傲。”

客户的每一句感谢,每一次信任,每一次业务的成功,都成为我们不断前进的动力。

而TiDB能走到今天,靠的正是这种“客户成功”的理念。

未来,我们仍将坚定地践行:

以客户成功为唯一目标,持续打造更好的数据库产品。

九:我的十年成长,从程序员到技术管理者的蜕变

作为“员工一号”的十年旅程

十年前,我以 PingCAP 第一个正式员工的身份加入,亲身参与了 TiDB 从零到一的全过程。这十年间,公司的快速成长与变化,也带动了我个人成长的巨大转型。

从一个单纯热爱技术的程序员,到如今带领整个研发团队的技术管理者,这条成长之路充满挑战与收获。

程序员到管理者的第一次挑战:尊重康威定律

管理组织的第一个重要原则,我学到的是“康威定律”(Conway’s Law):

“组织结构是什么样,产品结构就是什么样。”

要想开发出好的产品,先要设计出合适的组织结构。

我们 TiDB 是分布式的,组织结构也必须是分布式的,这意味着管理起来挑战更大:

  • 大家分布在不同地区,如何保持高效沟通?
  • 如何避免信息孤岛? 如何保证团队协作的效率?

最开始,我们的确吃了不少苦头,但慢慢摸索出了高效的异步沟通和协作方式。

异步协作的奥义:代码和文档胜过会议

全球化分布式的团队,想开个会都难,这种情况下,我们只能充分利用 GitHub 平台,以代码和文档为中心,完全异步沟通:

  • 每个功能都需要有明确的文档;
  • 每个重要的设计决策,都要经过公开的设计文档 Review;
  • 日常交流围绕文档, Issue 和 Pull Request 进行。

事实证明,这种方式比起开无数会议高效得多。

术语(Terminology)的力量:沟通的关键

最开始我们很少重视术语的统一,结果全球同事在交流时经常混乱不堪:

  • 一个词在不同部门、地区间会造成巨大误解;
  • 导致很多问题浪费大量时间在澄清概念上。

后来我深刻意识到术语定义的重要性,亲自牵头了很多术语的标准化定义工作。 大家统一术语之后,沟通效率大大提升,团队协作也更加顺畅。

管理角色的进阶挑战:从 Leader 到研发部门负责人

从单纯写代码的 IC(Individual Contributor)成长为 Leader,本身已经足够有挑战了。但再往上到部门负责人,管理的不再是单个工程师,而是管理者时,这个挑战就更复杂了:

  • 我必须学会放权,信任团队;
  • 我必须更注重团队氛围和文化,而不是亲自解决所有技术问题;
  • 我必须开始思考如何激励下属的下属,让整个组织高效协作。

这些能力远远超过单纯技术能力的要求,对我来说无疑是一次巨大的挑战。

组织转型:产品驱动与客户成功导向的文化建设

管理这么大一个团队,我还学到一个非常重要的经验:

  • 团队的文化,比流程、制度更重要;
  • 团队文化建设的核心,就是“客户成功导向”。

我们不再单纯以技术为导向,而是不断强调:

“我们做的一切,都是为了客户成功。”

在每次会议、每次 Review 里,我都会反复强调客户成功的重要性。 慢慢地,整个团队都形成了一个共识:

“写代码不是为了自我欣赏,而是为了客户真正的需求。”

这种文化建设最终深刻影响了我们的产品质量和客户满意度。

个人成长的反思:什么才是真正的“技术管理者”?

十年过去了,回头看自己的成长,我经常问自己:

“什么才是真正优秀的技术管理者?”

以前我以为技术牛逼就够了,现在我才明白:

  • 技术只是基本功;
  • 沟通能力、组织能力、同理心、客户视角同样重要;
  • 真正优秀的技术管理者,不仅能写代码,更要懂人、懂业务,懂客户。

这才是我十年成长最大的收获和反思。

小结:下一个十年,我的旅程才刚刚开始

在 TiDB 走过的十年,让我从一个普通的程序员成长为一家全球化科技公司的技术管理者。

我见证了产品从零到全球客户使用的全过程,也见证了自己从技术专家到管理者的转型与成长。

而十年之后的今天,我依然充满期待:

  • 期待自己继续成长;
  • 期待带领团队创造更大的成功;
  • 期待自己能真正成为一名优秀的技术领导者。

就像当年加入 PingCAP 时一样:

“我的下一个十年旅程,才刚刚开始。”

十:再见十年,迎接下一个旅程

讲到这里,这十年 TiDB 与我的故事终于告一段落。当然了还有太多的东西没有提及,毕竟 10 年里面发生了太多的事情。

回头看,这一路有太多的意外、太多的挑战,但更多的是惊喜与成长。从当初愚人节那天 Max 的一句话,到如今 TiDB 已经成为全球知名的开源分布式数据库;从当初单纯地追求技术完美,到如今牢牢抓住客户成功这个根本目标;从最初简单的创业理想,到如今成就全球化、云时代的数据库产品,这段旅程带给我远远超出我想象的成长与收获。

如果一定要总结,我想说:

  • 开源是一种信念,让我们能够快速赢得客户与社区的信任;
  • 产品驱动与客户成功才是企业成长的真正核心;
  • 可扩展性不仅是技术能力,更是企业发展与客户成功的强大基石;
  • 国际化是开源创业必经的挑战,也是一次难忘的文化与思维拓展之旅;
  • 作为一名程序员,最终的骄傲不是写了多少行代码,而是客户真正因为你的产品而成功;
  • 从技术到管理的成长,痛苦但必要,它让我学到了太多代码之外的东西。

TiDB 走过了十年,而我的旅程也刚刚开始。我相信,下一个十年我们还会继续成长、继续挑战,也会继续以客户成功为目标,持续为全球客户提供更好的产品。

感谢这十年里每一位帮助过我们的客户、伙伴和同事,是你们的信任与陪伴,让这一切成为了可能。

期待我们下一个十年的再次相遇!

致谢

这篇文章是我口述,通过 ChatGPT 录制,生成文字记录,然后基于文字记录,通过 GPT-4.5 整理生成了文章。我大概率猜测 GPT-4.5 通过我的口述,大概知道了一些我的写作风格,所以写出来的文章,我只是做了一些大概的修改。AI 真的越来越强大了。下一个十年,TiDB 也会在 AI 上面有更多的故事,不过这个就是后话了。

编辑于 2025-04-19 14:12・广东

1
2
0
0

声明:本文转载于 https://zhuanlan.zhihu.com/p/1896834371740210342

评论
暂无评论
导读人生最宝贵的财富,莫过于回忆与反思。一:旅途的开始——4月1号的愚人节邀请函愚人节那天,我收到了创业邀请为什么会找到我?两个震撼:开源和远程办公第一次线下见面,居然像多年好友“真开源”,透明到几乎“打脸”我们为什么要做一个分布式数据库?不知者无畏,程序员开启的“打怪升级”之旅二:技术驱动的幸福时刻做产品什么时候最爽?从零开始造一个数据库,我们真没那么疯狂为什么我们选了 Go?是好事,但坑也是真多简单粗暴的“优化器”和“执行器”“测试驱动”是真正的信仰 和  的诞生:避开 C++ 这个“大坑”与 Spanner 的差距和妥协小结:技术驱动的黄金时代三:商业化,我们怎么活下去?灵魂拷问:“客户在哪儿?”从“技术自嗨”到“客户导向”的痛苦转型惨痛的教训:游戏公司上线失败事件银行上线成功:转型的关键里程碑商业化转型的漫长之路小结:赚钱不丢人,客户成功才是真牛逼四:可扩展性的力量从被吐槽到爆发式增长:TiDB 3.0 的转折点单车打不开的尴尬事故磁盘爆满的午夜惊魂为什么客户放弃了竞争对手?客户增长太快带来的隐患小结:扩展性的力量与责任五:从混乱无序到初见曙光(产品驱动与客户成功驱动的转变)TiDB 4.0 的发布之痛没有 PM 的自负PM 角色的引入:从技术到客户成功的转型从“一年一版本”到“两个月火车发布”,再到“半年发布”模式以质量为第一导向:从 6.0 版本开始的彻底转型云时代下,重新回到“一年一个 LTS 版本”数据库的本质思考:客户数据处理工具小结:从无序到产品驱动与客户成功驱动六:TiDB Cloud,那段辛酸又收获颇丰的云旅程云时代的误解:把数据库“搬到云上”就完事了?早期 Kubernetes 的坑与教训本地盘到云盘的转型:理念的颠覆云服务运维的“新世界”:我们是卖服务的下一代 TiDB Cloud:从 Shared Nothing 到 Shared Everything小结:TiDB Cloud 的辛酸史与未来七:全球化之路,程序员的国际化挑战国际化:这是一场信任游戏开源是我们全球化的最大底牌连续跑了三年,TiKV 崩了,我们却笑了捐赠 CNCF:开源不仅仅是放代码Rust 语言带来的“神助攻”国际化的真正挑战:本地化做不好,国际化也没戏参观计算机历史博物馆的愿望小结:全球化,从程序员到真正国际化团队八:客户成功,是程序员最大的骄傲客户成功到底是什么?客户是最好的老师客户推动 TiDB 突破边界:50TB 单表导入SaaS 场景与百万表支持:客户教我们做产品研发支持客户,到底值不值得?客户成功的价值:最好的产品,来自客户的场景小结:程序员最大的骄傲是客户成功九:我的十年成长,从程序员到技术管理者的蜕变作为“员工一号”的十年旅程程序员到管理者的第一次挑战:尊重康威定律异步协作的奥义:代码和文档胜过会议术语(Terminology)的力量:沟通的关键管理角色的进阶挑战:从 Leader 到研发部门负责人组织转型:产品驱动与客户成功导向的文化建设个人成长的反思:什么才是真正的“技术管理者”?小结:下一个十年,我的旅程才刚刚开始十:再见十年,迎接下一个旅程致谢