集群级分片分配
rebalance 用于将集群中的分片进行均衡,保持各个节点的分片数量大致相等,当集群扩容或缩容,掉一个节点的时候,这过程会自动完成。这可能发生在初始恢复、副本分配、重新平衡或添加或删除节点时。
场景介绍
3个节点的es 集群,node1,node2,node3。node3由于故障,重启了节点。重启后node3上的一个副部分片由于某种原因没有恢复上线,集群的健康之是yellow。此时用es 的/_cat/allocation 命令查看发现,node3上的分片个数远少于其他两个节点。
问题分析
node3节点故障下线的时候,原本分布在node3上的分片会逐步迁移到node1,node2上。node3启动后,还没迁移出去的分片会在node3上恢复。由于之前有部分分片已经迁移出去,就导致了node3的分片数量少于其他节点。但是es不是有rebalance机制吗?node3恢复之后,在rebalance机制的均衡下个节点的分片数应该达到均衡才对呀?
其实rebalance的均衡也是要在满足一定的条件后才能触发的,这是由如下配置控制的
cluster.routing.allocation.allow_rebalance
Specify when shard rebalancing is allowed:
always - Always allow rebalancing.
indices_primaries_active - Only when all primaries in the cluster are allocated.
indices_all_active - (default) Only when all shards (primaries and replicas) in the cluster are allocated.
always
- 始终允许重新平衡。indices_primaries_active
- 仅当集群中的所有主节点都已分配时。indices_all_active
-(默认)仅当集群中的所有分片(主分片和副本)都被分配时。
node3上线后有一个分片故障无法上线,不符合indices_all_active的条件,所以es此时没有触发rebalance,节点间的分片也不会均衡。
一般重启单个节点后,原本在这个节点上的分片会逐步迁移到其他节点上,这时候就会出现分片不均衡的情况,重启完后会发现有分片正在迁移的动作.
btc 4 r RELOCATING 32366191 33gb 172.16.0.182 CPzHbZ8 -> 172.16.0.184 CkY3li-hTjyxL1PLSm6XYA CkY3li-
etc 1 p RELOCATING 14730896 5.7gb 172.16.0.185 H-au10H -> 172.16.0.183 J5bMIh3xRZCI8sf6ERNiPw J5bMIh3
问题解决
将故障分片所在索引的副本数设置为0,这样es的分片就都上线了,rebalance就会触发。等分片达到均衡后再将索引的副本数设置回来。
如何设置副本数可以参考ES的基本操作: https://blog.youkuaiyun.com/qqqq0199181/article/details/81269798
原文链接:https://blog.youkuaiyun.com/qqqq0199181/article/details/102604256