ElasticSearch的document路由原理

ElasticSearch是一个分布式的文档存储系统,读和写操作时都需要去文档所在的节点上去找到对应的文档数据,然后进行操作,但是具体是怎样路由的呢?

温馨提示:本博客已经发布小程序,可在微信小程序中搜索”百变码农”,手机上也能看!

1.什么是ES数据路由?

在一个ElasticSearch集群中,如果有一个以上的节点,当收到创建文档请求,创建完成文档之后,ES会去决定将这个document放在哪一个主分片上,这个决定数据放置何地的过程就叫做ElasticSearch的数据路由。

2.document的路由算法?

 

shard=hash(routing) % number_of_primary_shards

公式的含义:根据路由字段做hash然后和主分片进行取余,最后得到的余数就是document所在的主分片。

例:假设有一个index有三个主分片P0,P1,P2,现在需要新增文档
(1)新增文档时,都会带有一个routing number,这个routing number默认为文档的_id,而这个_id可以自己指定,也可以系统生成。假如指定了_id=1
(2)将这个routing number的值1传入hash函数,然后计算出一个hash值,假如为20,即:hash(routing)=20
(3)将生成的这个hash值和number_of_primary_shards做模运算【这个结果的范围:0~number_of_primary_shards – 1】,得到余数,即:20 % 3 = 2,这个余数2就表示文档所在的shard,及P2

3._id指定还是使用系统生成的?

默认routing规则:默认按照_id完成的
自定义:在发送索引请求的时候,可以手动指定一个routing value,如:

PUT /test_index/test_type/id?routing=test_id
作用:手动指定routing可以保证某一类的document一定会被路由到某一个shard上去,在后续进行应用的负载均衡时可以提升读取性能。

4.primary shard数量不可变原理?

一句话:主要是因为这个数量和document的路由公式有关系,变了之后,历史的文档将会找不到对应的分片。

例:
假如有历史document如下:

_id=1 number_of_primary_shards=3 对应的分片为: P2

 

将primary shards数量改为4之后:

_id=1 number_of_primary_shards=4 对应的分片变为了:P0

 

修改之后document所在分片和修改之前不一样了,再次通过get命令查询id为1的文档数据,就查不到了,因为路由到的分片变了。

至此,ES的数据路由原理相关问题介绍完毕,欢迎转发!如果小程序端代码显示混乱,是因为移动端兼容性导致,可移步至PC端站点查看!

注意:文章属于原创,如果转发请标注文章来源:个人小站【www.jinnianshizhunian.vip

另外提供一些优秀的Java架构师及IT开发视频,书籍资料。无需注册,无需登录即可下载,免费下载地址:https://www.592xuexi.com

1 条思考于 “ElasticSearch的document路由原理

  1. Pingback: ElasticSearch中document文档增删改的原理 – 个人小站-记录编程知识