ELK 6.5.4版本下同一Filebeat输入对应双Logstash管道的端口占用问题求助
ELK 6.5.4版本下同一Filebeat输入对应双Logstash管道的端口占用问题求助
嘿,我仔细看了你的问题,这问题其实很好解决——你遇到的端口占用是因为同一个端口不能被两个Logstash输入插件同时绑定,操作系统的网络规则就是这样,不允许多个监听实例抢占同一个端口。你的核心需求是给特定索引设置单worker保证日志顺序,这个思路没问题,但实现方式得调整下,不能让两个管道各自监听同一个Beats端口。
给你一套可行的解决方案,本质是用「一个主管道统一接收Beats事件,再路由到不同业务管道」的模式:
第一步:调整pipelines.yml配置
新增一个主管道负责接收所有Beats输入,保留你的两个业务管道各自的worker/batch配置:
- pipeline.id: main-ingest-pipeline path.config: "/Users/gyrao/Documents/ELK/logstash-6.5.4/config/pipelines/main-ingest.config" # 主管道的workers可以用默认值,或者按需调整 - pipeline.id: first-pipeline path.config: "/Users/gyrao/Documents/ELK/logstash-6.5.4/config/pipelines/api-address.config" pipeline.batch.size: 1 - pipeline.id: second-pipeline path.config: "/Users/gyrao/Documents/ELK/logstash-6.5.4/config/pipelines/my-config.config" pipeline.workers: 1 pipeline.batch.size: 1 queue.type: persisted path.queue: "/Users/gyrao/Documents/ELK/logstash-6.5.4/config/queue"
第二步:创建主管道配置文件main-ingest.config
这个管道唯一监听5044端口接收Beats事件,然后根据你的需求把事件转发到对应业务管道:
input { beats { host => "127.0.0.1" port => 5044 } } output { # 两种转发方式选一种: # 方式1:把所有事件都转发到两个管道(后续在各自filter里区分事件类型) pipeline { send_to => ["first-pipeline", "second-pipeline"] } # 方式2:根据字段/索引做条件转发(更精准,适合你区分特定索引的场景) # if [fields][target_index] == "sequence-sensitive-index" { # pipeline { send_to => ["second-pipeline"] } # } else { # pipeline { send_to => ["first-pipeline"] } # } }
第三步:修改两个业务管道的输入配置
把原来的Beats输入换成pipeline输入,接收主管道转发过来的事件:
api-address.config修改后:
input { pipeline { address => "first-pipeline" } } filter { # 保留你原来的过滤逻辑 } output { # 保留你原来的输出逻辑 }
my-config.config修改后:
input { pipeline { address => "second-pipeline" } } filter { # 保留你原来的过滤逻辑 } output { # 保留你原来的输出逻辑 }
为什么这么做?
- 主管道独占5044端口,彻底避免了端口占用冲突;
- 业务管道各自保留你需要的
pipeline.workers和pipeline.batch.size配置,完美满足你对特定索引日志顺序的要求; - 事件路由逻辑清晰,后续扩展新管道也很方便。
备注:内容来源于stack exchange,提问作者Gajendar
相关产品推荐
相关产品推荐

