目录
一、简介
Loki 是一个用于日志聚合和查询的系统,广泛用于 Kubernetes 和微服务架构中。Loki 的微服务模式将其核心功能拆分为多个独立的组件,每个组件专注于特定的任务。以下是 Loki 微服务模式下主要组件的功能和作用介绍:
二、架构图
三、组件介绍
Distributor(分发器)
功能:
接收日志数据(通常通过
push
协议或Promtail
)。将日志数据分发到 Ingester 组件进行存储和处理。
通过 hash-ring 算法,根据日志流的标签(labels)计算分区,并将数据路由到正确的 Ingester。
作用:
作为日志数据的入口,负责任务分配和路由。
提供高可用性和水平扩展能力,允许多个 Distributor 节点同时运行。
Ingester(存储器)
功能:
接收 Distributor 分发的日志数据。
将日志数据暂时存储在内存中,并以分片的形式写入持久化存储(如对象存储)。
处理读取请求并提供实时日志查询能力。
作用:
实现日志的实时存储和处理。
确保高吞吐量和低延迟的写入性能。
负责将日志数据以批次的形式写入持久存储。
Querier(查询器)
功能:
处理来自用户的查询请求(通过 Loki API 或 Grafana)。
从 Ingester 和持久化存储中读取日志数据。
对日志数据进行过滤、聚合和返回。
作用:
提供强大的查询功能(使用 LogQL)。
同时支持实时日志查询(从 Ingester 获取)和历史日志查询(从对象存储获取)。
Query Frontend(查询前端)
功能:
接收用户的查询请求,并将其分解为多个小查询任务。
对查询任务进行缓存以提高性能。
将查询任务分发到 Querier。
作用:
优化查询性能,尤其是复杂和大范围查询。
提供请求分片、聚合以及缓存能力,减少 Querier 的工作负载。
Index Gateway(索引网关)
功能:
管理和写入日志的索引数据到后端存储(如对象存储、Cassandra)。
提供索引的读取能力,帮助快速定位日志。
作用:
实现高效的日志索引存储和管理。
减少日志查询的延迟,通过索引快速找到日志所在的存储位置。
Compactor(压缩器)
功能:
定期从对象存储中读取分片的日志数据。
对分片日志数据进行合并、去重和优化。
写入优化后的数据回对象存储。
作用:
优化日志数据的存储格式,降低存储成本。
提升查询效率,通过压缩和去重减少查询的数据量。
Table Manager(表管理器)
功能:
为存储后端(如 DynamoDB、Bigtable)管理表的生命周期。
创建、删除和更新索引表。
作用:
提供后端存储的表管理能力。
确保索引表结构与 Loki 的存储需求匹配。
Ruler(规则引擎)
功能:
基于日志数据定义和执行规则。
触发警报规则或生成预聚合的日志查询结果。
作用:
提供告警功能:允许基于日志数据的实时或周期性告警。
支持基于 LogQL 的规则评估。
四、各组件协作流程
日志接入:
Distributor 接收日志数据,并通过标签分片分发给对应的 Ingester。
数据存储:
Ingester 将日志数据暂存内存,并定期将其写入对象存储。
Index Gateway 管理日志索引,方便快速查询。
数据查询:
用户通过 Loki 或 Grafana 发起查询请求。
Query Frontend 接收请求并优化分片后发送给 Querier。
Querier 从 Ingester(实时数据)或对象存储(历史数据)中读取日志并返回结果。
优化与维护:
Compactor 对存储中的日志数据进行合并和优化。
Ruler 定期评估规则并触发告警。
五、优势
模块化:每个组件独立运行,可单独扩展。
高可用:各组件支持水平扩展,提供更高的吞吐量和容错能力。
灵活性:可以根据需求调整组件的资源和部署策略。