【ElasticSearch】文档路由的原理

ElasticSearch集群环境下新增文档如何确认该文档被分配到哪个分片中?

 

路由算法:

  ⾸先这肯定不会是随机的,否则将来要获取⽂档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下⾯这个公式决定的:

  shard = hash(routing) % number_of_primary_shards

  routing 是⼀个可变值,默认是⽂档的 _id ,也可以设置成⼀个⾃定义的值。 routing通过 hash 函数⽣成⼀个数字,然后这个数字再除以 number_of_primary_shards (主分

⽚的数量)后得到 余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的⽂档所在分⽚的位置。
  
  这就解释了为什么我们要在创建索引的时候就确定好主分⽚的数量 并且永远不会改变这个数量:
  因为如果数量变化了,那么所有之前路由的值都会⽆效,⽂档也再也找不到了。
 
  新增⼀个⽂档(指定id)
PUT /nba/_doc/1
{
 "name": "哈登",
 "team_name": "⽕箭",
 "position": "得分后卫",
 "play_year": "10",
 "jerse_no": "13"
}

  查看⽂档在哪个分⽚上

GET /nba/_search_shards?routing=1
{
 "nodes" : {
 "V1JO7QXLSX-yeVI82WkgtA" : {
 "name" : "node-1",
 "ephemeral_id" : "_d96PgOSTnKo6nrJVqIYpw",
 "transport_address" : "192.168.1.101:9300",
 "attributes" : {
 "ml.machine_memory" : "8589934592",
 "xpack.installed" : "true",
 "ml.max_open_jobs" : "20"
 }
 },
 "z65Hwe_RR_efA4yj3n8sHQ" : {
 "name" : "node-3",
 "ephemeral_id" : "MOE_Ne7ZRyaKRHFSWJZWpA",
 "transport_address" : "192.168.1.101:9500",
 "attributes" : {
 "ml.machine_memory" : "8589934592",
 "ml.max_open_jobs" : "20",
 "xpack.installed" : "true"
 }
 }
 },
 "indices" : {
 "nba" : { }
 },
 "shards" : [
 [
 {
 "state" : "STARTED",
 "primary" : true,
 "node" : "V1JO7QXLSX-yeVI82WkgtA",
 "relocating_node" : null,
 "shard" : 2,
 "index" : "nba",
 "allocation_id" : {
 "id" : "leX_k6McShyMoM1eNQJXOA"
 }
 },
 {
 "state" : "STARTED",
 "primary" : false,
 "node" : "z65Hwe_RR_efA4yj3n8sHQ",
 "relocating_node" : null,
 "shard" : 2,
 "index" : "nba",
 "allocation_id" : {
 "id" : "6sUSANMuSGKLgcIpBa4yYg"
 }
 }
 ]
 ]
}

 

posted @ 2021-01-26 10:30  听风是雨  阅读(101)  评论(0编辑  收藏  举报
/* 看板娘 */