TigerBeetle:世界上最有趣的数据库
TigerBeetle 被广泛认为是世界上最有趣的数据库,其开发理念与主流团队截然相反。主流团队追求快速编码,而 TigerBeetle 倡导“慢速写代码”;主流团队视测试为必要之恶,而 TigerBeetle 完全构建于确定性模拟测试之上;大多数软件依赖众多库,而 TigerBeetle 实现了零依赖。此外,它还强制使用静态内存分配、在生产环境中保持断言启用,并选择了 Viewstamped Replication 而非 Raft,甚至选用 Zig 而非 Rust 作为开发语言。
为什么需要思考借方和贷方的数据库
TigerBeetle 被定义为“金融交易数据库”,其核心原语是借方和贷方。尽管这听起来像会计术语,但创始人 Joran 认为,金融交易本质上是事务性 SQL 最初设计的目标。1985 年,图灵奖得主 Jim Gray 在开创性论文中定义了事务处理性能的度量标准——每秒事务处理量,其核心就是“借方贷方”业务事务。然而,当今使用 SQL 数据库实现借方贷方操作通常需要 10-20 次查询往返,效率低下。随着全球实时支付交易量激增,传统数据库面临巨大压力。TigerBeetle 为此从头构建,将借方贷方作为一级原语,单次查询可在一个往返中处理多达 8190 笔交易,实现“千倍性能提升”。尽管数据库通常需要十年构建,TigerBeetle 仅用三年半就达到了生产就绪状态,并通过了严苛的 Jepsen 测试。
一个真正的现代数据库
默认分布式架构
当 PostgreSQL 和 MySQL 构建时,主流是单节点架构;而在云时代,分布式成为必需。TigerBeetle 默认分布式设计,采用 MIT 的 Viewstamped Replication 共识协议,无需外部依赖(如 Zookeeper),只需在集群节点安装二进制文件即可。
时钟容错
TigerBeetle 不仅关注共识逻辑时钟,还考虑到物理时间戳在审计和合规中的重要性。它通过结合集群中多个时钟,使用 Marzullo 算法构建容错的“集群时间”,以应对 NTP 失效等场景,并能在时钟故障过多时安全关闭。
存储容错
传统数据库假设磁盘以可预测方式故障,而 TigerBeetle 旨在抵御静默数据损坏、I/O 误定向等“灰色故障”。它采用协议感知恢复、不可变数据存储、校验和与哈希链,甚至直接操作原始块设备以避免文件系统问题。其自研的 LSM Forest 存储引擎进一步增强了存储容错能力。
选择 Zig 语言
TigerBeetle 完全用 Zig 编写,因其提供完整的 C 生态系统、出色的可读性、对静态内存分配的天然支持以及良好的开发体验。尽管 Rust 团队部分成员加入,但 Zig 更符合 TigerBeetle 的设计目标。
确定性模拟测试与 VOPR
确定性模拟测试通过模拟器在确定时间线上运行几乎所有可能的系统场景(包括操作系统、网络、磁盘等故障),能在短时间内等效进行数年测试。TigerBeetle 开发了名为 VOPR(Viewstamped Operation Replicator)的测试集群,运行在 1000 个 CPU 核心上,24/7 不间断运行。由于模拟中时间可被确定性加速约 700 倍,每天相当于模拟运行近 2000 年。TigerBeetle 还将 DST 游戏化,通过浏览器中的 WebAssembly 模拟器让用户直观体验系统故障场景。
TigerStyle 编程风格
TigerStyle 是 TigerBeetle 的工程方法论,强调在设计与推理阶段投入更多精力。它借鉴了 NASA 的“十诫”,要求在代码中广泛使用断言(平均每函数至少两个),不仅断言预期行为,也覆盖“负空间”。在性能方面,TigerStyle 要求从设计初期就思考网络、存储、内存、CPU 这“四种主要颜色”在带宽和延迟下的表现,并通过批量处理、热循环提取等技术优化性能。
TigerBeetle 结合现代研究成果与古老业务形式,为数据库带来了前所未有的性能与稳定性保证。它将系统与存储工程发展为一种艺术形式,并在过程中保持趣味性。通过巧妙运用 DST,它在短短数年内就达到了 Jepsen 标准。用户可通过简单命令开始体验。