Elasticsearch 5.6.8集群分片分布异常及节点负载不均问题排查求助
让我一步步帮你拆解这两个关联问题——所有分片扎堆在3号节点,以及数据流入时1号节点负载飙升的原因:
一、分片全部分布在3号节点的可能配置问题
节点属性与分片分配规则不匹配
检查3号节点的elasticsearch.yml是否配置了特殊的节点属性,比如:node.attr.box_type: hot同时确认索引或集群是否设置了分片分配过滤规则,强制将分片分配到带有该属性的节点。可以通过以下命令查看:
- 全局集群分配设置:
GET /_cluster/settings - 所有索引的分配设置:
GET /_all/_settings
如果发现cluster.routing.allocation.include.box_type: hot这类全局规则,或者某个索引设置了index.routing.allocation.include.box_type: hot,就会导致分片只往3号节点跑。
- 全局集群分配设置:
节点分配权重设置失衡
如果3号节点的node.routing.allocation.weight值远高于1、2号节点(比如设置为10,而其他节点是1),Elasticsearch会优先将分片分配到权重更高的节点。检查每个节点的这个配置项。1、2号节点存在分片分配限制
查看1、2号节点的磁盘使用率是否超过了Elasticsearch默认的分片分配阈值(85%),或者内存不足导致节点被标记为不可用。可以用GET /_cat/nodes?v查看disk.usage列,或者GET /_cluster/health确认节点状态。如果之前1、2号节点出现过离线,ES会把分片移到3号节点,恢复后默认不会自动回迁,需要手动调整或开启分片自动重新平衡。
二、数据流入时1号节点负载过高的排查方向
LB负载均衡策略失效
你的架构是Logstash -> LB -> ES节点,很可能LB的流量分发规则有问题:比如采用了静态权重分配(1号节点权重远高于其他)、会话保持策略导致请求集中,或者轮询规则故障。检查LB的配置,确认是否是均匀分发请求到三个ES节点。写入热点集中在1号节点
即使1号节点分片少,如果某个写入量极大的索引的主分片在1号节点,所有写入请求都会先打到主分片所在节点,导致负载飙升。用GET /_cat/shards?v查看每个分片的主/副状态(prirep列)和所在节点,结合业务日志确认是否有高写入量的索引主分片落在1号节点。节点角色配置冲突
如果1号节点同时配置了node.master: true和node.data: true,并且是集群的主节点,那么它既要承担集群管理的核心任务,又要处理写入请求,双重负载会导致CPU/内存占用偏高。对比三个节点的elasticsearch.yml里的node.master、node.data配置,看是否3号节点仅作为data节点,而1号是master+data节点。JVM或硬件资源配置差异
检查1号节点的JVM堆内存设置(jvm.options里的-Xms和-Xmx)是否过小,导致频繁GC;或者硬件本身(CPU核心数、内存大小)比2、3号节点差,无法承受相同的流量压力。
快速排查步骤建议
- 先执行
GET /_cat/nodes?v&h=name,node.role,disk.usage,load,mem.heap.percent,对比三个节点的角色、磁盘、负载、堆内存使用情况。 - 用
GET /_cluster/settings和GET /_all/_settings检查分片分配的全局和索引级规则。 - 查看LB的流量监控,确认请求是否均匀分发到三个ES节点。
- 用
GET /_cat/shards?v定位主分片的分布情况,结合写入量日志判断是否存在热点分片。
内容的提问来源于stack exchange,提问作者petrolis




