es 搜索的原理问题

Elasticsearch | 作者 talon | 发布于2019年08月09日 | 阅读数:204

最近在看 es 权威指南,在分布式搜索那一部分看到有这么一段话(查询的 query then fetch):

 ——————————————————————————————————————————————————
当一个搜索请求被发送到一个节点Node,这个节点就变成了协调节点。这个节点的工作是向
所有相关的分片广播搜索请求并且把它们的响应整合成一个全局的有序结果集。这个结果集
会被返回给客户端。

第一步是向索引里的每个节点的分片副本广播请求。就像document的 GET 请求一样,搜索请
求可以被每个分片的原本或任意副本处理。这就是更多的副本(当结合更多的硬件时)如何
提高搜索的吞吐量的方法。对于后续请求,协调节点会轮询所有的分片副本以分摊负载。


每一个分片在本地执行查询和建立一个长度为 from+size 的有序优先队列——这个长度意味
着它自己的结果数量就足够满足全局的请求要求。分片返回一个轻量级的结果列表给协调节
点。只包含documentID值和排序需要用到的值,例如 _score 。
协调节点将这些分片级的结果合并到自己的有序优先队列里。这个就代表了最终的全局有序
结果集。到这里,查询阶段结束。
整个过程类似于归并排序算法,先分组排序再归并到一起,对于这种分布式场景非常适用。
 ——————————————————————————————————————————————————————
加粗部分没有太明白,我有两种理解:
1. 如果有一个索引有3分副本,5个 shard,也就是 pramiary + replica 总共有 (1+3)*5 = 20 个分片。然后一个GET 请求会同时向这20个分片广播吗,这20个分片会同时处理这个请求?
2. 还是说是:因为一个分片有3个副本,所以只有1个主分片+3个副本分片 中只有1个会接收到请求,总共有 5个shard(可能是主分片,也可能是副本分片)收到请求。然后下次有新的请求过来会根据负载均衡的原则,会选择一个分片的其他副本上处理请求?
 
我不知道上面2种哪种才是es的工作方式,个人更倾向于第2种,因为同一个分片(主1副3)数据是一致的,没必要同时处理一个请求。还请各位指教。谢谢。
已邀请:

bellengao - 博客: https://www.jianshu.com/u/e0088e3e2127

赞同来自:

GET和SEARCH操作是不一样的,GET请求会根据docId确定出doc在哪个分片上,只会向对应分片的主分片或副本分片发起一次请求,所以只有一个shard收到请求;SEARCH操作,会向所有shard的主分片或者副本分片发请求,如果索引有5个shard,那么就有5个shard收到请求,收到请求的shard可能是主分片也可能是副本分片。

laoyang360 - [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

中间没有明确说明的是路由环节。
1、接收客户都安请求的节点具备路由节点(协调节点)的角色;
2、协调节点将客户端的请求发送到哪个分片是:需要借助内容路由算法计算出分片id的。
3、而分片对应节点需要结合:请求参数中指定的优先级和集群状态确定的。

要回复问题请先登录注册