随着分布式系统复杂性的不断增加和云原生解决方案的不断增长,监控和可观察性成为了解系统行为的一个非常重要的方面。这就需要可扩展的工具来收集所有服务的数据,并为开发人员提供性能、错误、日志和组件可用性的统一视图。这些工具还需要具有成本效益和高性能。在本文中,我们将介绍两种流行的日志记录堆栈——EFK (Elasticsearch) 和 PLG (Loki),并了解它们的架构和差异。
什么是 EFK 堆栈?
你可能听说过非常流行的 ELK 或 EFK 堆栈。它是一组监控工具——Elastic search(对象存储)、Logstash 或 FluentD(日志路由和聚合)以及用于可视化的 Kibana。
典型的工作流程如下:
Elasticsearch是一个实时、分布式对象存储、搜索和分析引擎。它擅长对日志等半结构化数据进行索引。信息被序列化为 JSON 文档并实时索引并分布在集群中的节点上。Elasticsearch 使用倒排索引列出所有唯一单词及其相关文档进行全文搜索,该索引基于 Apache Lucene 搜索引擎库。
FluentD是一个数据收集器,它将数据收集和消费统一起来,以便更好地使用。FluentD 尝试尽可能将数据构造为 JSON,具有插件架构,并受到数百个社区提供的插件支持。
Kibana是 Elasticsearch 数据的可视化引擎,具有时间序列分析、机器学习、图形和位置分析等功能。
Elasticsearch架构
通常在 Elasticsearch 集群中,数据存储在跨节点的分片中。集群由许多节点组成,以提高可用性和弹性。任何节点都能够执行所有角色,但在大规模部署中,节点可以被分配特定的职责。
集群中有以下类型的节点:
下图显示了数据如何存储在主分片和副本分片中,并以跨节点分散负载并提高数据可用性。
每个分片中的数据都存储在倒排索引中。下图显示了数据如何存储在倒排索引中。
什么是 PLG(Promtail、Loki 和 Grafana)?
如果你没有找到这个缩写词,请不要感到惊讶,它通常被称为 Grafana Loki。Grafana实验室设计了Loki,这是一个受Prometheus启发的水平可扩展、高可用、多租户日志聚合系统。它仅索引元数据,不索引日志内容。这种设计决策使其非常具有成本效益且易于操作。
Promtail是一个将日志从本地系统发送到 Loki 集群的代理。
Grafana是一种可视化工具,它使用来自 Loki 数据源的数据。
Loki基于Prometheus相同的设计原理构建,因此非常适合存储和分析日志。
Loki 架构
Loki 可以在单进程模式或多进程模式下运行,提供独立的水平可扩展性。单进程模型有利于本地开发和小型监控设置。对于生产和可扩展的工作负载,建议使用微服务模型。Loki 中的写入路径和读取路径是解耦的,因此它具有高度可调性,并且可以根据需要独立扩展。
下面是 Loki(微服务模型)的架构:
组件:
Promtail – 这是安装在节点上的代理(作为 Daemonset),它从作业中提取日志并与 Kubernetes API 服务器通信以获取元数据并使用此信息来标记日志。然后它将日志转发到 Loki 中央服务。代理支持与 Prometheus 相同的标签规则,以确保元数据匹配。
Distributor– Promtail将日志发送到分发器,该分发器充当缓冲区。为了处理数百万条写入,它将流入的日志批量处理,并在数据到达时按块进行压缩。存在多个摄取者(ingesters),属于每个流的日志将在同一块中的所有相关条目中进入相同的摄取者。这是通过使用摄取者环和一致性哈希来完成的。为了提供弹性和冗余性,它会进行n(默认为3)倍的复制。
Ingester – 当块进入时,它们被压缩并附加日志。一旦块填满,该块就会刷新到数据库。元数据进入索引,日志块数据进入块(通常是对象存储)。日志刷完后,Ingester会创建一个新块并向其中添加新条目。
下面是一个示例仪表板,显示来自 Prometheus 的 ETCD 指标数据和 Loki 的 ETCD Pod 日志数据。
EFK (Elasticsearch) 与 PLG (Loki) 技术栈的比较:
查询语言
Elasticsearch 使用 Query DSL 和 Lucene 查询语言提供全文搜索功能。它是一个成熟强大的搜索引擎,拥有广泛的运营商支持。它可以搜索内容并使用相关性分数对其进行排序。另一方面,Loki 使用的是 LogQL,它使用日志标签来过滤和选择日志数据。Loki 可以使用一些运算符和算术,但它不像 Elastic Search 那样成熟。
可扩展性
两者都是水平可扩展的,但 Loki 由于其解耦的读写路径以及使用基于微服务的架构而具有更多优势。它可以根据具体需求进行定制,并可用于处理大量日志数据。
多租户
在共享集群中拥有多个租户是降低运营成本的常见主题。这两种技术都提供了托管多个租户的方法。使用elasticsearch,有多种方法可以将租户分开——每个租户一个索引、基于租户的路由、使用唯一的租户字段以及使用搜索过滤器。
在 Loki 中,通过在 HTTP 标头请求中使用 X-Scope-OrgId支持多租户 。
成本
Loki 是一种极具成本效益的解决方案,因为它的设计决策是避免对实际日志数据建立索引。仅对元数据建立索引,因此可以节省存储 和内存(缓存)。与 Elasticsearch 集群所需的块存储相比,对象存储更便宜。
结论
由于元数据发现机制,Loki 技术栈在 Kubernetes 生态系统中非常有用。可以轻松地将 grafana 中基于时间序列的数据与日志关联起来,以实现可观察性。
当涉及成本和长时间存储日志时,Loki 是云原生解决方案日志记录的绝佳选择。
因此,不妨考虑一下 PLG 。