ElasticSearch进阶级教程(一):ES分布式增删改查的内部原理

本文深入解析Elasticsearch中数据处理的内部机制,包括路由规则、新建、索引、删除、检索及更新操作的流程,强调了主分片与复制分片在数据一致性中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该篇主要介绍ES中数据处理的内部机制原理。

1.路由

当创建索引以及索引数据到分片中时,ES采用一定的规则来确定如何路由文档到分片:

shard = hash(routing) % number_of_primary_shards

routing可以自定义任意的字符串,一般采用ID值,然后计算routing的hash值,然后除以主分片的数量,得到余数X,X就是将要分配的分片,而X的值范围 0<= X <=number_of_primary_shards - 1

所有的文档API(get、index、delete、bulk、update、mget)都接收一个routing参数,它用来自定义文档到分片的映射。自定义路由值可以确保所有相关文档——例如属于同一个人的文档——被保存在同一分片上。

2.新建、索引、删除

新建、索引、删除都属于“写”,而“写”操作必须要保证在primary shard上执行成功,以便成功复制到replication shard上。
这三种操作的内部处理机制是相似的:
在这里插入图片描述
1.客户端发送请求到node1节点,node1叫做请求节点。
2.通过路由规则得到数据属于主分片0,node1将请求转发到P0所在的node3节点
3.node3收到请求后,在P0执行请求,执行成功后,将请求转发到P0的复制分片所在的节点,也就是R0所在的node1 node2。
4.当node1 node2返回成功信息给node3后,node3返回成功信息给node1,node1返回成功信息给客户端。

还有几个注意点:
1.ES默认是同步返回,也就是请求在主分片上执行成功后,等到复制分片返回也执行成功的消息后,才会返回。
当然可以修改成异步返回,请求在主分片上执行成功后,立即向请求节点返回信息,同时也会转发请求到复制分片,但是我们就无法得到复制分片是否成功的消息了。
2.只有集群内正常分片过半时才可以执行写操作。
规则如下:
int( (primary + number_of_replicas) / 2 ) + 1
比如,定义了number_of_replicas=3,那结果是:((1+3)/ 2) +1 = 3

3.检索

检索即查询,ES可以从主分片或复制分片完成检索请求。
在这里插入图片描述
1.客户端发送get请求到node1
2.node1根据路由规则 得到数据存储在哪个分片上,假设是分片0,而分片0有1个主分片、2个复制分片,node1转发请求到node2。
3.ndoe2执行请求,查询复制分片并返回给客户端。

其中,3个节点上都有分片0,为什么node1转发请求到node2,而不是node3呢?
这其实不重要,每个分片都可以完成检索请求,ES中请求节点会为每一个请求循环分配每一个复制分片,已达到负载均衡。

4.更新

更新包括了读和写。
在这里插入图片描述
1.客户端发送请求到node1
2.node1根据路由规则得到数据在分片0上,转发请求到主分片0所在节点node3
3.node3检索出数据,修改_source字段的json,然后重新建索引
4.node3更新成功后,会同时转发数据的新版本到复制节点,并重建索引。成功后,逐层返回信息。

至于批量处理的原理,基本相似,只是“批量”化了,后面会更新到文章中,大家可以关注下博主,农历2018年最后一篇文章,2019新年快乐!()!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空城雀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值