在本指南中,我们将详细了解 Grafana Loki 架构及其组件。
核心要点
- Grafana Loki 是面向日志收集、存储和查询的开源系统,常与 Grafana 一起用于日志可视化和排障。
- Loki 的核心思路是给日志打标签、压缩为 chunk,并用索引记录时间戳、标签和位置,而不是把完整日志内容放进索引。
- 一条日志从采集到查询,通常会经过 Promtail、Distributor、Ingester、存储、Querier、Query Frontend 和 Grafana。
- LogQL 是 Loki 的查询语言,可按标签和值过滤、聚合和分析日志。
- Loki 与 EFK Stack 的主要差异在于索引方式、资源使用、组件组合和可视化入口。
在公司的分布式环境中,存储和管理来自各种系统资源的日志是一项具有挑战性的任务。为了简化这项任务,引入了一个称为日志聚合的概念,它从各种系统资源中收集、存储、管理日志。有各种各样的日志聚合工具,其中一个工具是 Grafana Loki,通过本文我们一起探索一下 Loki。
什么是 Grafana Loki?
Grafana Loki 是一个开源的日志收集系统,其功能是收集、存储和查询日志。Grafana Loki 压缩日志并将日志存储在块中,并将它们存储在文件系统或 AWS S3 等后端存储中。
块是一个压缩文件,其中包含基于日志卷的日志条目,因此当块大小达到其大小限制时,它会将日志存储在另一个块中。每当存储一个块时,它都会为每个块创建一个索引。索引不包含日志的内容,它只包含时间戳、块的标签和块的位置。
日志的默认保留期限为24小时,最短期限为1小时,最长可延长至30天。Loki 横向扩展并具有其查询语言 LogQL。
Grafana Loki 架构
下图显示了 Grafana Loki 的架构以及它如何收集日志的工作流程。

- 现在,让我们看看 Grafana Loki Logging 是如何工作的。该图显示了 Grafana Loki 如何收集、存储、查询和可视化日志。
- 在 Grafana Loki 中,agent 负责从文件、容器、pod、应用程序和系统日志中收集日志。
- Loki 使用日志收集代理(agent)来收集日志,如果您在 Kubernetes 中使用 Loki,代理将作为守护程序集(Daemonset)部署,因为我们需要来自集群每个可用节点的日志。
- Promtail 是该架构中使用的代理(agent),Promtail 收集日志,然后过滤和压缩日志以节省存储空间。
- 压缩日志后,它会为日志提供一个标签并将其发送给 Loki。
- 从 Promtail 接收到日志之后,Loki 将每个日志存储为一个块,该块将日志消息收集在一个文件中,以节省存储空间和有效检索。
- 它还为块提供标签和时间戳。每当存储块时,它都会为每个块创建一个索引,其中包含块的时间戳、标签和位置。
- Loki 使用 LogQL 查询语言查询日志,LogQL 允许我们根据我们选择的标签和值过滤、聚合和分析日志。
- 通过将 Loki 添加到 Grafana,您可以可视化查询的日志或使用 LogCLI 从 CLI 查询日志。
Grafana Loki 组件
Grafana 包含很多组件,promtail, distributor, ingester, querier, ruler, query frontend, Grafana,让我们看一下这些组件。
| 组件 | 主要职责 | 关注点 |
|---|---|---|
| Promtail | 从文件、容器、Pod、系统日志中采集日志并打标签 | 部署位置、标签设计、采集范围 |
| Distributor | 接收并验证日志,将日志分发给 Ingester | 标签有效性、时间戳、日志长度 |
| Ingester | 写入、索引并定期传输日志到持久化存储 | 写入可靠性、保留策略、持久化 |
| Ruler | 基于日志数据记录指标并触发告警 | 日志转指标、告警通知 |
| Querier | 使用 LogQL 查询日志 | 查询过滤、聚合、缓存 |
| Query Frontend | 处理用户查询并拆分大查询 | 查询并发、性能、内存压力 |
| Grafana | 可视化和分析 Loki 查询结果 | Dashboard、Explore、LogQL |
| Log Storage | 保存 chunk 和 index | 对象存储、文件系统、保留期 |
Promtail
Promtail 是充当 Loki 的日志代理(agent)的重要组件。它的功能是从系统中收集每个日志,标记它,然后将其发送给 Loki。Loki 从本地日志文件和系统日志中收集日志。
您必须在要收集日志的每个系统中安装 Promtail,同样,如果您在 Kubernetes 上使用 Loki,则必须在每个节点中部署 Promtail 作为守护进程集(Daemonset)。
Distributor
Distributor 是一个无状态组件,负责处理和验证从日志代理(如 Promtail)接收的日志,并将日志分发到 ingester。
当 Distributor 收到日志时,它首先验证日志是否符合配置,例如有效标签、不是较旧的时间戳以及日志是否太长。
验证完成后,Distributor 会根据一致性哈希将日志分发到每个 ingester,以确保平均分配给每个可用的 ingester。
Ingester
Ingester 负责在其文件系统上存储和索引从 Distributor 收到的日志,并定期将日志传输到持久性存储(长期存储),如 S3。
Ingester 根据配置设置保留策略(自动日志删除时间)。
它使用时间序列数据库以一定的结构格式存储日志,这简化了高效查询和日志过期的过程。
Ruler
Ruler 是 Loki 的监控和告警组件,其作用是记录指标并根据收到的日志数据触发告警。它不是直接衡量指标,而是将日志数据转换为指标。
Ruler 监控日志并在检测到任何问题时发出通知,并通过电子邮件或 Slack 发送通知。
Querier
顾名思义,Querier 负责使用 LogQL 查询语言从存储和 ingester 中查询日志。它根据用户查询(如时间戳、标签等)过滤和聚合日志。
查询器缓存之前的查询,以防止一次又一次地查询相同的日志,它只查询一次具有相同时间戳、标签和日志消息的日志。
Query Frontend
Query Frontend 是一个与用户交互的无状态组件,它负责处理查询请求、执行查询以及通过 Grafana 仪表板可视化日志。
Query Frontend 将大型查询拆分为多个较小的查询,并同时运行所有查询,这可以防止大型查询在单个查询中导致内存问题,并有助于加快执行速度。
Grafana
Grafana 是一个开源工具,可帮助查询、可视化和监控日志。我们可以将 Loki 与 Grafana 集成,并在仪表板、图表等方式可视化日志数据。
Grafana 使用查询语言 LogQL 与 Grafana 集成,我们也可以在 Grafana 中编写 LogQL 查询来过滤和查询日志。
Log Storage
Loki 存储日志数据,提高查询和接收日志的效率。它将日志数据压缩成块,根据时间进行组织,并为其提供标签和时间戳。然后,它以键值对格式为每个块创建一个索引,其中块时间戳和标签等。
例如,将块的索引视为一本书的索引。
Chunks 和 Index 可以存储在各种后端对象存储或文件系统中。
一旦存储了块,它就会为数据创建一个保留期,并根据保留期自动删除。
如果您使用文件系统作为存储,则块和索引的默认存储路径是 /var/lib/loki/chunks 和 /var/lib/loki/index。
如何在 Loki 中存储块和索引的示例
例如,假设您正在使用一个 Web 服务器,该服务器生成一个包含时间戳、HTTP 请求方法、URL 和响应代码的日志。
每组日志条目将被存储为多个块,如下面的 JSON 格式:
{
"timestamp": "2023-11-20T1:02:33.456Z",
"labels": {
"method": "GET",
"url": "/products",
"status": 200
},
"entry": "Request received for /products, responded with 200 OK"
}
块文件名将采用此格式:
2023-11-20T1-00-00.000Z-2023-11-20T1-15-00.000Z.chunk
顾名思义,该块包含 2023 年 11 月 20 日凌晨 1 点至凌晨 1:15 的日志。
chunk 创建之后,会为每个 chunk 创建一个 index,index 会存储 chunk 的时间戳、标签和位置。如下所示:
{
"2023-11-20T1:02:33.456Z": {
"chunk": "2023-11-20T1-00-00.000Z-2023-11-20T1-15-00.000Z.chunk",
"labels": {
"method": "GET",
"url": "/products",
"status": 200
}
}
}
如上面示例索引文件所示,它只存储块文件名、时间戳和标签,不会存储日志消息。
Grafana Loki 的特点
可扩展性
Loki 可以根据日志的数量进行扩展,如果日志量比较大,水平扩展 ingester 模块即可,因此您不必担心过多的日志流量会减慢该过程。
它将日志分布在多个摄取器(ingester)之间,以防止在节点故障期间由于流量过大而丢失数据,并且还将日志重定向到健康的摄取器节点,以防止停机和数据丢失。
效率
由于 Loki 将日志条目压缩并存储为块,因此即使对于大数据,它也增加了存储空间并减少了检索日志所花费的时间。在索引的帮助下,Loki 可以根据时间戳和标签轻松定位查询到的日志。
多租户
Loki 可以同时收集和分析来自各种来源(如 pod、容器、应用程序等)的日志,因此我们不必为不同的资源配置单独的日志代理。
尽管它从各种来源收集日志,但它会根据来源单独存储日志,例如容器和应用程序的单独存储文件。
日志轮转
Loki 在存储块时为块分配了保留策略,它会根据保留期自动删除旧日志,这有助于节省存储空间。
如果您不想删除旧日志,也可以将日志存储在长期对象存储中,例如 AWS S3 和其他对象存储。
Grafana Loki 和 EFK Stack 之间的区别
现在,让我们看看是什么让 Grafana Loki 与 EFK Stack 不同。Grafana Loki 和 EFK Stack 之间的区别如下:
| Grafana Loki | EFK Stack |
|---|---|
| Loki 收集日志、存储日志,使用 Grafana 可视化日志 | EFK Stack 使用 Elasticsearch 来收集和存储日志,使用 Logstash 来解析和处理日志,使用 Kibana 来可视化日志 |
| Loki 压缩日志并将它们存储为块 | EFK Stack 将每个日志条目存储在 Elasticsearch 的 JSON 文件中 |
| Loki 以其效率和可扩展性而闻名 | EKS以其适应各种环境的能力而闻名 |
| 水平缩放 | 垂直缩放 |
| Loki 使用分布式架构 | EFK Stack 使用客户端-服务器架构 |
| 资源使用率低 | 资源使用率高 |
| 使用 Grafana 可视化日志 | 使用 Kibana 可视化日志 |
译者注:感觉作者这个比较有失偏颇,各位读者兼听则明哈
什么时候适合关注 Loki
如果你的团队已经使用 Grafana 做可视化,并且希望用较轻量的方式统一查看容器、应用和系统日志,Loki 是值得评估的日志方案。它的检索习惯更接近“先用标签定位日志流,再在日志内容中分析问题”,因此标签设计会直接影响查询体验。
如果你的场景强依赖全文索引、复杂文本检索或已有成熟 Elasticsearch 体系,则需要结合现有日志量、查询方式、存储成本和团队经验一起评估,而不是只看单个组件的优缺点。
FAQ
Loki 的索引里是否保存完整日志内容?
不会。按本文示例,索引主要保存 chunk 文件名、时间戳、标签和位置,日志消息保存在 chunk 中。
Promtail 在 Kubernetes 中为什么通常以 DaemonSet 方式部署?
因为需要从集群每个节点采集 Pod、容器、应用和系统日志,以 DaemonSet 部署可以确保每个节点都有日志采集代理。
Loki 查询日志使用什么语言?
Loki 使用 LogQL 查询语言。用户可以根据标签和值过滤日志,也可以做聚合和分析。
总结
总的来说,Grafana Loki 是一个强大的开源工具,用于收集、存储、查询和可视化日志。
它具有可扩展性、日志压缩、多租户支持和自动日志轮换等功能,可实现有效的监控和故障排除。
我相信这个博客可以让您更好地了解 Grafana Loki 及其功能。
英文原文:https://devopscube.com/grafana-loki-architecture/ 中文译文:https://flashcat.cloud/blog/grafana-loki-architecture/ 译者:巴辉特
本博客出自快猫星云的小伙伴们,快猫星云是一家专注在监控/可观测性领域的初创公司,其团队是开源项目 Open-Falcon、Nightingale 的创始团队。如果您想要采购监控/可观测性相关的产品方案,欢迎 联系我们做产品技术交流。
