数据库|日志系统新贵Loki,确实比笨重的ELK轻( 二 )


本文插图

读写 日志数据的写主要依托的是Distributor和Ingester两个组件,整体的流程如下:
数据库|日志系统新贵Loki,确实比笨重的ELK轻
本文插图

Distributor 一旦promtail收集日志并将其发送给loki , Distributor就是第一个接收日志的组件 。 由于日志的写入量可能很大 , 所以不能在它们传入时将它们写入数据库 。 这会毁掉数据库 。 我们需要批处理和压缩数据 。
Loki通过构建压缩数据块来实现这一点 , 方法是在日志进入时对其进行gzip操作 , 组件ingester是一个有状态的组件 , 负责构建和刷新chunck , 当chunk达到一定的数量或者时间后 , 刷新到存储中去 。 每个流的日志对应一个ingester,当日志到达Distributor后 , 根据元数据和hash算法计算出应该到哪个ingester上面 。
数据库|日志系统新贵Loki,确实比笨重的ELK轻
本文插图

此外 , 为了冗余和弹性 , 我们将其复制n(默认情况下为3)次 。
Ingester ingester接收到日志并开始构建chunk:
数据库|日志系统新贵Loki,确实比笨重的ELK轻
本文插图

基本上就是将日志进行压缩并附加到chunk上面 。 一旦chunk“填满”(数据达到一定数量或者过了一定期限) , ingester将其刷新到数据库 。 我们对块和索引使用单独的数据库 , 因为它们存储的数据类型不同 。
数据库|日志系统新贵Loki,确实比笨重的ELK轻
本文插图

刷新一个chunk之后 , ingester然后创建一个新的空chunk并将新条目添加到该chunk中 。
Querier 读取就非常简单了 , 由Querier负责给定一个时间范围和标签选择器 , Querier查看索引以确定哪些块匹配 , 并通过greps将结果显示出来 。 它还从Ingester获取尚未刷新的最新数据 。
对于每个查询 , 一个查询器将为您显示所有相关日志 。 实现了查询并行化 , 提供分布式grep , 使即使是大型查询也是足够的 。
数据库|日志系统新贵Loki,确实比笨重的ELK轻
本文插图

可扩展性 Loki的索引存储可以是cassandra/bigtable/dynamodb , 而chuncks可以是各种对象存储 , Querier和Distributor都是无状态的组件 。 对于ingester他虽然是有状态的但是 , 当新的节点加入或者减少 , 整节点间的chunk会重新分配 , 已适应新的散列环 。 而Loki底层存储的实现Cortex已经 在实际的生产中投入使用多年了 。 有了这句话 , 我可以放心的在环境中实验一把了 。
数据库|日志系统新贵Loki,确实比笨重的ELK轻
本文插图

  • 基于 Apache Flink 的实时监控告警系统
  • 关于数据中台的深度思考与总结(干干货)
  • 日志收集Agent , 阴暗潮湿的地底世界
  • 2020 继续踏踏实实的做好自己

数据库|日志系统新贵Loki,确实比笨重的ELK轻
本文插图

数据库|日志系统新贵Loki,确实比笨重的ELK轻
本文插图

你点的每个赞 , 我都当成了喜欢


推荐阅读