1、document 路由到shard上时什么意思

一个index分为多个shard,一个document必定存在某个shard之上,当我们创建更新document时,es就需要决定document是需要存放到哪个index的shard上。

2、路由算法

shard = hash(route)% number of primary shard,
例如:一个index有3个primary shard,p0 p1 p2
每次增删改查document时,会带过来一个routing number ,默认时这个document 的id(可能手动指定,可能自动生成)
routing = 1
将这个routing 值传入hash 函数,会获取一个值 hash(routing) =21
hash(routing) 和number of primary shard 相除,取余数,(21%3 = 0)就决定这个document 是放置在p0上
hash(routing) % number of primary shard = 21 % 3 = 0
决定一个document 在哪个shard 上,最重要的是routing 值,每次从hash 函数中产出的hash 值一定 是相同的,无论hash 值是几。

3、_id or custom routing value

默认routing 就是_id,
也可以在发送请求时,手动执行1个。
手动指定routing value 是非常有用的。可以保证,某一类document一定被路由到某个shard上

4、primary shard为何不能修改

由路由公式可知
当id=1 时 , hash(1) = 21 21 %3 =0 则数据就放在p0 shard 上
如果primary shard 数量进行修改 改为4 则 id =1 ,hash(1) =21 21 %4 = 1 则数据放置在p1上,就有可能导致无法获取到数据。查看数据丢失问题。