持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
导语
Elasticsearch 是一个分布式的开源搜索和分析引擎,目前被广泛使用,本文以一次查询请求为例,解释Elasticsearch的搜索过程。
ES中的查询
这里还是以上一篇博客中使用的这个集群来介绍问题,在图中的ES集群中,共有4个节点,16个shard。其中有着8个primary shard和8个replica shard。一个 分片 shard 是一个底层的 工作单元 ,它仅保存了全部数据中的一部分。
这时,客户端程序Client需要进行一次查询。
首先,客户端程序发送请求到任意一个node,我们把这个node称为coordinate node,即协调节点。
这个协调节点主要用于和客户端程序进行交互,并完成以下功能:
- 路由索引请求
- 聚合搜索结果集
- 分发批量索引请求
接下来,coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在paimary shard以及所有replica中随机选择一个,尽量保证读请求负载均衡
然后,接收到请求的node将进行数据查询,查询完成后返回查询结果的document给coordinate node。
最后,再由coordinate node返回查询结果document给客户端。
增删改操作
相比于ES的查询操作,增删改需要写入数据,因而过程更加复杂。
首先,增删改操作需要将写入的内容发送到对应数据shard的node上,在进行操作时,ES会先完成primary shard的更新。
接着,只有在确保primary shard数据更新后,这些更新的数据才会被同步到对应的replica shard上。数据写入的过程中,为了保证数据不丢失,最好保证至少一个副本分片写入成功以后才返回客户端成功。 这样,一次完整的增删改操作才算是完成。
总结来说,查询请求既可以由primary shard处理也可以由replica shard处理。而增删改的请求只能由primary shard处理。