在带有节拍输入的 Logstash 中使用多个管道

Using multiple pipelines in Logstash with beats input

根据之前的讨论 (),我现在在 Logstash 中使用管道将数据输入(从 Beats on TCP 5044)发送到多个 Elasticsearch 主机。 pipelines.yml 的相关摘录如下所示。

- pipeline.id: beats
  queue.type: persisted
  config.string: |
          input {
                  beats {
                        port => 5044
                        ssl => true
                        ssl_certificate_authorities => '/etc/logstash/config/certs/ca.crt'
                        ssl_key => '/etc/logstash/config/certs/forwarder-001.pkcs8.key'
                        ssl_certificate => '/etc/logstash/config/certs/forwarder-001.crt'
                        ssl_verify_mode => "force_peer"
                        }
                }
           output { pipeline { send_to => [es100, es101] } }

- pipeline.id: es100
  path.config: "/etc/logstash/pipelines/es100.conf"
- pipeline.id: es101
  path.config: "/etc/logstash/pipelines/es101.conf"

在每个管道 .conf 文件中,我都有相关的虚拟地址,即文件 /etc/logstash/pipelines/es101.conf 包括以下内容:

input {
  pipeline {
    address => es101
  }
}

此配置似乎运行良好,即数据由每个 Elasticsearch 主机 es100es101.

接收

我需要确保如果其中一台主机不可用,另一台主机仍能接收数据,多亏了之前的提示,我现在正在使用据我所知允许这样做的管道。但是,我显然缺少此配置中的一些关键内容,因为如果另一台主机不可用,则主机不会接收到数据。非常欢迎任何建议。

首先,您应该在下游管道(es100、es101)上配置持久队列,并调整它们的大小以包含在中断期间到达的所有数据。但即使使用持久队列,logstash 也有一个至少一次的交付模型。如果持久队列填满,则背压将导致节拍输入停止接受数据。正如关于输出隔离器模式的文档所说“如果下游管道的任何持久队列......变满,两个输出都将停止”。如果你真的想确保一个输出永远不会因为另一个输出不可用而被阻塞,那么你将需要引入一些具有不同交付模型的软件。比如配置filebeat写入kafka,然后有两条pipeline分别从kafka读取和写入elasticsearch。如果 kafka 配置了最多一次的传递模型(默认),那么如果它不能传递它就会丢失数据。