先看ES集群的索引和节点状态
要查看那台服务器往ES里添加数据,最直接的方法是先通过ES的_cat/indices接口确认哪个索引在持续增长,再结合服务器上的应用日志和连接信息锁定具体来源。 下面从操作路径和排查逻辑入手,帮你一步步理清思路。
第一步:用_cat/indices找出“活跃”索引
无论是单台服务器还是集群,ES都会记录每个索引的文档数和存储大小,你只需要在任意一台能访问ES的机器上执行:
curl -s "http://你的ES地址:9200/_cat/indices?v&s=index&h=index,docs.count,store.size,creation.date"
返回结果里,重点关注docs.count和store.size,如果某个索引的文档数在短时间内明显增加,那基本可以断定“有服务器在往里写数据”,继续观察两次查询之间的差值,就能确定写入速率。
- 想按文档数排序,把末尾的
index换成docs.count:desc。 - 想查看具体分片位置,加
h=index,shards,pri.rep,health。
第二步:通过节点统计确认写入来自哪台机器
如果集群有多台节点,用以下命令看每个节点的写入指标:
curl -s "http://你的ES地址:9200/_cat/nodes?v&h=name,ip,heap.percent,ram.percent,cpu,load_1m"
但节点只能说明“数据写到哪个节点”,还不能直接对应到“哪台服务器在发数据”,这时需要借助ES的慢日志和审计日志。
从ES端反查:慢日志和审计日志锁死IP
ES默认开启慢搜索日志,但写慢日志(index slow log)需要手动配置,你可以在索引模板或具体索引上设置:
PUT /你的索引名/_settings
{
"index.indexing.slowlog.threshold.index.info": "1s"
}
设置后,所有超过1秒的写入操作会记录到ES日志文件中,格式类似:
[index] [你的索引名] took[1.2s], took_millis[1200], doc_type[_doc], id[...], source[...]
日志里会包含源IP地址(如果开启transport日志)或客户端节点信息,更直接的办法是在ES的elasticsearch.yml里开启审计功能:
xpack.security.audit.enabled: true xpack.security.audit.outputs: index
然后创建索引模式security-auditlog-,在Kibana中按source.address字段过滤,就能看到所有写请求来自哪个IP了,不过审计日志会占用额外存储,建议只在排查期间临时开启。
如果ES启用了HTTP客户端认证
很多企业会给ES加搜索或写入权限,当你在日志中看到类似[403]或[401]错误,说明服务器的写入请求可能被拒绝了,这时需要从服务器侧查具体看下一条。
从服务器侧查:应用日志和netstat双管齐下
既然问题聚焦在“那台服务器”,那就登录到嫌疑最大的服务器上,做以下三件事。
查应用日志中的ES写入痕迹
大多数Java应用使用Logstash或Elasticsearch Rest Client,查应用日志时,搜索关键词"index"、"bulk"、"write"、"elasticsearch",配合时间戳定位写入动作,如果是Spring Boot应用,可以在配置文件application.yml里看到ES连接地址,那正是它往哪个ES集群写数据。
grep -r "elasticsearch" /你的应用日志目录/ | tail -100
用netstat查看活跃连接
ES的Transport端口默认是9300(老版本)或9200(HTTP),执行:
netstat -ant | grep 9200 | grep ESTABLISHED
每条连接的本地或远端IP就是正在对话的双方,如果这台服务器上跑着Java进程,且连接指向ES集群节点IP,那它就是写入方之一。
用lsof确认进程和端口对应关系
lsof -i :9200
输出里会显示进程PID、进程名和连接状态,拿到PID后再用ps -ef | grep PID查看具体是什么程序,就能确认是哪套业务在写数据。
用Kibana和ES API实时监控写入速率
如果你不想折腾命令行,Kibana是最直观的观察窗口。
在Kibana中查看Index Rate
进入Stack Monitoring(如果配置了)或使用Metrics Explorer,选择索引维度,添加指标indexing.indexing_total或indexing.indexing_time_in_millis,即可看到每秒写入文档数的曲线,如果发现某个索引的曲线持续上扬,说明有服务器在不断灌数据。
用curl查看索引统计信息
curl -s "http://你的ES地址:9200/你的索引名/_stats/indexing?pretty"
返回的total.indexing_total是累计值,隔10秒再查一次,差值除以10就是每秒写入速率,这个数据比日志更准确,适合做定量分析。
用_search按时间戳过滤最新文档
想知道“数据是不是最近加的”,直接查最新文档:
curl -s "http://你的ES地址:9200/你的索引名/_search?pretty" -d '{"sort":[{"@timestamp":"desc"}],"size":3}'
返回的文档里如果带_id,根据ID里的时间部分通常能推断写入时刻;如果带source字段,还能看到数据来自哪个业务模块。
实践场景:查一台服务器往ES写数据的具体命令组合
假设你的ES部署在168.1.10:9200,服务器A的IP是168.1.20,想确认服务器A是否在写数据,按以下顺序操作。
服务器A上跑着Spring Boot应用
# 1. 查看应用进程号 ps -ef | grep java # 2. 查看该进程的TCP连接 lsof -i :9200 -p 进程号 # 3. 查看应用日志中最近的ES操作 grep "elasticsearch" /var/log/app.log | tail -20
服务器A上安装了Logstash
# 查看Logstash输出配置 cat /etc/logstash/conf.d/输出的配置文件.conf # 查看Logstash日志 journalctl -u logstash -f --since "10 minutes ago"
通过ES的慢日志反查
# 开启慢日志(只需一次)
curl -XPUT "http://192.168.1.10:9200/索引名/_settings" -d '{
"index.indexing.slowlog.threshold.index.warn": "2s"
}'
# 查看ES日志中的慢写记录
tail -f /var/log/elasticsearch/索引名_indexing_slowlog.log
常见问题排查:为什么查不到写入?
Q1:ES节点上明明有数据增长,但服务器却查不到任何连接。
这种情况多发生在写请求经过反向代理或负载均衡时,比如服务器A通过Nginx转发到ES,那么你看到的就是Nginx的IP,解决方法是查ES端的慢日志或审计日志,记录source.address字段,再反查该IP对应的实际机器。
Q2:使用Kibana的Discover查看索引时,没有新数据出现。
先检查索引模式的时间字段是否选对,如果数据自带@timestamp但字段类型为date,Kibana才能正确排序;如果字段类型是text,新数据不会显示在默认时间筛选范围内,此时用_cat/indices看文档数是否增长,或直接执行_search不带时间过滤。
Q3:服务器A上的应用明明配置了ES地址,但数据没写进去。
优先确认应用配置文件中的ES地址是否可连通,以及ES是否启用了安全认证,如果ES开启了security,应用需要用用户名密码或API Key,否则会报AuthenticationException
,另外检查ES集群的cluster.routing.allocation.enable是否为all,如果设为none,新的索引分片无法分配,应用虽然收到200响应但数据并未落盘。行业共识认为,多数“写入失败但应用不报错”的情况都发生在集群健康状态为红色或黄色时。
Q&A:围绕“查看服务器往ES加数据”的高频问题
如何快速判断ES索引数据量大小?
用_cat/indices?v&s=store.size:desc,第一行就是存储占比最高的索引,如果想看单条文档平均大小,用_stats接口拿总字节数除以文档数。
服务器往ES添加数据怎么看是否正常?
两个维度:一是看应用日志中是否有超时或重试异常;二是看ES节点CPU和磁盘IO是否飙升,正常情况下,写入请求的响应时间应小于200ms,如果响应时间持续超过1秒,大概率是索引分片数不足或磁盘读写瓶颈。
用logstash往es写入数据时要怎么查看进度?
Logstash自身有监控API,在logstash.yml中配置http.host和http.port后,访问http://logstash地址:9600/_node/stats/pipeline即可查看documents.successed和events.out计数,若该数字停止增长,说明输入源或filter环节卡住了。
查ES写入日志的命令是什么?
ES的json格式日志在/var/log/elasticsearch/集群名.log里,普通写入操作默认不记录,要查看具体写入行为,必须开启慢日志或审计日志,最简单的命令是grep -i "index" /var/log/elasticsearch/slowlog.log,能筛选出所有索引慢日志记录。
用curl查看es数据量有哪些常用组合?
# 查看所有索引的文档数和大小 curl -s "localhost:9200/_cat/indices?v" # 查看某个索引最近5分钟的写入量 curl -s "localhost:9200/索引名/_stats/indexing?pretty" | grep -A5 "^ total" # 查看节点接收的字节速率 curl -s "localhost:9200/_cat/nodes?v&h=ip,loaded,node,http_address,host"
最后回到最初的问题:想查“那台服务器往ES里添加数据”,不要只盯着一处看,先从ES索引的增长情况锁定目标索引,再通过慢日志或审计日志拿到来源IP,最后登录服务器验证进程和端口,这套组合拳打下来,任何写入方都藏不住。记住核心结论:先看索引增长,再查来源IP,最后落定进程。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/615533.html





