主要知识点
1、document路由到shard的理解及原理
2、路由算法:shard = hash(routing) % number_of_primary_shards
3、routing值(_id or custom routing value)
4、primary shard创建之后不可变的原因
一、document路由到shard理解及原理
在es中,一个index会被分片,一个index中存在很多document,这个document存放在不同的shardK ,而一个document只能存在于一个primary shard中,这样,当客户端创建一个document并存入es时,es内部就需要决定这个document存于那一个primary shard,这就是es中的document 路由分发。
二、路由算法
shard = hash(routing) % number_of_primary_shards
举个例子,一个index有3个primary shard,分别是P0,P1,P2
1、每次增删改查一个document的时候,都会带过来一个routing number,默认就是这个document的_id(可能是手动指定,也可能是自动生成)。假设routing = _id,_id=1
2、es会将这个routing值,传入一个hash函数中,产出一个routing值的hash值,假设hash(routing) = 21
3、然后将hash函数产出的值对这个index的primary shard的数量求余数,21 % 3 = 0
这样,这次这个document就放在P0上。
决定一个document在哪个shard上,最重要的一个值就是routing值,默认是_id,也可以手动指定,相同的routing值,产出的hash值一定是相同的。
三、routing值(_id or custom routing value)
默认的routing就是_id,也可以在发送请求的时候,手动指定一个routing value,比如说:put /index/type/id?routing=user_id,这样就手动指定以user_id作为routing值。
手动指定routing value是很有用的,可以保证某一类document一定被路由到一个shard上去,那么在后续进行应用级别的负载均衡,以及提升批量读取的性能的时候是很有帮助的。
四、primary shard创建之后不可变的原因
假设,原index在创建时指定primary shard的值为3,分别是P0,P1,P2,某一个docment的routing值是1,该routing的hash值为21,这样这个document就存放于P0这个primary shard 中。如果primary shard 的值可以改变,假设变为4,要查询这个document时,根据shard = hash(routing) % number_of_primary_shard(21%4=1),就会到p1这个shard去查找,当然查找不到,这就间接导致了数据丢失。