InfluxDB 3 存储引擎架构
InfluxDB 3 存储引擎是一个优化用于时间序列数据的实时列式数据库,基于 Rust 构建于 Apache Arrow 和 DataFusion 之上。它支持无限标签基数(独特标签值的数量)、实时查询,并且经过优化以降低存储成本。
存储引擎图
存储引擎组件
路由器
路由器(也称为摄取路由器)解析传入的行协议,然后将其路由到 摄取器。为了确保写入持久性,路由器将数据复制到两个或更多可用的摄取器。
路由器扩展策略
路由器可以进行垂直和水平扩展。水平扩展增加写入吞吐量,并且通常是路由器最有效的扩展策略。垂直扩展(特别是增加CPU)提高了路由器解析传入线路协议的能力,降低延迟。
引入器
Ingester处理在写入请求中提交的行协议,并将时间序列数据持久化到对象存储中。 在此过程中,Ingester执行以下操作:
- 查询目录以确定数据应该被持久化的位置,并确保行协议的模式与持久化数据的模式兼容。
- 接受或 拒绝 写入请求中的点并生成一个 响应。
- 处理行协议并将时间序列数据以 对象存储的Apache Parquet格式持久化。每个Parquet文件 代表一个分区——数据的逻辑分组。
- 使 yet-to-be-persisted 数据可用于 Queriers,以确保查询结果中包含最新的数据。
- 维护一个短期写前日志 (WAL)以防止在服务中断的情况下数据丢失。
数据汇入器扩展策略
Ingester可以进行垂直和水平扩展。垂直扩展增加写入吞吐量,通常是Ingester最有效的扩展策略。
查询器
查询器处理查询请求并返回请求的查询结果。 它通过 Apache Arrow DataFusion支持 SQL 和 InfluxQL。
查询生命周期
在查询时,查询者:
接收查询请求并构建查询计划。
查询Ingesters以:
- 确保查询计划假设的架构与写入数据的架构匹配
- 在查询结果中包含最近写入的,尚未持久化数据
读取包含查询数据的分区Parquet文件,并扫描每一行以筛选与查询计划中的谓词匹配的数据。
执行查询计划中指定的任何附加操作(例如:去重、合并和排序)。
将查询结果返回给客户端。
查询器扩展策略
查询器可以同时 垂直 和 水平 扩展。 水平扩展增加查询吞吐量,以便处理更多的并发查询。 垂直扩展提高了查询器处理计算密集型查询的能力。
目录
目录是一个与PostgreSQL兼容的关系数据库,存储与您的时间序列数据相关的元数据,包括模式信息和对象存储中分区的物理位置。它履行以下角色:
目录扩展策略
用于目录的扩展策略取决于运行目录的PostgreSQL兼容数据库。所有支持 垂直扩展。 大多数支持 水平扩展 以实现冗余和故障切换。
对象存储
对象存储包含以 Apache Parquet 格式的时间序列数据。 每个 Parquet 文件代表一个分区。 默认情况下,InfluxDB 按天对表进行分区,但您可以 自定义分区策略。 每个 Parquet 文件中的数据是排序的、编码的和压缩的。
对象存储扩展策略
对象存储可用的扩展策略取决于用于运行对象存储的底层对象存储服务。大多数支持横向扩展以实现冗余、故障转移和增加容量。
压实机
压缩器处理并压缩对象存储中的分区,以不断优化存储。然后,它更新目录,以显示压缩数据的位置。
压实机缩放策略
压缩器可以进行纵向vertically和horizontally扩展。由于压缩是一个计算密集型的过程,纵向扩展(尤其是增加可用的CPU)是压缩器最有效的扩展策略。横向扩展尽管可以提高压缩吞吐量,但效率不如纵向扩展。
垃圾收集器
垃圾回收器运行后台任务,驱逐过期或已删除的数据,移除过时的压缩文件,并在目录和对象存储中回收空间。
垃圾收集器扩展策略
垃圾收集器并不适合分布式负载,应该不进行水平扩展。垃圾收集器不执行CPU或内存密集型的工作,因此垂直扩展只有在您观察到非常高的CPU使用率或容器经常耗尽内存时才能考虑。