预备知识
主分片(primary shard):写操作只在主分片进行,如新建、索引、删除操作。负责对操作进行校验和将数据同步到副分片。
副分片(replica shard):负责查询操作(也可在主分片进行)
现象
查看集群分片分布发现,所有分片的数量在集群各节点之间是分配均匀的,但是主副分片在集群上的分配并不是均匀地。如下图所示。
| 节点1 | 1主 | 3主 | 4主 | |
|---|---|---|---|---|
| 节点2 | 2副 | 3副 | 0副 | |
| 节点3 | 0主 | 1副 | 2主 | 4副 |
集群配置,5个主分片,每个主分片有一个副本分片
结论
可以考虑手动设置分片位置,会使得节点负载更均衡。
因为主分片相对于副分片还负责数据的插入、更新、索引等操作,所以,如果一个更新请求操作起来负载很重,那么此时主分片相对于副本分片会消耗更多的资源,从而引起主分片所在节点相对于其他副本分片所在的节点负载更重。其他情况下,拥有主分片较多的节点相对于较少的节点区别不大。
手动移动分片位置后,如下图所示
| 节点 | 分片分布 | |||
|---|---|---|---|---|
| 节点1 | 0副 | 3主 | 1主 | |
| 节点2 | 2副 | 3副 | 4主 | |
| 节点3 | 0主 | 1副 | 2主 | 4副 |
其他有趣的讨论
目前ES的集群自动分配策略只是保证所有节点的总数在集群内均匀分布,而不区分主副节点。
关于官方为什么不支持主节点,副节点自动均衡分布的问题,官方成员回复做主分片自动均衡不太容易实现,目前github有相关的featrue,参考相关讨论链接