29.es路由原理

主要知识点

1document路由到shard的理解及原理

2、路由算法:shard = hash(routing) % number_of_primary_shards

3routing值(_id or custom routing value

4primary 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

   

举个例子,一个index3primary shard,分别是P0P1P2

1、每次增删改查一个document的时候,都会带过来一个routing number,默认就是这个document_id(可能是手动指定,也可能是自动生成)。假设routing = _id_id=1

2、es会将这个routing值,传入一个hash函数中,产出一个routing值的hash值,假设hash(routing) = 21

3、然后将hash函数产出的值对这个indexprimary 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,分别是P0P1P2,某一个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去查找,当然查找不到,这就间接导致了数据丢失。

   

posted @ 2018-02-24 09:59  outback123  阅读(1152)  评论(0编辑  收藏  举报