日志系统之 EFK vs. PLG Stack

Posted 小飞写创

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日志系统之 EFK vs. PLG Stack相关的知识,希望对你有一定的参考价值。

随着分布式系统日益复杂,云原生解决方案日益增多,监控和系统可观测性成为了解系统行为方式的一个非常重要的方面。我们需要一个可以从所有服务中收集数据的工具,一个可为我们提供系统性能、错误事件、日志和系统可用性的视图工具,如下图。在本文中,我们将讲讲两个主流的技术栈,EFK和PLG的架构和区别。

日志系统之 EFK vs. PLG Stack

讲讲EFK

你可能听过ELK,EFK是用性能更优的 Fluentd 代替了 Logstash。Elasticsearch 是一个对象存储、搜索和分析引擎。Fluentd 是一个开源的数据收集器。Kibana 是用图形和图表对 Elasticsearch 数据进行可视化展示的工具。

EFK工作流程是这样的:


日志系统之 EFK vs. PLG Stack


再讲讲PLG(Promtail, Loki and Grafana)
可能你在搜索引擎上搜不到这个首字母缩写,因为它大部分时间被称为 Grafana Loki(下文称为 Loki),也就是说 PLG Stack 结合起来就是 Grafana Loki。Promtail 是一个将日志送到 Loki 集群的代理。Loki 是一个可水平扩展、高可用、多租户的日志聚合系统。Grafana 与 Kibana 类似,它是消费 Loki 数据的可视化工具。
PLG的工作流程是这样的:

日志系统之 EFK vs. PLG Stack

Loki 的部署架构
Loki 可以配置为单进程模式(单体模式)或多进程模式(微服务模式),多进程模式与 Loki 的水平扩展性和高可用性对应。

日志系统之 EFK vs. PLG Stack

来源:https://grafana.com/docs/loki/latest/architecture

单进程模型非常适合本地开发和小数据量的监视。对于生产或较大的数据负载,建议使用多进程模型。于此同时,Loki 的读写是分离的,因此可以根据需要独立“弹”读写节点。
Loki 的内部日志架构

来源:https://grafana.com/docs/loki/latest/architecture

Distributor(分发器)
分发器负责处理客户端的输入流,可以类比 DispatcherServlet,是写入日志到 Loki 的第一个节点。一旦接收到一组输入流,分发器会校验每个输入流的正确性,校验完成后会将有效的部分拆分成多个批次并行地发送到多个 Ingester(没想到怎么翻译)。
Ingester
Ingester 负责写日志到长期存储组件 (DynamoDB, S3, Cassandra等) ,其实就是把日志写到磁盘,和负责读日志到内存。
Querier(查询器)
查询器使用 LogQL 处理查询请求,它会同时从 Ingester 和长期存储组件中拉取日志,当然在查询长期存储组件之前会先查询 Ingester。
Query Frontend
Query Frontend 是提供查询API的可选服务,也可加快读日志的速度。如果配置了 Query Frontend,查询请求会重定向到 Query Frontend,而不是 Querier。

Read Path

总结一下:
  1. Querier 接收到 HTTP 请求。

  2. Querier 将查询请求传到 Ingester。

  3. Ingester 接收到读请求会返回匹配的数据,如果有的话。

  4. 如果 Ingester 没有数据返回,则 Querier 会从磁盘懒加载。

  5. Querier 会遍历所有接收到的数据并去重,然后返回给 HTTP 链接。

Write Path

总结一下:
  1. Distributor 接收到 HTTP 请求。

  2. Distributor 将 HTTP 输入流进行哈希,发送到各 Ingester。

  3. Ingester 接收到读请求会返回匹配的数据,如果有的话。

  4. Ingester 创建数据块存储流数据或追加到现有的数据块中。

  5. Distributor 返回一个成功的 HTTP 链接。



对比两者
查询语言 Query DSL, Lucene Query Lnguage VS. LogQL
Elasticsearch 用的是 Query DSL 和 Lucene Query Lnguage,有着全文检索的能力和有大量的运算符支持,支持相关性分数排序。Loki 使用 LogQL,是通过日志标签来检索日志数据,也有运算符支持,但不像前者这么成熟。但使用日志标签,更容易查询和监控。
可扩展性
都支持水平扩容,但 Loki 更有优势, 因为 Loki 的读写是分离的,可根据特定需求进行扩容,且吞吐量更大。
成本
Loki 更经济,因为 Loki 不索引日志数据,而是仅索引元数据,所以更节省存储资源。