通过该图, 记住下面的几个定义:
集群(cluster):由一个或多个节点组成, 并通过集群名称与其他集群进行区分
es集群一般有几个master
一个
“ • 一个正常es集群中只有一个主节点(Master),主节点负责管理整个集群。
节点(node):单个ElasticSearch实例. 通常一个节点运行在一个隔离的容器或虚拟机中
索引(index):在ES中, 索引是一组文档的集合
分片(shard):因为ES是个分布式的搜索引擎, 所以索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. ES自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 所以用户基本上不用担心分片的处理细节,一个分片默认最大文档数量是20亿.
副本(replica):ES默认为一个索引创建5个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由5个主分片成本, 而每个主分片都相应的有一个copy.
对于分布式搜索引擎来说, 分片及副本的分配将是高可用及快速搜索响应的设计核心.主分片与副本都能处理查询请求, 它们的唯一区别在于只有主分片才能处理索引请求.
在上图示例中, 我们的ElasticSearch集群有两个节点, 并使用了默认的分片配置. ES自动把这5个主分片分配到2个节点上, 而它们分别对应的副本则在完全不同的节点上. 对,就这是分布式的概念.
请记住, 索引的number_of_shards参数只对当前索引有效而不是对整个集群生效.对每个索引来讲, 该参数定义了当前索引的主分片数(而不是集群中所有的主分片数).
什么是分片
Elasticsearch集群允许系统存储的数据量超过单机容量,这是通过shard实现的。在一个索引index中,数据(document)被分片处理(sharding)到多个分片上。也就是说:每个分片都保存了全部数据中的一部分。
一个分片是一个 Lucene 的实例,它本身就是一个完整的搜索引擎。文档被存储到分片内,但应用程序直接与索引而不是与分片进行交互。
什么是副本
说明
为了解决访问压力过大时单机无法处理所有请求的问题,Elasticsearch集群引入了副本策略replica。副本策略对index中的每个分片创建冗余的副本。
副本的作用如下:
- 提高系统容错性
当分片所在的机器宕机时,Elasticsearch可以使用其副本进行恢复,从而避免数据丢失。
- 提高ES查询效率
处理查询时,ES会把副本分片和主分片公平对待,将查询请求负载均衡到副本分片和主分片。
副本分片是越多越好吗?
答案当然是 no ,原因有以下两点:
(1)多个 replica 可以提升搜索操作的吞吐量和性能,但是如果只是在相同节点数目的集群上增加更多的副本分片并不能提高性能,因为每个分片从节点上获得的资源会变少,这个时候你就需要增加更多的硬件资源来提升吞吐量。
(2)更多的副本分片数提高了数据冗余量,保证了数据的完整性,但是根据上边主副分片之间的交互原理可知,分片间的数据同步会占用一定的网络带宽,影响效率,所以索引的分片数和副本数也不是越多越好。
分片原理
分片内部原理
Elasticsearch数据存储在分片中,然后分片分配到集群中的节点上。当集群扩容或缩小,Elasticsearch 将会自动在节点间迁移分片,以使集群保持平衡,当集群中部分节点停止服务,整个集群不受影响。一个分片是一个最小的工作单元,它只是保存了索引中所有数据的一部分。
默认情况下,一个索引被分配 5 个主分片(在Elasticsearch7中默认仅分配一个主分片),可以使用以下命令配置主分片和副本分片个数。
PUT /zijie
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
主分片的数量决定了索引最多能存储多少数据,主分片过小会在索引增长较快的时候,集群无法通过增加节点实现对这个索引的数据扩展;主分片数过大会导致单个shard容量很小,引发一个节点上过多分片,影响性能。
在一个多分片的索引中写入数据时,通过路由来确定具体写入哪一个分片中,大致路由过程如下:
shard = hash(routing) % number_of_primary_shards
outing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数 。这个在 0 到 number_of_primary_shards 之间的余数,就是所寻求的文档所在分片的位置。
如果主分片数量发生变化,那么所有之前路由的值都会无效,文档就无法被检索,所以Elasticsearch不支持扩展主分片,除非重建索引。
副本分片
副本分片是主分片的一个副本,可以防止硬件故障导致的数据丢失,同时可以提供读请求,副本分片设置过多,会降低集群整体写入性能。
每个主分片应该至少有一个副本分片,当主分片异常时,副本可以promote为主节点。主分片和对应的副本分片是不会在同一个节点上的,所以副本分片数的最大值是 n -1(其中 n 为节点数)。
当索引创建完成的时候,主分片的数量就固定了,但是副本分片的数量可以随时调整,根据需求扩大或者缩小规模。
PUT /zijie/_settings
{
"number_of_replicas": 2
}
主分片或者副本分片都可以处理读请求——搜索或文档检索,所以数据的冗余越多,能处理的搜索吞吐量就越大。
节点分类
- Coordinating Node-路由请求
路由请求,所有节点默认都是Coordinating Node,通过将其他类型设置成False,使其变成Coordinating Node节点。 - Data Node-保存数据
节点启动后,默认就是数据节点,可以设置成node.data: false 禁止。通过增加数据节点,可以解决数据水平扩展和解决数据单点的问题。 - Master Node-处理请求
处理创建、删除索引等请求、决定分片分到那个节点,维护并更新Cluster 状态。在每一个节点上都保存了集群的状态信息。但是,只有Master节点上才能修改集群状态的信息,并负责同步给其他节点。