Loki 是什么

Loki 是 Grafana Lab开发的一套日志系统,使用Go语言实现。根据官方的介绍, Loki,高可用性,多租户的日志聚合系统,受到Prometheus的启发。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。如果用一句话介绍的话,就是 Like Prometheus, but for logs

Loki 能做什么

  • 日志采集。loki-stack中提供promtail,专为loki定制的日志采集组件
  • 日志压缩存储
  • 使用和prometheus相同的标签。根据日志元数据和标签对日志进行分组和索引。
  • 使用Grafana展示Loki中的日志,也可以使用API和CLI来查询日志。

Loki 和 ELK 对比

  • 轻量。 loki 使用go实现,并且除存储(也是可选的)外不依赖其他的中间件
  • 存储成本低。 由于loki只对元数据和标签进行索引,对日志文本进行压缩存储,存储成本是远低于ES
  • 检索能力低于ES。 loki 不会对文本日志进行分词和倒排索引,所以只能使用标签去匹配查询日志块,然后可以对搜索的日志块在内存进行grep
  • 日志分析能力。loki 可以提供兼容promethues的范围向量查询,如对查询的日志进行计数,kibana 则可以对任意文本进行查询分析。

Loki 架构

Loki 初体验-LMLPHP
Loki 初体验-LMLPHP

Loki 三个核心的组件

  • Distributor 是日志接收器,负责接收promtail的日志并转发到Ingester,在Distributor还会对日志进行校验,并且使用一致性Hash来保证chuck在Ingester上面的一致性。
  • Ingester接受日志流并构建数据块,其操作通常是压缩和追加日志。每个Ingester 的生命周期有PENDINGJOININGACTIVELEAVING 和 UNHEALTHY 五种状态。处于JOININGACTIVE状态的Ingester可以接受写请求,处于ACTIVELEAVING状态时可以接受读请求。Ingester 将收到的日志流在内存中打包成 chunks ,并定期同步到存储后端。由于存储的数据类型不同,Loki 的数据块和索引可以使用不同的存储。
  • Querier 用来查询日志,可以直接从 Ingester 和后端存储中查询数据。当客户端给定时间区间和标签选择器之后,Querier 就会查找索引来确定所有匹配 chunk ,然后对选中的日志进行 grep并返回查询结果。查询时,Querier先访问所有Ingester用于获取其内存数据,只有当内存中没有符合条件的数据时,才会向存储后端发起同样的查询请求。对于每个查询,单个 Querier 会 grep 所有相关的日志。目前 Cortex 中已经实现了并行查询,该功能可以扩展到 Loki,通过分布式的 grep 加速查询。此外,由于副本因子的存在,Querier可能会接收到重复的数据,所以其内置了去重的功能,对拥有同样时间戳、标签组和消息内容的日志进行去重处理。

Loki 是否适合我们的场景

  1. 个人认为Loki是一个Pod日志索引而不是日志分析系统,更多的场景应该是面向kubernetes的运维团队,而不是业务团队。
  2. Loki 和 我们当前提供容器日志场景比较相似,但我们今天没有提供把日志分块压缩到OSS等廉价存储的能力,对于日志备份来说是我们缺失的。同时我们也没有提供分布式查询和grep日志流的能力。
  3. 当前Loki架构中没有MQ等日志缓冲组件(loki使用的是hash环和多副本来保证日志一致性),对于大规模生产使用还需要进行更多的测试。

Loki 功能截图

Loki 日志检索
Loki 初体验-LMLPHP

Loki 日志Grep
Loki 初体验-LMLPHP

参考:
https://blog.csdn.net/linkthaha/article/details/100575651
https://github.com/grafana/loki
https://grafana.com/docs/loki/latest/

写在最后

我的个人公众号”竹韵悠扬“开通也有一段时间了,因为自己的”懒惰“一直没有写过文章,今年开始决定把我在技术道路中的一些感悟和好玩的技术分享给大家,如果你对上面的文字感兴趣,那就订阅一下吧 ~

Loki 初体验-LMLPHP

12-28 11:31