如果我可以 post 直接访问 Elasticsearch,为什么还要使用 Beats?

Why use Beats if i can post directly to Elasticsearch?

最近我一直在阅读 Elastic Stack 并发现了这个叫做 Beats 的东西,它基本上用于轻量级托运人。

所以问题是,如果我的服务可以直接命中 Elasticsearch,我真的需要节拍吗?因为据我所知,它只是一个代理 (?)

希望我的问题够清楚

Beats 非常适合作为轻量级代理来收集日志文件、OS 指标等流数据,您需要某种代理来收集和发送这些数据。如果您有一个服务想要将东西放入 Elastic,那么可以,它可以直接使用 rest/java 等 API。

Filebeat 提供了一种集中来自多个服务器的实时日志的方法

假设您在不同的服务器上 运行 一个应用程序的多个实例,并且它们正在写入日志。

您可以将所有这些日志发送到单个 ElasticSearch 索引,然后从那里分析或可视化它们。

单个静态文件不需要 Filebeat 即可移动到 ElasticSearch。

不确定您具体指的是哪个节拍,但让我们以 Filebeat 为例。

假设应用程序日志需要被索引到 Elasticsearch 中。选项

  1. Post 日志直接到 Elasticsearch
  2. 将日志保存到文件中,然后使用 Filebeat 对日志进行索引
  3. 将日志发布到 RabbitMQ 或 Kafka 等 AMQP 服务,然后使用 Logstash 输入插件从 RabbitMQ 或 Kafka 读取并索引到 Elasticsearch

选项 2 的好处

  • Filebeat 确保每条日志消息都已传送 at-least-once。 Filebeat 之所以能够实现这种行为,是因为它将每个事件的传递状态存储在注册表文件中。在定义的输出被阻塞且未确认所有事件的情况下,Filebeat 将继续尝试发送事件,直到输出确认它已收到事件。
  • 在将数据传送到 Elasticsearch 之前,我们可以做一些额外的 processing or filtering. We want to drop some logs based on some text in the log message or add additional field(例如:将应用程序名称添加到所有日志中,以便我们可以将多个应用程序日志索引到一个索引中,然后在消费端我们可以过滤基于应用程序名称的日志。)

本质上,beats 提供了可靠的数据索引方式,而不会对系统造成太多开销,因为 beats 是轻量级的托运人。

选项 3 - 这也提供与选项 2 相同的好处。如果我们想将日志直接发送到外部系统而不是将其存储在本地系统的文件中,这可能更有用。对于部署在 Docker/Kubernetes 中的任何应用程序,我们没有太多访问权限或没有足够的 space 来在本地系统中存储文件。