Elasticsearch版本:6.0
一、Elasticsearch计算分片位置的公式
shard = hash(routing) % number_of_primary_shards
解释:
routing
是一个可变值,默认是文档的_id
,也可以设置成一个自定义的值。routing
通过 hash 函数生成一个数字,然后这个数字再除以number_of_primary_shards
(主分片的数量)后得到 余数 。这个分布在0
到number_of_primary_shards-1
之间的余数,就是我们所寻求的文档所在分片的位置。所以说主分片的数量不会改变,,因为如果改变了,文档就找不到了。
二、主分片和副本分片的交互
我们可以发送请求到集群中的任一节点。 每个节点都有能力处理任意请求。 每个节点都知道集群中任一文档位置,所以可以直接将请求转发到需要的节点上。
TIP: 当发送请求的时候,为了扩展负载,更好的做法是轮询集群中所有的节点。
新建、索引和删除 请求都是 写 操作, 必须在主分片上面完成之后才能被复制到相关的副本分片。
在处理读取请求时,协调结点在每次请求的时候都会通过轮询所有的副本分片来达到负载均衡。
局部更新文档
update
API 结合了先前说明的读取和写入模式 。
查询阶段
查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索并构建一个匹配文档的 _优先队列_。
- 客户端发送一个 search 请求到 Node 3 , Node 3 会创建一个大小为 from + size 的空优先队列。
- Node 3 将查询请求转发到索引的每个主分片或副本分片中。每个分片在本地执行查询并添加结果到大小为 from + size 的本地有序优先队列中。
- 每个分片返回各自优先队列中所有文档的 ID 和排序值给协调节点,也就是 Node 3 ,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。
分片返回一个轻量级的结果列表到协调节点,它仅包含文档 ID 集合以及任何排序需要用到的值,例如 _score
。
取回阶段
取回阶段,查询阶段标识哪些文档满足 搜索请求,但是我们仍然需要取回这些文档。
- 协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。
- 每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。
- 一旦所有的文档都被取回了,协调节点返回结果给客户端。