Loki是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。

  • 不对日志进行全文索引。Loki中存储的是压缩后的非结构化日志,并且只对元数据建立索引,因此Loki 具有操作简单、低成本的优势。
  • 使用与 Prometheus 相同的标签。Loki通过标签对日志进行索引和分组,这使得日志的扩展和操作效率更高。
  • 特别适合储存 Kubernetes Pod 日志。诸如 Pod 标签之类的元数据会被自动删除和编入索引。
  • Grafana 原生支持。

Loki 日志系统由以下3个部分组成:

  • loki是主服务器,负责存储日志和处理查询。
  • promtail是专为loki定制的代理,负责收集日志并将其发送给 loki 。
  • Grafana用于 UI展示。

    架构

    image.png

    Distributor

    客户端连接的组件,用于收集日志
    image.png
    在 promtail 收集并将日志发送给Loki 之后, Distributor 就是第一个接收它们的组件,每秒可以接收数百万次写入。Distributor会对接收到的日志流进行正确性校验,并将验证后的chunk日志块分批并行发送到Ingester。

    Loki使用一致性哈希来保证数据流和Ingester的一致性,他们共同在一个哈希环上,哈希环的信息可以存放到etcd、Consul或者内存中。

Ingester

Ingester 接收来自Distributor的日志流,并将日志压缩后存放到所连接的存储后端。
image.png
Ingester接受日志流并构建数据块,其操作通常是压缩和追加日志。每个Ingester 的生命周期有PENDING, JOINING, ACTIVE, LEAVING 和 UNHEALTHY 五种状态。处于JOINING和ACTIVE状态的Ingester可以接受写请求,处于ACTIVE和LEAVING状态时可以接受读请求。

Querier

Querier 用来查询日志,可以直接从 Ingester 和后端存储中查询数据。当客户端给定时间区间和标签选择器之后,Querier 就会查找索引来确定所有匹配 chunk ,然后对选中的日志进行 grep并返回查询结果。查询时,Querier先访问所有Ingester用于获取其内存数据,只有当内存中没有符合条件的数据时,才会向存储后端发起同样的查询请求。

Query Frontend

Query frontend 是可选组件,其提供了Querier的API并可用于读加速。当系统中有该组件时,所有的读请求都会经由Query frontend而非Querier处理。

读写

读

  1. Querier 收到HTTP请求
  2. Querier 将请求发送到Ingester用以获取内存数据
  3. Ingester 收到请求后返回符合条件的数据
  4. 如果没有Ingester返回数据,Querier从后端存储加载数据并执行拆线呢
  5. Querier遍历所有数据并执行去重处理,通过HTTP连接返回最终结果

    写

    日志数据的写主要依托的时Distributor和Ingester 两个组件

  6. Distributor 收到http请求,用于存储流数据

  7. 通过hash环对数据流进行hash
  8. Distributor将数据流发送到对应的ingester及其副本上
  9. Ingester新建Chunk或将数据追加到已有的Chunk上
  10. Distributor通过HTTP连接发送响应信息

    相关链接

  11. Loki 日志系统