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
Pingback: ElasticSearch中document文档增删改的原理 – 个人小站-记录编程知识