Elasticsearch 集群实战:分片分配不均衡问题排查 + 彻底解决方案
- 一、前言
- 二、什么是分片不均衡?
- 2.1 定义
- 2.2 典型现象
- 三、分片不均衡带来的危害
- 三、分片不均衡原因总览(流程图)
- 四、快速排查:查看分片是否均衡
- 4.1 查看各节点分片数量
- 4.2 查看分片分配情况
- 五、解决方案 1:开启集群自动分片均衡(最简单)
- 5.1 启用集群自动平衡
- 5.2 提高并发平衡速度(可选)
- 六、解决方案 2:解除磁盘水位线限制(最常见原因)
- 6.1 查看磁盘水位
- 6.2 调整磁盘水位(临时解决)
- 6.3 解除只读模式
- 七、解决方案 3:取消强制分配规则(awareness 问题)
- 7.1 查看是否有强制分配规则
- 7.2 清空 awareness 配置
- 八、解决方案 4:手动移动分片(立刻见效)
- 8.1 手动移动分片命令
- 九、解决方案 5:解决索引分片倾斜(大分片问题)
- 十、解决方案 6:新加入节点不分配分片?
- 十一、永久根治:最佳实践(从根源避免不均衡)
- 十二、分片不均衡问题处理流程(总结图)
- 十三、总结(最核心 5 条)
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在 Elasticsearch 集群运维中,分片不均衡是最常见、最影响性能的问题。
表现为:
- 有的节点磁盘爆满、CPU 高、查询慢
- 有的节点空闲、负载很低
- 集群整体性能上不去
- 热点节点频繁 GC、宕机风险高
本文从原因、排查、自动平衡、手动干预、永久根治五个维度,教你彻底解决分片不均衡,让集群负载均匀、性能拉满。
二、什么是分片不均衡?
2.1 定义
集群中各个数据节点的分片数量、数据大小、磁盘占用差异过大,导致节点负载不均匀。
2.2 典型现象
- Node1:100 个分片,磁盘 80%
- Node2:40 个分片,磁盘 30%
- Node3:30 个分片,磁盘 25%
三、分片不均衡带来的危害
- 热点节点压力过大,查询/写入性能下降
- 磁盘不均匀导致部分节点先写满
- 集群无法水平扩展,加节点也没用
- 容易引发OOM、节点掉线、集群变红
三、分片不均衡原因总览(流程图)
四、快速排查:查看分片是否均衡
4.1 查看各节点分片数量
GET _cat/shards?vGET _cat/nodes?v&h=name,diskUsed,diskAvail4.2 查看分片分配情况
GET _cluster/allocation/explain可以直接看到为什么分片不能分配到某些节点。
五、解决方案 1:开启集群自动分片均衡(最简单)
5.1 启用集群自动平衡
PUT/_cluster/settings{"persistent":{"cluster.routing.rebalance.enable":"all","cluster.routing.allocation.balance.shard":"0.45f","cluster.routing.allocation.balance.index":"0.55f","cluster.routing.allocation.balance.threshold":"1.0f"}}all:允许所有类型分片自动平衡- ES 会自动迁移分片到空闲节点
5.2 提高并发平衡速度(可选)
PUT_cluster/settings{"persistent":{"cluster.routing.allocation.cluster_concurrent_rebalance":5}}六、解决方案 2:解除磁盘水位线限制(最常见原因)
分片无法分配,90% 是因为磁盘满了。
6.1 查看磁盘水位
GET _cat/allocation?v6.2 调整磁盘水位(临时解决)
PUT_cluster/settings{"persistent":{"cluster.routing.allocation.disk.watermark.low":"80%","cluster.routing.allocation.disk.watermark.high":"85%","cluster.routing.allocation.disk.watermark.flood_stage":"90%"}}6.3 解除只读模式
PUT_all/_settings{"index.blocks.read_only_allow_delete":null}七、解决方案 3:取消强制分配规则(awareness 问题)
如果配置过awareness(机架/区域感知),会导致分片无法跨节点分配。
7.1 查看是否有强制分配规则
GET _cluster/settings7.2 清空 awareness 配置
PUT/_cluster/settings{"persistent":{"cluster.routing.allocation.awareness.attributes":null}}八、解决方案 4:手动移动分片(立刻见效)
如果自动平衡不生效,可以手动指定分片移动到目标节点。
8.1 手动移动分片命令
POST/_cluster/reroute{"commands":[{"move":{"index":"test_index","shard":0,"from_node":"node-1","to_node":"node-2"}}]}✅立即生效,负载立刻均衡
九、解决方案 5:解决索引分片倾斜(大分片问题)
有些索引特别大,一个分片占 100GB,导致节点不均衡。
解决方案:
- 拆分大索引(按天/按月拆分)
- 使用rollover index
- 新建索引使用更多分片
- 避免单个分片超过50GB
十、解决方案 6:新加入节点不分配分片?
新节点加入后,默认会自动均衡。
如果没有平衡:
- 检查是否是数据节点
node.data: true - 检查磁盘空间
- 执行手动刷新
POST/_cluster/reroute?retry_failed=true十一、永久根治:最佳实践(从根源避免不均衡)
- 所有节点配置相同(CPU、内存、磁盘、规格一致)
- 单分片大小控制 30~50GB
- 副本数统一
- 关闭不必要的 awareness 规则
- 自动平衡保持开启
- 磁盘水位线合理设置
- 定期查看分片分布
_cat/shards
十二、分片不均衡问题处理流程(总结图)
十三、总结(最核心 5 条)
- 不均衡 90% 是磁盘水位线限制
- 自动平衡默认开启,保持 all 模式
- 手动 move 分片可立即解决问题
- 大分片会导致天然不均衡,必须拆分
- 节点规格一致,才能真正均衡
一句话口诀:
磁盘水位先放开,自动平衡要打开;
手动迁移立刻好,大索引分片要拆开!
🌺The End🌺点点关注,收藏不迷路🌺 |