一、Cluster:集群

Elastic Search可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,Elastic Search可以运行在许多互相合作的服务器上,这些服务器形成的整体称为集群。

二、Node:节点

形成集群的每个服务器称为节点

三、Shard:分片

分片,类似于数据库的分库操作。当文档的数量过大时,由于内存的限制、磁盘处理能力不足、无法够快的响应客户端的请求等,一个节点已经不能满足需求了,这种情况下,数据可以分为较小的分片,每个分片放到不同的节点上(说句废话,一般情况下,一个节点上应该只有一个主分片,但是一个节点上不仅只有一个分片,还可以有很多副本)。
当索引一个文档的时候,文档会被存储到一个主分片中。 那么,Elasticsearch是 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片1还是分片2中呢?
首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下面这个公式决定的:
shard = hash(routing) % number_of_primary_shards
routing是一个可变值,默认是文档的_id,也可以设置成一个自定义的值。routing通过 hash 函数生成一个数字,然后这个数字再除以number_of_primary_shards(主分片的数量)后得到余数。这个分布在0到number_of_primary_shards-1之间的余数,就是我们所寻求的文档所在分片的位置。
这就解释了为什么我们要在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。
当查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。
分片与路由
因为分布式索引会进行类似于数据库分库分表的操作。假如现在有2个分片,有4篇文档id分别为:1,2,3,4,根据取模算法,将他们分配到对应的表中。Elastic Search采取的也是这种思路。数据1和3 对2取模,等于 1,那么就会把1,3两个数据放到第2个分片上。2和4对2取模,等于0,那么就会把2,4两条数据放到第1个分片上。
查询数据的时候同理,查询1,3,根据取模运算结果,会去第2个分片上查找。查询2,4,会去第1个分片上查找。这个时候,修改了分片数目,取模运算结果与之前不一致,比如改成3个分片,那么查询3的时候,取模运算结果变成了0,就会去第1个分片上查找3,那么肯定查不到的。因此分片数不能随意修改,一旦修改,需要全部重建索引。

四、Replica:副本

Elastic Search中可以有许多相同的分片,其中之一可以进行编辑操作(如增删改),这种特殊的分片称为主分片。而副本是一个分片的精确复制,每个分片可以有零个或多个副本。
当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。