LokiGrafana 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的一致性,他们共同在一个哈希环上,哈希环的信息可以存放到etcdConsul或者内存中。

Ingester

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

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 日志系统