InfluxDB正式从Go切换到Rust


InfluxDB 是一个用 Rust 编写的开源时间序列数据库,使用 Apache Arrow、Apache Parquet 和 Apache DataFusion 作为基础构建模块。

从Go切换到Rust原因:

  • 没有垃圾收集器
  • 无畏并发(感谢 Rust 编译器)
  • 性能
  • 错误处理
  • Crates

在我选择用 Rust 开发第 3 版时,我还认为我们最终会使用大量 C++ 代码。我预计会从现有的成熟开源项目中引入查询规划器、优化器和执行引擎,而 Rust 能够在不影响性能的情况下引入这些依赖项,这是我认为我们会用到的。

结果,我们最终决定使用 Apache Arrow DataFusion,这是一个纯 Rust 引擎。在过去的三年里,我们为它做出了巨大的贡献,我们的工程师安德鲁-兰姆(Andrew Lamb)现在是 Arrow PMC,这要归功于他的组织和编程工作。

还有一个问题是我们为什么要重写。我们想满足一些重要的要求:

  • 无限基数
  • 以列式数据库的性能对时间序列进行分析查询
  • 使用对象存储作为历史数据的耐用层(即计算与存储分离)
  • 兼容 SQL 和更广泛的生态系统

所有这一切意味着我们将重写数据库的大部分核心内容。InfluxDB 的第 1 版和第 2 版是围绕我们的定制存储引擎(TSM 和 TSI)和查询引擎构建的。它是一个用于元数据的倒排索引,与底层时间序列存储(按时间排序的时间/值对的单个序列)搭配使用。这种结构无法让我们实现无限的卡入度或分析查询所需的性能。

2020 年初,当我看到这一切时,而且我在前一年左右一直在关注 Rust,我想,如果我们无论如何都要重写大部分数据库,我们不妨使用 2020 年的最佳语言选择,而不是 2013 年(我们创建 InfluxDB 时)的最佳语言选择。

我们还计划尽可能多地使用其他地方的开放源代码来构建数据库。因此,我们最终使用了 Apache Arrow、Apache Parquet、Apache DataFusion 和 FlightSQL。

我知道人们认为我们再次重写数据库是疯了,但事后诸葛亮。如果我当时知道现在所知道的一切,我就会做出不同的选择,但我们在 2013 年启动时也没有同样的工具。我很有信心,我们现在所取得的成绩是一个非常坚实的基础,我们可以在这个基础上继续发展很多年。

只要我还在 Influx 工作,这将是我们需要的最后一次重写。我绝对没有体力再重写一次了;)