写点什么

Elasticsearch document routing 数据路由

用户头像
escray
关注
发布于: 2021 年 01 月 31 日
Elasticsearch document routing 数据路由

文字内容整理自 B 站中华石杉的 Elasticsearch 顶尖高手系列课程核心知识篇

Document 路由到 Shard 是什么意思?


我们知道,一个 index 的数据会被分为多片,每片都在一个 Shard 中,所以说,一个 Document 只能存在于一个 Shard 中。


提示一下,一个 Document 其实类似于数据库表中的一行。


当客户端创建 Document 的时候,Elasticsearch 此时就需要决定,这个 Document 放在这个 index 的哪个 Shard 上。这个过程被称为数据路由 Document Routing。


determining which shard a given document should be stored in or has been stored is, is called routing.

路由算法:


shard = hash(routing) % number_of_primary_shards


举个例子,一个 index 有 3 个 Primary Shard,P0,P1,P2


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


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


为什么是 21 ?


然后将 hash 函数产出的值对这个 index 的 Primary Shard 的数量求余数,21 % 3 = 0 就决定了,这个 Document 就放在 P0 上。



决定一个 Document 在哪个 Shard 上,最重要的一个值就是 routing 值,默认是 _id,也可以手动指定,相同的 routing 值,每次过来,从 hash 函数中,产出的 hash 值一定是相同的


无论 hash 值是几,无论是什么数字,对 number_of_primary_shards 求余数,结果一定是在 0 ~ number_of_primary_shards-1 之间这个范围内的。对于上面的例子,结果就只有 0、1、2 三种可能。

_id or custom routing value


默认的 routing 就是 _id,也可以在发送请求的时候,手动指定一个 routing value,比如说


put /index/type/id?routing=user_id
复制代码


手动指定 routing value 是很有用的,可以保证说,某一类 Document 一定被路由到一个 Shard 上去,那么在后续进行应用级别的负载均衡,以及提升批量读取的性能的时候,是很有帮助的

primary shard 数量不可变的谜底


这也从另一个角度说明了为什么 Primary Shard 一旦 index 建立,就不允许修改(会找不到数据,简介导致数据丢失),但是 Replica Shard 可以随时修改。


其实,另一个方面,一个索引的路由也是不能在中途改变的,原因和上面一样,会找不到之前的数据。


参考资料


understanding sharding in elasticsearch


发布于: 2021 年 01 月 31 日阅读数: 27
用户头像

escray

关注

Let's Go 2017.11.19 加入

在学 Elasticsearch 的项目经理

评论

发布
暂无评论
Elasticsearch document routing 数据路由