You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch为何未按指定值使用index.routing_partition_size?(自定义路由)

Elasticsearch 8.7.1中routing_partition_size依赖number_of_routing_shards的原因

现象回顾

  • 未手动指定number_of_routing_shards时,即便配置number_of_shards: 128、routing_partition_size: 5,迁移100万带_routing字段的文档后,所有数据仅写入1个分片。
  • 当number_of_routing_shards与number_of_shards设为相同值(均为128)时,每个路由键会均匀分布到5个分片上,符合routing_partition_size的配置预期。
  • 若number_of_routing_shards设为number_of_shards的2倍,每个路由键实际使用的分片数约为routing_partition_size/2。

核心原因分析

结合你提到的自定义路由分片计算公式:

routing_value = hash(_routing) + hash(_id) % routing_partition_size
shard_num = (routing_value % num_routing_shards) / routing_factor

其中**routing_factor = num_routing_shards / number_of_shards**,这是影响分片映射的关键参数,具体逻辑如下:

  1. 未指定number_of_routing_shards的默认行为
    Elasticsearch在未显式配置number_of_routing_shards时,会将其默认值设为1。此时:
  • routing_value % 1的结果永远为0,再除以routing_factor(1/128)后,最终shard_num固定为0,所有文档都会落到同一个分片,这就是仅使用1个分片的原因。
  1. number_of_routing_shards与number_of_shards相等时
    当两者取值相同(均为128),routing_factor = 128 / 128 = 1:
  • routing_value会生成hash(_routing)到hash(_routing)+4共5个不同的值(因为%5的结果范围是0-4)
  • 每个routing_value对128取模后得到不同的余数,除以1后得到5个不同的分片编号,因此每个路由键对应5个分片,完全符合配置预期。
  1. number_of_routing_shards为number_of_shards2倍时
    当num_routing_shards=256、number_of_shards=128,routing_factor=256/128=2:
  • routing_value生成的5个值,对256取模后的余数会被routing_factor=2合并映射,相邻两个余数会指向同一个分片。例如余数0和1→分片0,余数2和3→分片1,余数4→分片2,最终实际使用的分片数约为routing_partition_size/2,与你观察到的现象一致。

本质上,number_of_routing_shards定义了路由哈希的总空间大小,number_of_shards是实际的分片数量,两者的比值决定了哈希值到分片的映射粒度。未指定number_of_routing_shards时,哈希空间被压缩到1,自然无法实现多分片的路由分布。

内容的提问来源于stack exchange,提问作者WorkingMeasurement

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:14:53