1. Loki 架构概述:组件职责与数据链路
Loki 是 Grafana Labs 推出的日志聚合系统,其核心设计理念是“仅索引元数据,不全文索引日志内容”。这一设计使得 Loki 在存储成本与查询性能之间取得了极佳的平衡。理解 Loki 的架构组件及其协作链路,是后续进行存储优化与 Golden Signals 指标配置的基础。
1.1 核心组件与职责
Loki 采用微服务架构,各组件可独立部署与水平扩展。下表列出了主要组件及其核心职责:
| 组件 | 职责 | 关键特性 |
|---|---|---|
| Distributor | 接收来自 Promtail、Fluentd 等客户端的日志推送,验证数据合法性,并将日志流分发至对应的 Ingester。 | 无状态、可水平扩展;负责数据分片与副本分发。 |
| Ingester | 接收 Distributor 推送的日志,将日志数据在内存中构建为块(Chunk),并定期将块持久化到对象存储(如 S3、GCS)。 | 有状态组件;负责数据写入、内存索引维护与块刷新。 |
| Querier | 处理 LogQL 查询请求,从 Ingester(热数据)和后端存储(冷数据)中检索日志,并返回结果。 | 无状态、可水平扩展;支持查询缓存加速。 |
| Compactor | 对对象存储中的块进行合并、去重与索引优化,减少小文件数量,提升查询效率。 | 后台异步任务;负责存储层面的数据整理与生命周期管理。 |
架构提示: 在生产环境中,通常还会部署 Query Frontend(查询前端,负责分片与缓存)和 Ruler(规则引擎,负责告警与记录规则),它们属于可选但强烈推荐的组件。
1.2 数据写入完整链路
日志数据从客户端推送到最终持久化存储,经历以下关键步骤:
- 客户端推送: Promtail 或其他日志采集器将日志流(包含日志行与标签集)通过 HTTP/gRPC 推送到 Distributor。
- Distributor 验证与分发: Distributor 验证日志流的合法性(标签格式、时间戳范围等),然后根据一致性哈希算法将日志流分发到对应的 Ingester 副本。
- Ingester 接收与构建: Ingester 接收日志流,将其追加到内存中的流(Stream)结构中,并持续构建块(Chunk)。
- 块刷新与持久化: 当块达到预设大小或时间阈值时,Ingester 将块刷新到对象存储,并更新内存索引。
- Compactor 后台优化: Compactor 定期扫描对象存储中的块,执行合并、去重与索引压缩,优化存储布局。
写入链路关键指标:
loki_distributor_bytes_received_total:Distributor 接收的字节总数。loki_ingester_chunks_flushed_total:Ingester 刷新的块总数。loki_ingester_chunk_utilization:块压缩率,反映存储效率。
1.3 数据查询完整链路
用户通过 Grafana 或 LogCLI 发起 LogQL 查询时,数据流如下:
- 查询前端接收: Query Frontend 接收查询请求,进行语法解析、分片与缓存检查。若命中缓存,直接返回结果。
- Querier 并行检索: Query Frontend 将查询任务分发给多个 Querier。每个 Querier 同时查询 Ingester(热数据)和对象存储(冷数据)。
- Ingester 内存查询: Ingester 在内存中检索尚未刷新的热数据块,返回匹配结果。
- 存储层查询: Querier 从对象存储中读取已持久化的块,通过索引快速定位目标数据。
- 结果合并与返回: Querier 将来自多个数据源的结果进行合并、去重与排序,最终返回给 Query Frontend,再由其返回给客户端。
性能避坑: 查询未命中缓存且涉及大量标签扫描时,Querier 可能成为瓶颈。建议为 Querier 配置足够的 CPU 与内存,并启用
query_ingesters_within 参数限制热数据查询范围。
1.4 架构总览图
下图展示了 Loki 核心组件之间的数据写入与查询关系:
1.5 组件协作总结
下表从数据流角度总结了各组件的协作关系:
| 数据流方向 | 涉及组件 | 关键操作 |
|---|---|---|
| 写入 | 客户端 → Distributor → Ingester → 对象存储 | 验证、哈希分发、内存构建、块刷新 |
| 查询 | 客户端 → Query Frontend → Querier → Ingester + 对象存储 | 解析、分片、并行检索、结果合并 |
| 后台优化 | Compactor → 对象存储 | 块合并、去重、索引压缩 |