服务端数据丢失问题排查

问题现状:服务端日志丢失严重,日均百万的数据量降至十万,简单排查网络端口、客户端采集日志均无异常,服务端服务正常。
现场环境:UEBA6.0 中移在线定制版
架构概要:服务端为 ELK 架构(ElasticSearch、Logstash、Kibana),客户端采集数据通过 udp 协议发往服务端 logstash 中,并进行处理过滤后存入 es 索引中,kibana 通过调用 es 索引中的数据进行展示。

一、综合排查:
a, 查看文件句柄数:

ulimit –a

b, 修改服务端策略:
路径:录像 - 录像策略 - 高级策略设置。

是否发送http返回信息

ResponseEnable=1   #此处将1改为0(0表示关闭)

c, 查看 logstash 句柄数:

ps -ef | grep logstash   #查看logstash的pid
lsof | grep 获取的pid | wc -l   #查看logstash的句柄数正不正常

d, 查看 elasticsearch 句柄数:

ps -ef | grep elasticsearch   #获取pid
lsof | grep 获取的pid | wc –l  #查看es的句柄数正不正常

二、初步定为 logstash 处理性能问题:
a, 更新策略文件 uebaoption.ini:

[Common]
IsOutUdpLog=1
IsOutPluginLog=1

b, 更新客户端文件 (plugin\Com.Isearch.Monitor.Iexplore):

UEBAMonitorIexplore.dll
UEBAMonitorIexploreX64.dll

c, 更新客户端文件(bin\)

UEBAMon.exe
UEBAMon64.exe
UEBARecorder.exe

目的:服务端关闭采集 clip、npro、ib、web 四种日志,减轻 logstash 处理负担
验证:UDP 抓包 10000+,服务端 100+

d, 服务端 /isearch/isa/logstash/logstash.conf 中清楚 filter 中所有内容
服务端数据丢失问题排查
目的:Logstash 的 filter 放开,至使服务端发送至 logstash 的数据完全不作处理直接写入 es 中
验证:UDP 抓包 10000+,服务端 100+

结论:排查logstash处理性能无异常,暂时定位es问题

三.es 排查定位
a, 服务端页面 es 集群状态查询:

10.11.109.15:9200/_plugin/head

集群状态红色,有块 shard 节点灰色

服务端数据丢失问题排查

b, 查看集群分片信息

curl -XGET http://localhost:9200/_cat/shards

查看目前有哪些 es 节点分片有问题,UNASSIGNED 表示未分配

服务端数据丢失问题排查

curl 'localhost:9200/_nodes/process?pretty'

查看节点为 master 的节点唯一标识

服务端数据丢失问题排查

c, 逐个修复每一个节点分片数据, 根据上步输出结果修改 index, shard ,node

curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
"commands" : [ {
"allocate" : {
"index" : "ueba-log-index",     #对应索引名
"shard" : 8,                            #对应损坏的shard 
"node" : "31NYPLafT56UAIb3K53BFg",  #对应唯一标识
"allow_primary" : true
}}]}'

输出:返回 STARTED 表示已分配成功
服务端数据丢失问题排查

d, 重启 es,启动成功,

./elasticsearch.sh stop
./elasticsearch.sh start

如未成功,检查 es 报错日志,通过报错日志可知,插件 license 过期了,但不影响。
服务端数据丢失问题排查

移除 ueba-log-index 目录:

/isadata/esdata/data1/data/escluster/nodes/0/indices/ueba-log-index /

验证:
es 服务启动正常
集群状态页面正常
服务端日志数据恢复
结论:某块shard损坏导致数据写入es异常,至使后台数据丢失

五. 命令与工具

tcpdump -ieth1 udp port 6004 and host 192.168.0.144 -s 0 -w  test.cap #抓取指定IP的udp包并写入某个文件

tcpdump -ieth1 udp port 6004 -s 0 -w  test.cap #抓取全量IP的udp包并写入某个文件

使用 Network Monitor 工具打开写入的文件,用 udp 抓包数与 logstash-file-2018.XX.XX 进行对比,时间、ip 等因素自行计算
服务端数据丢失问题排查

curl 命令详见https://blog.csdn.net/lixi5718/article/details/76270700