private static int calculateScaledShardId(IndexMetadata indexMetadata, String effectiveRouting, int partitionOffset) {
final int hash = Murmur3HashFunction.hash(effectiveRouting) + partitionOffset;
// we don't use IMD#getNumberOfShards since the index might have been shrunk such that we need to use the size
// of original index to hash documents
return Math.floorMod(hash, indexMetadata.getRoutingNumShards()) / indexMetadata.getRoutingFactor();
}
2 个回复
spoofer
赞同来自: zekaifeng 、mirror6Y
2、如果在某个节点上配置了多个路径来使用多个磁盘,那么落到各个磁盘的shard确实有可能不均匀,这个跟你说的不一样~~你的情况是节点间数据倾斜了。
3、上面说使用随机id和hash算法来确保文档数据均匀分布,但是使用自定义的id或者route ke时可能会造成数据倾斜,可以使用index.routing_partition来控制。其计算逻辑在: cluster/routing/OperationRouting.java中。
4、对于索引的创建是在allocation模块中处理的,这个模块中主要有allocators和deciders两个基础组件,allocators负责寻找最优节点来进行分配分片,而deciders主要决定是否进行分配。创建新的分片时,allocators会找出拥有分片数量最少的节点列表并且按数量升序排序,但是不会考虑每个分片集体的数据量的大小!!!!
God_lockin
赞同来自:
节点使用不均衡可能要考虑是否存在分片个数和节点个数不均衡的问题