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

该篇主要介绍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上。
这三种操作的内部处理机制是相似的:
ElasticSearch进阶级教程(一):ES分布式增删改查的内部原理
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可以从主分片或复制分片完成检索请求。
ElasticSearch进阶级教程(一):ES分布式增删改查的内部原理
1.客户端发送get请求到node1
2.node1根据路由规则 得到数据存储在哪个分片上,假设是分片0,而分片0有1个主分片、2个复制分片,node1转发请求到node2。
3.ndoe2执行请求,查询复制分片并返回给客户端。

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

4.更新

更新包括了读和写。
ElasticSearch进阶级教程(一):ES分布式增删改查的内部原理
1.客户端发送请求到node1
2.node1根据路由规则得到数据在分片0上,转发请求到主分片0所在节点node3
3.node3检索出数据,修改_source字段的json,然后重新建索引
4.node3更新成功后,会同时转发数据的新版本到复制节点,并重建索引。成功后,逐层返回信息。

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