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

时间:2021-02-23 11:52:42

标签: elasticsearch logstash logstash-configuration logstash-forwarder

根据之前的讨论 (Defining multiple outputs in Logstash whilst handling potential unavailability of an Elasticsearch instance),我现在在 Logstash 中使用管道,以便将数据输入(来自 TCP 5044 上的 Beats)发送到多个 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 接收。

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

1 个答案:

答案 0 :(得分:1)

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