一个分片问题
来源:4-3 ES集群及节点角色规划实践(三)

qq_踏彐寻梅_03702812
2022-08-04
看了一下我们现在用的索引,发现某个primary shard数据量10g, 5个replica其中一个replica是14g,另外4个是10g,为什么会出现这种情况老师能帮忙解释一下吗
1回答
-
少林码僧
2022-08-04
根据您的描述,分片大小不一致的问题我们分几种情况来看(前提是同一个索引的主副本分片):
1. 同一个索引的各个主分片大小不一致
2.同一个索引的主分片,其副本跟它对应的主分片的大小不一致
首先通过GET _cat/shards/index_name?v 查看各个分片上的文档数量(查看docs列的数据就是文档数量)
如果分片上的文档数量差距比较大,说明数据在这两个分片上的分布不均衡.
什么决定了数据最终落到哪个分片呢?课程中有讲到,ES是通过路由策略来将数据路由到不同分片的,所以需要看业务中有没有使用routing策略,使用的routing策略是否能确保hash算法均匀,如果没有使用自定义routing,ES默认使用doc的_id作为routing,如果使用了自定义id,也需要考虑自定义的id的hash是否能够均匀。
所以针对上面第一种情况,同一个索引的各个主分片大小不一致的情况,如果是各个分片上的文档数量差距比较大,一般是自定义id或者routing导致hash失衡造成的。即使文档数量差距不大也可能导致分片大小不一致的情况,这种情况和上面第二种情况原因相同,我们具体针对第二种情况来讨论。
针对第二种情况,同一个索引的主分片,其副本跟它对应的主分片的大小不一致的情况,主要跟segment段的数量有关,我们知道ES索引的文档数据是不支持动态更新和删除的,更新的本质是将原文档标记为删除状态,再新建新的文档,所以文档更新和删除后空间并不会立马释放,需要根据ES段合并策略来回收空间。同一个分片的主副本并不是同时进行段合并调度的,所以同一个分片的主副本和两个文档数量大小相似的主分片,他们的的segment段的数量都可能不同,segment段的数量不同,执行merge的次数也不一样,分片大小不同也就很好理解了。
查询指定索引的各个分片中段的数量可以使用下面的api:GET _cat/segments?v&index=index-name
当然,其他一些极端情况也可能造成各分片文档数差不多但大小不同,不过一般情况下可以忽略
比如文档中一些长文本大小不同,比如博客文章中,某些分片上只有几个字的博客比较多,而另一些分片上长文章的博客比较多也可能造成分片存储上失衡132022-08-08
相似问题