1 什么是document路由?
一个index会被分为多个片(shard),一个document只能放在一个shard中。
在客户端创建document的时候,ES就要决定document放在index的哪个shard上。这个过程称为document routing,即数据路由。
2 路由算法
shard = hash(routing) % number_of_primary_shards
每次增删改查一个document的时候,都会带过来一个routing number,默认就是这个document的_id(可能是手动指定,也可能是自动生成)routing = _id。
将这个routing值,传入一个hash函数中,产出一个routing值的hash值,假设hash(routing) = 21,然后将hash函数产出的值对这个index的primary shard的数量求余数(假设primary shard的数量为3):21 % 3 = 0,就决定了,这个document就放在P0上。
相同的routing值,每次过来,从hash函数中产出的hash值一定是相同的。
3 手动指定routing
默认的routing就是_id
也可以在发送请求的时候,手动指定一个routing value,比如说put /index/type/id?routing=user_id
手动指定routing value是很有用的,这样可以让某一类document一定被路由到一个shard上去,那么在后续进行应用级别的负载均衡,以及提升批量读取的性能的时候,是很有帮助的。
4 primary shard数量不可变的原因
primary shard的数量确定之后不可更改,这是因为,数据路由时确定了shard的数值,后续primary shard数量变了的话,再根据路由算法确定shard的位置,得到的shard数值就会与原先不一致,导致找不到数据。