内容提要
在logstash中,tcp和udp接入的日志无法发送到pulsar,经过抓包和检查发现服务端未消费日志,导致日志在队列中阻塞。最终确认是pulsar的bug,更新pulsar-client版本后问题解决。
关键要点
-
在logstash中,tcp和udp接入的日志无法发送到pulsar,导致日志在队列中阻塞。
-
通过抓包检查发现数据包正常进入容器,但服务端未消费日志。
-
使用netstat查看tcp和udp缓存队列,发现服务端卡住,Recv-Q有堆积。
-
检查logstash管道信息,发现tcp插件的out数量不变,说明没有接收新数据。
-
output管道的pulsar插件显示in比out多150条日志,说明日志阻塞在队列中。
-
pulsar服务状态正常,手动生产日志没有问题,排除pulsar本身故障。
-
通过查看logstash线程堆栈信息,发现是pulsar的官方bug,开启压缩时容易触发。
-
复现该问题的方法是修改pulsar-client的memory_limit参数并开启压缩。
-
通过更新pulsar-client版本解决了阻塞问题。
-
总结经验,利用工具分析原因并通过搜索找到解决方案。
延伸问答
为什么logstash无法将日志发送到pulsar?
因为服务端未消费日志,导致日志在队列中阻塞。
如何确认logstash中的日志接入问题?
通过抓包检查数据包是否正常进入容器,并使用netstat查看tcp和udp缓存队列。
pulsar的bug是什么导致了日志阻塞?
在开启压缩时,pulsar-client的内存限制过小会触发该bug,导致阻塞。
如何解决logstash与pulsar之间的日志阻塞问题?
通过更新pulsar-client版本解决了阻塞问题。
如何复现pulsar的阻塞问题?
修改pulsar-client的memory_limit参数并开启压缩,可以稳定快速复现该问题。
在排查日志阻塞时,如何查看logstash的管道信息?
可以通过curl命令获取logstash对应管道的信息,查看input和output的日志数量。