用Rust编写的数据库GreptimeDB现开源


GreptimeDB用于时间序列数据的多租户、分布式和云原生实时处理系统,是一个优秀的数据处理系统,可让您实时从时间序列中获取价值。与TimescaleDb 类似,Timescale 也将 Rust 用于他们的工具包扩展。

为什么选择 Greptime
几年前,我在一家大型金融科技公司工作,被要求构建一个超大规模(支持千万级监控指标,数十万个容器,以及由数千个容器组成的微服务的监控解决方案。在研究了 InfluxDB、Prometheus 等流行的解决方案之后,我发现目前还没有满足我们需求的开源解决方案(这些需求现在已经遍布各地):

  • 以合理的成本处理海量、高基数的时间序列数据点
  • 每秒实时处理至少 100K 个查询和 500M 个数据点
  • 满足数据分析的各种高要求

为了解决这些问题,我和我的团队在过去几年里构建了一个专门针对时间序列的超大规模数据处理系统。每秒不间断写入数亿数据点,多维度实时分析数百万指标(告警、根因分析等),低成本存储数千万遗留指标. 同时,我们提供强大的SQL/Python分析能力,帮助数据科学团队轻松构建AIOps/FinOps等智能应用。我们处理的所有数据都是时间序列数据。

随着物联网传感器生成大量数据,我突然想到时间序列数据如何帮助我们建设一个更美好的社会,而它的价值却被低估了。事实上,您现在正受益于时间序列数据。以越来越多的互联汽车为例。根据我们收集的数据,科学团队可以在我们的车辆中构建技术。我们可以识别最能预测未来五秒内将发生车祸的迹象,并挽救乘客的生命,因为它可以识别他/她此刻何时失去注意力。我们的工作是确保用户能够更可靠、更高效地使用设备和数据。我们帮助人们和技术更容易、更快地做出关键决策,因此我们强调实时性。

我们经历了十多年的实战考验,支持成功的应用。我们有信心将我们获得的工程能力、我们赢得的业务优势以及我们获得的资源交付给我们的客户。我们希望通过开源和云服务来实现这一愿景。于是 Greptime 诞生了。

我们使用*nix系统中常用的搜索命令“grep”这个动词,希望赋能客户更深入地挖掘时间序列数据,发现隐藏的价值——“投资数据,时间收获”。

随着像 Snowflake 这样的云原生数据仓库的兴起,分离存储和计算被证明可以节省成本并提高性能和弹性。在将数据基础设施转移到云端时,我们认为围绕性能、可维护性和成本重新设计服务至关重要。

Greptime
提供多租户、开箱即用、完全托管的服务,每个用户都运行一个安全高效的数据生命周期:摄取、存储、分析、数据管理、可视化、异常检测、预测等。
GreptimeDB Cloud 服务主要由三个组件组成:

  • Frontend:无状态,负责网关协议和分布式写入和查询;
  • Datanode:工作节点,无状态,内置时序存储引擎和计算引擎;
  • 分布式WAL:多租户共享的Write-Ahead-Log服务,用于支持Datanode的容错和容灾。

数据最终存储在 S3 等具有成本效益的存储中。为了解决存储和计算分离带来的写吞吐量和查询延迟问题,我们还设计了一个分布式的buffer/cache系统,类似于OS中的Page cache。
我们提供这种混合架构以利用无共享(前端、数据节点)和共享磁盘(wal、缓存)架构的优势:
  • 将“冷”数据存储在 S3 中,将“热”数据存储在本地磁盘中。
  • 用户可以根据需要水平扩展计算节点。
  • 用户请求将被动态调度。如果发生错误,计算节点将自动移动到另一个。当数据库没有流量时,计算资源将被回收,用户只需为他们使用的东西付费。
  • 共享分布式WAL只需要少量的EBS就可以提供写容灾。数据刷入S3后,可以截断日志。

解耦存储和计算
我们的架构将存储和计算分离。核心组件Datanode具有三个功能:

  • 存储引擎:基于LSM树的时间序列数据表引擎,称为Mito引擎。
  • 查询引擎:支持SQL;它将 SQL 转换为逻辑/物理计划。通过矢量化计算和用户定义的函数,GreptimeDB 可以专门处理大量数据以进行许多复杂的计算。
  • Python 协处理器:为避免花费大量时间和精力传输和转换数据,我们提供了在数据库中执行 Python 脚本的能力。此外,用户可以从强大的 Python 社区中受益。

内置Rust
自 2018 年以来,我们一直在使用 Rust 编写我们的时间序列数据库。当涉及到数据库等基础设施时,高水平的稳定性和性能是重中之重。最好避免使用任何运行时/GC 语言,因为它们会导致不可避免的内存和 CPU 开销。Rust 的创建是为了确保类似于 C/C++ 的高性能,Rust 也强调内存安全。越来越多的公司,从初创公司到大公司,都在生产中使用 Rust。
作为一个白手起家的TSDB,已经稳定高效运行了四年,Rust是其中的关键一员。在多年的开发过程中,我们几乎没有遇到过内存安全相关的严重BUG,而且由于测试充分,其他严重BUG也比较少。
此外,充满活力的 Rust 社区推动了 Rust 包的增长,这使得开发人员更容易构建东​​西。而且我们都喜欢 Rust,所以选择 Rust 作为我们创建 Greptime 的主要语言是很自然的。