在 Logstash 中使用带有节拍输入的多个管道
Posted
技术标签:
【中文标题】在 Logstash 中使用带有节拍输入的多个管道【英文标题】:Using multiple pipelines in Logstash with beats input 【发布时间】:2021-02-23 11:52:42 【问题描述】:根据之前的讨论 (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 主机 es100
和 es101
都接收到数据。
我需要确保如果这些主机中的一个不可用,另一个仍然可以接收数据,并且由于之前的提示,我现在正在使用我理解允许这样做的管道。但是,我显然缺少此配置中的某些关键,因为如果另一个主机不可用,则主机不会收到数据。欢迎任何建议。
【问题讨论】:
【参考方案1】:首先,您应该在下游管道(es100、es101)上配置持久队列,并调整它们的大小以包含中断期间到达的所有数据。但即使使用持久队列,logstash 也具有至少一次交付模型。如果持久队列填满,则背压将导致节拍输入停止接受数据。正如关于输出隔离器模式的文档所说,“如果下游管道的任何持久队列......变满,两个输出都将停止”。如果你真的想确保一个输出永远不会因为另一个输出不可用而被阻塞,那么你将需要引入一些具有不同交付模型的软件。例如,配置filebeat写入kafka,然后有两个管道从kafka读取并写入elasticsearch。如果 kafka 配置了 at-most-once 交付模型(默认),那么如果无法交付它就会丢失数据。
【讨论】:
再次再次感谢您@Badger 的帮助。我已经向 es100、es101 添加了持久队列,一切看起来都很好。这仅适用于小型实验室环境,因此积压不应太大,我会确保空间可用于几个小时的停机时间。以上是关于在 Logstash 中使用带有节拍输入的多个管道的主要内容,如果未能解决你的问题,请参考以下文章
logstash多任务多管道pipeline配置启动,方案分析
logstash多任务多管道pipeline配置启动,方案分析
logstash多任务多管道pipeline配置启动,方案分析
logstash多任务多管道pipeline配置启动,方案分析