开启日志汇聚之Loki
Loki说明
-
将Loki的所有微服务组件打包部署到单一进程中。
-
适合小规模系统的日志存储场景(每天不超过100G),在必要时,可部署共享外部对象存储(minio)的多实例进行水平扩容。
-
支持高可的部署方式
- 多个实例需要配置共享的外部对象存储
- 需要设定合理的复制因子
-
Loki分为两个部分,一个是promtail用于采集日志、另一个是Loki服务端。
架构图
各组件说明
Promtail
- Promtail负责在节点上收集日志并push到Loki Server,它支持与Prometheus相同的服务发现机制,以及重新打标、格式转换和过滤功能
- Promtail是专为Loki设计的日志收集器,它的职责包括:发现目标、向日志信息附加标签,向Loki推送日志流
Loki
- Loki Server负责接收并存储日志信息,但它不会索引日志文本,而仅是完成标签索引,从而显著降低系统开销及接近实时的查询性能;
Grafana
- 一个用于监控和可视化观测的开源平台,支持非常丰富的数据源,在 Loki 技术栈中它专门用来展示来自 Prometheus 和 Loki 等数据源的时间序列数据,可进行查询、可视化、报警等操作,可以用于创建、探索和共享数据 Dashboard,鼓励数据驱动。
AlertManager
-
用户可编写告警规则并进行周期性评估,超出合理阈值或者阈值范围的日志信息,可由AlertManager通知给用户。
-
LogQL是Loki提供的日志查询语言,Grafana可对查询结果进行可视化,基于命令行的查询通常由LogCLI进行
-
Loki支持很多种客户端,包括Grafana Agent、Promtail,以及第三方的Docker Driver、Fluentd/Fluent-bit、Logstash等
Loki组件
Loki的系统组件大体可以分为两类
- Read path:处理读取日志样本请求的组件
- Write path:处理存储日志样本请求的组件
核心组件介绍 - Distributor(write path)
- 从Loki客户端(如Promtail)接收数据、检查数据,随后将其分成数据块(Chunks)并发往Ingester
- 无状态应用,可接受LB进行数据分发
- Ingester(write, read path)
- 负责将数据存入外部的存储系统(如S3)以长期存储数据,以及接受客户端的查询请求并响应相关的数据
- 为避免数据丢失,通常应该提供复制式多实例
- Querier(read path)
- 处理LogQL请求,并从Ingester或长期存储系统中加载数据
- Query Frontend(read path)
- 处理查询请求的前端组件
Loki 系统数据流(Data flow)
Read path
- ① Querier基于HTTP接收到查询请求
- ② 转发请求至Ingester,以检查缓存在内存中的日志数据
- ③ 若Ingester查询到了相关数据,则返回给Querier
- ④ 若Ingester未查询到相关数据,则Querier将会向存储系统发起请求
- ⑤ Querier基于HTTP协议响应查询请求
Write path
- ① Distributor基于HTTP协议接收到写请求,并将其附加到特定的stream
- ② Distributor将每个stream发往Ingester
- ③ Ingester创建一个新Chunk或附加至现有的Chunk上
- ④ Distributor将结果响应给客户端
Loki Architecture
-
Distributor收到的日志流基于标签进行consistent hashing计算后,分发至不同的Ingester,复制因子用于指定要存储的副本数以实现容错.
-
Loki中的日志存储由两部分组成:索引数据(index)和 日志数据(chunk)
-
Chunks 数据块
-
每个Chunk存储有特定时间窗口内的日志条目,这些日志条目会被压缩后再进行存储.
-
每个Chunk的所有日志条目会按照timestamp进行排序
-
Chunk中的内容包括压缩的日志条目(Compressed log entries)、时序信息(Time series information)和 块标识符(Chunk identifiers)
-
index
- Loki会对Chunks基于标签集和时间范围进行索引以加快检索操作。
- Loki仅索引日志流的元数据(标签集),它不会索引日志内容。
- 索引中主要存储标签集、日志流标识符(Stream identifiers)和时间范围(内部日志流的时间边界)
评论区