Filebeat写ElasticSearch故障排查思路(上)

#作者:程宏斌

文章目录

  • 一、现象确认
  • 二、网络与资源排查
  • [kubectl top pod -n <namespace> | grep filebeat](#kubectl top pod -n <namespace> | grep filebeat)
      • [2.1.2 排查宿主机资源瓶颈](#2.1.2 排查宿主机资源瓶颈)
    • (二)ElasticSearch节点排查
      • [2.2.1 磁盘I/O是否饱和](#2.2.1 磁盘I/O是否饱和)
      • [2.2.2 线程池是否阻塞(写入慢核心指标)](#2.2.2 线程池是否阻塞(写入慢核心指标))
  • [curl -XGET "http://<es_host>:9200/_nodes/stats/thread_pool?pretty"](#curl -XGET "http://<es_host>:9200/_nodes/stats/thread_pool?pretty")
      • [2.2.3 GC是否频繁导致停顿](#2.2.3 GC是否频繁导致停顿)
      • [2.2.4 节点是否压力过高(负载)](#2.2.4 节点是否压力过高(负载))
      • [2.2.5 Heap使用是否接近上限(影响GC)](#2.2.5 Heap使用是否接近上限(影响GC))
    • (三)排查网络链路
      • [2.3.1 使用ping检查基本连通性或网络抖动](#2.3.1 使用ping检查基本连通性或网络抖动)
      • [2.3.2 使用telnet或nc检查端口可达性(连通性)](#2.3.2 使用telnet或nc检查端口可达性(连通性))
      • [2.3.3 使用mtr或traceroute诊断链路质量](#2.3.3 使用mtr或traceroute诊断链路质量)
  • [mtr -rwzbc 100 <es_host>](#mtr -rwzbc 100 <es_host>)
      • [2.3.4 Filebeat自身日志观察网络错误](#2.3.4 Filebeat自身日志观察网络错误)

一、现象确认

(一)是完全写不进去,还是写入变慢?

1.1.1 完全写不进去的问题现象:

  1. filebeat.events.added的数值呈现正常增长,filebeat.output.events.acked采集正常,但写入ElasticSearch失败。
  2. Filebeat日志中有大量:connectionre fused、403、429、bulk request failed明确是写入失败。
  3. ElasticSearch中无对应索引、indextemplate未配置、写入报错reject或auth entication denied。
  4. publish_failed、retrying提示频繁确认是完全无法写入。

1.1.2 写入变慢问题现象:

  1. filebeat.events.added和acked都在增加,但增速慢或者正在写,吞吐下降,比如30秒只写了几条,而业务实际每秒几百条,可能写入瓶颈或pipeline堵塞。
  2. Filebeat日志中bulk成功率下降,或出现flushtimeout Output队列堆积,或者es写入慢。
  3. ElasticSearch ingores est pipe line存在处理耗时、mapping冲突,可能是es处理链路问题。
  4. Filebeat CPU/内存占用较高,或pipe line active持续较大,可能是资源瓶颈或处理慢导致发送阻塞。

(二)是所有日志文件都受影响,还是部分路径/采集源有问题?

1.2.1 检查配置文件中input是否正确

复制代码
filebeat.inputs:
- type:log
enabled:true
paths:
- /var/log/app1/*.log
- /var/log/app2/*.log
  1. 检查是否存在路径拼写错误、权限问题。
  2. 某些路径是否实际没有匹配到文件(可用ls /var/log/app2/*.log验证)。
  3. 若用了exclude_path/ignore_older/multiline,是否误过滤了文件。

1.2.2 查看Filebeat的harvester状态(是否正常采集各文件)

在Filebeat的日志中搜索以下关键词,每30秒有一次统计:

复制代码
"filebeat":{
"harvester":{
"files":{
"xxx":{
"name":"/var/log/test.log",
"read_offset":80,
"size":80,
"last_event_timestamp":"..."
}
},
"open_files":11,
"running":11,
"started":1
}
}

重点看:

  • 每个文件是否都在列表中(说明都被采集)。
  • read_offset是否在增长(说明该文件有新内容被读取)。
  • 是否有start_time但一直没last_event_timestamp(可能没新日志)。
  • 某些文件不出现,可能是没被采集or被忽略了(看include/exclude)。

1.2.3 临时人工追加日志,测试是否被采集

可对每个配置路径下的日志执行:

复制代码
echo"test-$(date)">>/var/log/app1.log
echo"test-$(date)">>/var/log/app2.log

然后观察filebeat的metrics日志中是否有对应:

复制代码
"filebeat.events":{
"added":2,
"done":2
}
"filebeat.output.events.acked":2

或者在目标ElasticSearch中检查是否收到了新的写入。

(三)开始时间点是否明确?是否与版本发布、配置变更、网络波动相关?

1.3.1 ElasticSearch监控(IndexingRate)是否有下降趋势?

可以看到采集量是否在某个时间点突然下降。

1.filebeat日志中是否有突发的error/warning?

kubectl logs -f -nlogging filebeat-name

二、网络与资源排查

(一)Filebeat节点排查

2.1.1 排查容器资源

  1. 是否出现CPU、内存瓶颈(尤其在高并发场景),查看容器资源使用情况

kubectl top pod -n | grep filebeat

  1. 查看容器资源限制
    确认filebeat容器是否设置了资源限制过低

2.1.2 排查宿主机资源瓶颈

  1. top/htop查看实时使用

    top -p $(pgrep -d',' -f filebeat)

或使用htop看CPU核心压力分布

  1. 检查系统总体资源

    free-m #内存占用情况

    vmstat 15 #CPU、内存、IO使用趋势

    iostat -x 15 #看IO等待时间

  2. 查看filebeat占用

    ps aux | grep filebeat

关注%CPU和%MEM列。

(二)ElasticSearch节点排查

2.2.1 磁盘I/O是否饱和

  1. 是否有磁盘IO饱和、线程池阻塞、GC频繁等异常?通过OS工具排查

    iostat -x 15

%util 磁盘利用率 >80%→IO饱和

await IO请求等待时间(ms) >10ms→可能有磁盘瓶颈

r/s,w/s 读/写次数,持续高说明负载大

  1. ElasticSearch API查看磁盘使用

    curl -XGET "http://<es_host>:9200/_cat/nodes?v&h=ip,disk.used_percent,disk.avail"

如果磁盘使用率接近85%以上,ElasticSearch会触发disk water mark限流机制,导致写入受阻。

2.2.2 线程池是否阻塞(写入慢核心指标)

使用_nodes/stats/thread_pool查看写入线程池状态:

curl -XGET "http://<es_host>:9200/_nodes/stats/thread_pool?pretty"

重点看这些线程池的状态:write、index、bulk,一旦bulk.rejected持续增长,则filebeat发过来的写入被拒绝了,直接影响写入吞吐。

2.2.3 GC是否频繁导致停顿

  1. # curl -s http://<es_host>:9200/_nodes/stats/jvm?pretty
    重点字段:

    jvm.gc.collectors.old.collection_count
    jvm.gc.collectors.old.collection_time_in_millis

观察:

是否频繁触发Old GC?

每次Old GC是否耗时较高(>500ms)

  1. 用jstat工具(JVM原生命令):

    jstat -g cutil <pid> 1s

频繁Full GC且内存回收率低,可能说明内存设置不合理或内存泄漏。

2.2.4 节点是否压力过高(负载)

复制代码
# curl -XGET "http://<es_host>:9200/_nodes/stats/os?pretty"

查看每个节点的load_average是否超过实际CPU核心数。如果负载飙高,也会影响写入。

2.2.5 Heap使用是否接近上限(影响GC)

复制代码
# curl -XGET http://<es_host>:9200/_nodes/stats/jvm?pretty

重点关注:

复制代码
"heap_used_percent":25,
"heap_max_in_bytes":32212254720

Heap使用率接近90%,很可能引发频繁GC,影响吞吐。

(三)排查网络链路

是否有抖动(ping、telnet检查连通性、丢包率)

2.3.1 使用ping检查基本连通性或网络抖动

复制代码
# ping <es_host> 

2.3.2 使用telnet或nc检查端口可达性(连通性)

复制代码
# telnet <es_host> 9200

复制代码
# nc -zv <es_host> 9200

能成功连接说明端口通畅。若连接超时或失败,存在防火墙、ACL或网络故障问题。

2.3.3 使用mtr或traceroute诊断链路质量

使用方法:

mtr -rwzbc 100 <es_host>

分析链路中各跳的延迟、丢包率,是否集中在某一跳,是否网络设备质量不佳。

2.3.4 Filebeat自身日志观察网络错误

查看Filebeat日志中是否有类似如下报错:

  1. connection refused
  2. dial tcp timeout
  3. i/o timeout
  4. failed to publish events: client is not connected
    这些通常意味着网络连接中断、ElasticSearch异常拒绝连接或网络抖动引发重试。
相关推荐
啟明起鸣3 分钟前
【Nginx 网关开发】上手 Nginx,简简单单启动一个静态 html 页面
运维·c语言·前端·nginx·html
Tinyundg15 分钟前
Linux系统分区
linux·运维·服务器
要做一个小太阳18 分钟前
华为Atlas 900 A3 SuperPoD 超节点网络架构
运维·服务器·网络·华为·架构
江畔何人初22 分钟前
service发现
linux·运维·云原生
life码农28 分钟前
Linux系统清空文件内容的几种方法
linux·运维·chrome
zbguolei33 分钟前
虚拟机安装Ubuntu后无法登录
linux·运维·ubuntu
UP_Continue36 分钟前
Linux--基础IO
linux·运维·服务器
驱动探索者41 分钟前
linux hwspinlock 学习
linux·运维·学习
RisunJan1 小时前
Linux命令-logout(安全结束当前登录会话)
linux·运维·安全
ICT董老师1 小时前
在Linux中,有多种命令可以向指定文件添加文本
linux·运维·服务器