在本指南中,我们将详细了解Grafana Loki架构及其组件。

在公司的分布式环境中,存储和管理来自各种系统资源的日志是一项具有挑战性的任务。为了简化这项任务,引入了一个称为日志聚合的概念,它从各种系统资源中收集、存储、管理日志。有各种各样的日志聚合工具,其中一个工具是 Grafana Loki,通过本文我们一起探索一下 Loki。

什么是 Grafana Loki?

Grafana Loki 是一个开源的日志收集系统,其功能是收集、存储和查询日志。Grafana Loki 压缩日志并将日志存储在块中,并将它们存储在文件系统或 AWS S3 等后端存储中。

块是一个压缩文件,其中包含基于日志卷的日志条目,因此当块大小达到其大小限制时,它会将日志存储在另一个块中。每当存储一个块时,它都会为每个块创建一个索引。索引不包含日志的内容,它只包含时间戳、块的标签和块的位置。

日志的默认保留期限为24小时,最短期限为1小时,最长可延长至30天。Loki 横向扩展并具有其查询语言 LogQL。

Grafana Loki 架构

下图显示了 Grafana Loki 的架构以及它如何收集日志的工作流程。

Grafana Loki 架构组件详解_ELK

  • 现在,让我们看看 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

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 可视化日志

译者注:感觉作者这个比较有失偏颇,各位读者兼听则明哈

总结

总的来说,Grafana Loki 是一个强大的开源工具,用于收集、存储、查询和可视化日志。

它具有可扩展性、日志压缩、多租户支持和自动日志轮换等功能,可实现有效的监控和故障排除。

我相信这个博客可以让您更好地了解 Grafana Loki 及其功能。


英文原文:https://devopscube.com/grafana-loki-architecture/中文译文:https://flashcat.cloud/blog/grafana-loki-architecture/译者:巴辉特

本博客出自 Flashcat 的小伙伴们,Flashcat 是一家专注在监控/可观测性领域的初创公司,其团队是开源项目 Open-Falcon、Nightingale 的创始团队。欢迎一起交流监控/可观测性相关实践经验。