菜单
开源

Grafana Mimir Ingester

Ingester 是一个有状态组件,它在写入路径上将传入的时间序列写入长期存储,并在读取路径上返回时间序列样本以供查询。

来自 Distributor 的传入时间序列数据临时存储在 Ingester 的内存中,或者在写入长期存储之前卸载到磁盘。最终,所有时间序列都会被写入磁盘并周期性地(默认每两小时)上传到长期存储。因此,Querier 在读取路径上执行查询时,可能需要从 Ingester 和长期存储中获取样本。

调用 Ingester 的任何 Grafana Mimir 组件都会首先查找注册在 Hash Ring 中的 Ingester,以确定哪些 Ingester 是可用的。每个 Ingester 可以处于以下状态之一:

  • PENDING
    Ingester 刚刚启动。在此状态下,Ingester 不接收写入或读取请求。
  • JOINING
    Ingester 启动并加入 Ring。在此状态下,Ingester 不接收写入或读取请求。Ingester 从磁盘加载 Token(如果配置了 -ingester.ring.tokens-file-path)或生成一组新的随机 Token。最后,Ingester 可选地观察 Ring 中的 Token 冲突,并在解决冲突后进入 ACTIVE 状态。
  • ACTIVE
    Ingester 已启动并正在运行。在此状态下,Ingester 可以接收写入和读取请求。
  • LEAVING
    Ingester 正在关闭并离开 Ring。在此状态下,Ingester 不接收写入请求,但仍可接收读取请求。
  • UNHEALTHY
    Ingester 未能向 Hash Ring 发送心跳。在此状态下,Distributor 会绕过该 Ingester,这意味着该 Ingester 不接收写入或读取请求。

要配置 Ingester 的 Hash Ring,请参阅配置 Hash Ring

Ingester 写入去放大

Ingester 在内存中存储最近接收到的样本,以执行写入去放大。如果 Ingester 立即将接收到的样本写入长期存储,系统会由于长期存储的高压力而难以扩展。因此,Ingester 在内存中批量处理和压缩样本,并定期将其上传到长期存储。

写入去放大是降低 Mimir 总拥有成本 (TCO) 的关键因素。

Ingester 故障与数据丢失

如果 Ingester 进程崩溃或突然退出,尚未上传到长期存储的任何内存中的时间序列数据可能会丢失。有以下方法可以缓解此故障模式:

  • 复制
  • 预写日志 (WAL)
  • 后写日志 (WBL),仅在启用无序摄入时使用。

复制与可用性

如果大多数 Ingester 接收到数据,则对 Mimir 集群的写入是成功的。默认复制因子为 3,这意味着写入 Ingester 的 3 次写入中必须有 2 次成功。如果 Mimir 集群丢失了少部分 Ingester,丢失的 Ingester 持有的内存中时间序列样本至少可在另一个 Ingester 中获得,这意味着不会丢失时间序列样本。如果大多数 Ingester 发生故障,并且该故障影响了持有特定时间序列所有副本的 Ingester,则时间序列可能会丢失。

注意

复制仅在写入时发生。如果在将数据正在写入其他 Ingester 的期间,某个 Ingester 不可用,则该 Ingester 将永远无法恢复这些丢失的样本。

预写日志

预写日志 (WAL) 将所有传入的时间序列写入持久磁盘,直到这些时间序列上传到长期存储。如果 Ingester 发生故障,随后的进程重启会重放 WAL 并恢复内存中的时间序列样本。

与单独的复制不同,WAL 确保在多个 Ingester 故障的情况下,内存中的时间序列数据不会丢失。每个 Ingester 都能在随后的重启后从 WAL 恢复数据。

仍然建议使用复制,以便优雅地处理单个 Ingester 故障。

后写日志

后写日志 (WBL) 与 WAL 类似,但它只将传入的无序样本写入持久磁盘,直到这些时间序列上传到长期存储。

之所以使用不同的日志,是因为直到 Mimir 尝试追加样本时,才知道样本是否无序。首先 Mimir 需要尝试追加,TSDB 会检测到样本是无序的,如果启用了无序摄入则无论如何都会追加,然后将其写入日志。

如果 Ingester 发生故障,其特性与 WAL 相同。

区域感知复制

区域感知复制确保给定时间序列的 Ingester 副本分布在不同的区域。区域可以代表逻辑或物理故障域,例如不同的数据中心。将副本分布在多个区域可以防止在区域范围中断时发生数据丢失和服务中断。

要设置多区域复制,请参阅配置区域感知复制

Shuffle Sharding

Shuffle Sharding 可用于减少多个租户之间相互影响的程度。

有关 Shuffle Sharding 的更多信息,请参阅配置 Shuffle Sharding

无序样本摄入

默认情况下,无序样本会被丢弃。如果向 Mimir 写入样本的系统产生无序样本,您可以启用此类样本的摄入。

有关无序样本摄入的更多信息,请参阅配置无序样本摄入

只读模式

您可以通过调用 Prepare Instance Ring Downscale API 端点将 Ingester 置于“只读”模式。处于只读模式的 Ingester 不接收写入请求,但仍可接收读取请求。处于只读模式的 Ingester 不参与写入操作的 Shuffle Sharding。

只读模式在缩容场景中非常有用,并且为后续关闭 Ingester 做好了准备。

Ingester 的 Ring 状态(如 JOINING、ACTIVE 或 LEAVING)与只读模式是分开的。同时处于 ACTIVE 和只读模式的 Ingester 不接收写入请求。只读模式也存储在 Hash Ring 中。