分布式日志采集组件loki

发布于:2024-05-19 ⋅ 阅读:(90) ⋅ 点赞:(0)

1 loki简介

Loki 是由 Grafana Labs 团队开发的一组日志收集组件,使用 Go 语言编写。Loki 的第一个稳定版本于 2019 年 11 月 19 日发布。 Loki 是一个水平可扩展、高可用性、多租户的日志聚合系统,它的构建理念受到了 Prometheus 的启发,是对有关日志的元数据进行索引。日志数据本身会被压缩并以块的形式存储在本地或者对象存储中。 Loki 可以商用,它的商用许可证是 Apache License 2.0。

Loki的主要特点是它不会对日志数据进行全文索引,而是仅索引日志的元数据(例如,日志来源的应用、容器、主机等)。这种设计使得Loki可以更高效地存储和查询大量的日志数据。

Loki的另一个关键特点是它与Grafana紧密集成。你可以在Grafana中查询和可视化Loki中的日志数据,这使得对日志和度量数据进行联合查询和监控变得更简单。

Loki的主要组件包括Promtail(用于收集和发送日志的代理)、Loki(用于存储和查询日志的服务)和Grafana(用于可视化和查询数据的面板)。

2 基础架构

image-20240507164025105

  1. Promtail:负责日志数据的采集、提取、匹配、过滤、打标签、推送到 Loki。

  2. Distributor:接收 Promtail 推送过来的日志数据,并把日志数据分发给Ingester。

  3. Ingester:负责接收数据并构建 chunk,存储日志索引及数据。

  4. Querier:负责数据读取,通过给定的时间范围和标签选择器,查看索引以确定哪些块匹配,并通过 greps 聚合各个 Ingester 中的数据,并将结果返回给 client。

  5. Grafana:Loki 的数据查询都是通过 Grafana,在 Grafana 中支持 loki 的数据源,通过配置 Loki 的接口地址即可。

在这里插入图片描述

3 loki存储层

img

Loki的存储层由其自身的存储组件完成,它需要存储两种不同类型的数据:索引和块。当使用加速搜索(实验性)时,会使用第三种数据类型:布隆块。

  1. 索引:索引包含日志流的元数据,例如标签(就像Prometheus的标签)。索引数据通常存储在键值存储系统中,例如Amazon DynamoDB,Google Bigtable,或者使用索引商店接口的任何兼容实现。

  2. :日志数据本身被压缩并存储在块中。这些块存储在对象存储系统中,例如Amazon S3,Google Cloud Storage,或者本地文件系统。

Loki是围绕仅索引日志的元数据(标签)构建的,这与其他日志系统有所不同。这种设计使得Loki在存储和查询大量日志数据时能够更加高效。同时,通过使用高度压缩的块和小型索引,可以简化存储结构并降低存储成本。

因此,Loki的存储层是一个独立的解决方案,但它依赖于其他存储系统(如S3,GCS或本地文件系统)来存储日志数据和索引。

默认部署的 Loki 日志组件采用以下存储方式:

  1. Loki 将日志数据压缩后存储在对象存储(如 S3 或 GCS)的块中,或者存储在本地文件系统上1

  2. Loki 使用紧凑的索引和压缩算法来存储日志数据,这大大减少了存储空间的需求,与 Elasticsearch 等需要大量硬盘空间和内存的方案相比,Loki 的存储成本更低3

  3. Loki 还使用 Write-Ahead Log (WAL) 来记录传入的数据,并将其存储在本地文件系统中,以确保在进程崩溃的情况下数据能够持久保存1

  4. Loki 不需要依赖 Elasticsearch 等复杂的存储引擎,而是采用了更轻量级的方式,这使得 Loki 更适合中小团队使用13

总之,Loki 采用了对象存储或本地文件系统作为其主要的日志数据存储方式,并使用紧凑的索引和压缩算法来降低存储成本,同时还使用 WAL 机制来保证数据的持久性。这种设计使 Loki 的资源需求更低,更适合中小规模的日志收集和分析场景

4 loki与高可用

Loki 可以通过以下方式实现高可用性:

  1. 部署多个 Loki 实例

  • 在多台服务器上部署 Loki 实例,通过负载均衡器对流量进行分配,以便在服务器之间平均分配请求123

  • 使用冗余方案(如 RAID)来保证数据的安全性1

  • 正确配置 Loki 的复制,以便在一台服务器故障时可以从另一台服务器恢复数据1

  1. 使用分布式存储

  • Loki 将日志数据压缩后存储在对象存储(如 S3 或 GCS)的块中,或者存储在本地文件系统上45

  • 这种分布式存储方式可以提高数据的可用性和容错性,即使单个存储节点出现故障,也不会影响整个系统的可用性45

  1. 使用 Write-Ahead Log (WAL) 机制

  • Loki 使用 WAL 来记录传入的数据,并将其存储在本地文件系统中,以确保在进程崩溃的情况下数据能够持久保存5

  • 这种机制可以保证数据的持久性,即使在系统故障的情况下,也可以通过重放 WAL 日志来恢复数据5

总之,Loki 通过部署多个实例、使用分布式存储以及采用 WAL 机制等方式来实现高可用性,确保在某些服务器故障时仍然可以继续运行,并保证数据的安全性和持久性。