Elasticsearch路由routing是个什么鬼

什么是路由

routing的默认值是文档id,也可以是自定义值,根据routing计算出分片序号,并指定到该分片上。
索引文档时,文档会被存储到一个主分片下,其分片公式如下:

shard_num = hash(_routing) % num_primary_shards

由于number_of_primary_shards会参与路由的计算,因此主分片数量一经指定就不能改变你,会使routing值失效。

客户端查询请求时节点工作步骤

  1. 请求被集群交给主节点
  2. 主节点接收后,将请求广播到指定索引的每一个shard中
  3. 每个分片执行搜索请求,并将结果返回
  4. 结果在主节点上合并,排序后返回给用户

自定义路由

多数API均接收routing参数,如:get/index/delete/bulk/update/mget
强制使用路由,需要在mapping中指定路由 require:true

"mappings":{
    "_routing" : {
        "required" : true
      }
}

在写入文档时,即可配置路由

// 路由指定为 user1
PUT test-index/_doc/1?routing=user1
{
    "title":"母猪的保养",
    "city" : "漳州市",
    "county" : "红星区",
    "province" : "河北省",
}

// 查询时指定路由为 routing
GET test-index/_doc/1?routing=user1

// 或者在term查询时指定元数据 _routing 为 user1
GET my_index/_search
{
    "query": {
        "terms": {
        "_routing": [ "user1" ] 
         }
    }
}

在查询时,若强制使用路由的话,需要指定routing参数,否则会报错routing_missing_exception

GET test-index/_doc/111?routing=user1


# 返回响应如下
{
  "_index" : "test-index",
  "_type" : "_doc",
  "_id" : "111",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "_routing" : "111",
  "found" : true,
  "_source" : {
    "title" : "母猪的保养",
    "city" : "漳州市",
    "county" : "红星区",
    "province" : "河北省",
 
  }
}

注意
当使用自定义路由时,如果索引时使用不同的_routing,那么在不同分片上可能存在相同的_id。索引上所有分片文档_id 的唯一性由用户自己保证

集群分片不平衡

通过API检查在使用routing路由时,每个分片是否均匀存储数据

GET _cat/shards

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PG9Qh717-1590921037278)(en-resource://database/1697:1)]

如果存在某些分片被指定存储的数据量过大时,可以使用 index.routing_partition_size: 3进行路由指定分片序号计算公式变更:

shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards

在设置index_routing_partitino_size需要注:

  1. index_routing_partition_size 的有效值
    index_routing_partition_size 在(primary_shard_of_number1)这个开区间内,即primary_shard_of_number > index_routing_partition_size > 1
  2. 使用index_routing_partition_size 后存在如下限制
    • 无法创建 join_field 关系映射
    • _routing 必须开启
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜马拉雅以南

奶茶,干杯?!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值