Elasticsearch总结

分片

1,在创建ES索引时,可以指定ES索引的主分片的数量,一旦索引被创建,索引的主分片数量就不能再被修改。但是各个主分片的副本分片的数量可以被修改。

2,在进行水平扩容(增加节点)的时候,各个分片(包括主分片和副本分片)会按需(比如说各个服务器硬件资源)的被调整到各个节点上。

如下图所示:

Elasticsearch总结_第1张图片

集群中刚开始有两个节点,其中有三个主分片,每个主分片对应一个副本分片。然后我们再添加一个ES节点,如下图所示:

Elasticsearch总结_第2张图片

这时候各个分片就被调整到合适的节点上。

3,副本节点的存在的目的有两个:

     (1)副本分片可以提供读功能(只有主分片可以提供写功能),从而为主分片减小读压力。

     (2)副本节点可以提供高可用,当主分片挂掉,会从副本节点中选出一个节点作为新的主节点。

4,主分片和对应的副本分片在一个节点上没有意义,所以ES不会将主分片和其对应的副本分片放在同一个节点上。

5,一个分片所能保存的最大文档数为Integer.MAX_VALUE-128(同时取决于你的硬件)。所以一个索引能存储的最大文档数量取决于你的主分片的数量。

 

搜索

1,routing

    当存储文档时,ES根据文档的Routing字段将Routing路由到一个分片中,路由的分片编号=hash(routing)%索引的主分片数量,当查询或者更新文档时,也会根据这个规则找到文档对应的分片,然后去这个分片中查询。默认的routing字段是_id,用户也可以自行指定routing字段,比如可以将user_id字段作为routing,这样一个用户的数据就可以放到一个同一个分片中。

2,分布式搜索

   当用户按照某些搜索条件(比如模糊搜索)搜索数据时,请求会发送到集群中的一个节点,这时候这个节点被称为协调节点,集群中的任何一个节点都可以作为协调节点。

   协调节点开辟一个from + size 的队列(from  、size 相当于分页参数中的pageNumber,pageSize),然后将请求转发给各个分片(可以是主分片或者副本分片,但是同一类(数据集一样)的分片中只能有一个分片接到转发的请求),各个分片也分别开辟一个from + size的队列,然后在此分片中搜索文档,将搜索到的文档的routing字段和排序字段(_score)排序之后放到from + size 的队列中,然后返回给协调节点。协调节点收到各个分片返回的队列数据后合并这些数据到自己的from + size队列中,然后再次根据队列中从from 到 from + size之间的文档的routing字段去对应的分片上搜索文档,文档都被取回之后,协调节点将结果返回给客户端。

你可能感兴趣的:(ElasticSearch)