ElasticSearch(7.2.2)-es⽂档的路由原理

mac2025-07-18  6

简介:当新增⼀个⽂档时,这个⽂档会存放在那个分⽚中呢?

前⾔
当新增⼀个⽂档的时候,⽂档会被存储到⼀个主分⽚中。 Elasticsearch 如何知道⼀个⽂档应该存放到哪个分⽚中呢?当我们创建⽂档时,它如何决定这个⽂档应当被存储在分⽚ 1 还是分⽚ 2 中呢?
路由算法
⾸先这肯定不会是随机的,否则将来要获取⽂档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下⾯这个公式决定的: 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" } } 第3集 剖析elastic search的乐观锁 简介: 剖析elastic search的乐观锁 锁的简单分类 悲观锁 顾名思义, 就是很悲观, 每次去拿数据的时候都认为别⼈ 会修改, 所以每次在拿数据的时候 都会上锁, 这样别⼈ 想拿这个数据就会阻塞, 直到它拿到锁。 传统的关系型数据库⾥ 边就⽤ 到了很多这种锁机制,⽐ 如⾏ 锁, 表锁等, 读锁, 写锁等, 都是在做操作之前先上锁。 }, "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" } } ] ] }
最新回复(0)