Elasticsearch集群的概念

集群的作用

高可用

高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可 用性是99%。

负载均衡

将流量均衡的分布在不同的节点上,每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现平衡。

高性能

将流量分发到不同机器,充分利用多机器多CPU,从串行计算到并行计算提高系统性能。

Elasticsearch集群的组成

集群(Cluster)

一个Elasticsearch 集群由一个或多个节点(Node)组成,每个集群都有一个共同的集群名称作为标识。

节点(Node)

一个Elasticsearch实例即一个Node,虽然一台机器可以有多个实例,但正常使用下每个实例应该会部署在不同的机器上。默认情况下一个节点会加入一个名称为“elasticsearch”的集群。此时不修改配置的情况下,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群。

分片

单台机器无法存储大量数据,Elasticsearch会将一个索引中的数据切分到多个分片中。这样就可以提高Elasticsearch的横向扩展能力,提供数据的存储数量。让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。

主分片(shard)和复制分片(replica)

每个分片又主分片和复制分片组成。复制分片是主分片的拷贝。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。主分片建立索引时候需要进行设置且不能修改,但是一个索引的复制分片的数量可以动态地调整,而索引创建时候默认为10个shard,5个主分片以及5个复制分片。

关于Elasticsearch的主分片

  • 一个索引包含多个分片,在多个服务器集群部署的情况下,一个索引的数据会存在多个不同的服务器上。
  • 每一条数据(document)只会存在于某一个主分片以及其所属的复制分片中。
  • 复制分片除了负责主分片的容错保证,还承担了读请求处理的负载任务。
  • 在索引创建的时候主分片的数量就被固定下来了,后续无法进行修改。而主分片对应复制分片数是可以在后续调整的。
  • 一个索引默认创建十个分片,其中5个主分片、5个复制分片。
  • 一个复制分片不能和自己的主分片放在一个服务器上,所以要实现高可用,正常至少需要2台服务。

Elasticsearch集群的节点

多个节点组成了Elasticsearch集群,而Elasticsearch对于节点通过不同的配置可以使节点实现不同的业务场景。关于节点的配置主要有两个属性

node.master:false
node.data:false

node.master属性控制此节点是否可以成为主节点。

node.data属性控制此节点是否可以存储数据。

主节点

主节点主要负责集群的协调工作,配置成为主节点的节点并不一定是主节点,此配置主要是表明此节点可以竞选成为主节点。

主节点的作用主要是下面内容:

1、 索引的创建和删除;
2、 跟踪集群中节点信息;
3、 负责为节点分配分片;

主节点的配置主要用下面两种:

node.master:true
node.data:true

这种配置下的主节点只存在协调作用,无法存储数据

node.master:true
node.data:false

数据节点

数据节点只负责集群数据的存储,不参与主节点的竞争也不负责集群协调工作。

当节点为数据节点的时候,其负责:

1、 存储索引数据;
2、 负责对文档进行增删查改以及聚合操作;

数据节点的配置是下面内容

node.master:false
node.data:true

客户端节点

客户端节点,既无法存储数据也不能竞选为主节点,其主要负责的内容是下面:

1、 处理路由请求;
2、 处理搜索;
3、 分发索引;

部落节点

部落节点主要实现了跨集群的操作。部落节点需要配置的多个集群的信息,可以在多个集群中实现读写操作,但是当集群名称重复的时候,部落节点只能连接其中一个节点,

部落节点参数配置

tribe:
	{
   
     连接集群的别名A}: 
		cluster.name: {
   
     集群A}
	{
   
     连接集群的别名B}: 
		cluster.name: {
   
     集群B}

摄取节点(Ingest节点)

摄取节点更类似一种数据过滤器。在批量请求或索引操作之前,Ingest节点拦截请求,并对文档进行处理。常见的用途是解析字符串中的日期,字符串和整数的转换。

器配置需要下面内容

node.ingest:true

集群环境下写数据的过程

1、 客户端选择一个协调节点(coordinatingnode)发送请求;
2、 此节点对docment进行路由,然后将请求转发给对应的node;
3、 接收请求的节点对应的主分片进行处理请求然后将数据同步到对应的复制分片,完成数据处理后,返回请求给客户端;

其主要流程

graph TD
数据交互-->客户端节点
客户端节点-->|路由|目标节点
目标节点-->主分片
主分片-->|处理请求完毕后同步数据|复制分片

防止集群出现“脑裂”

7.X以下的版本

默认情况下discovery.zen.minimum_master_nodes属性被设置为1。此属性定义了为了形成集群,必须要有多少个具备主节点资格并相互连接的节点的最小数量。

在使用默认数据的情况下

当我们使用三个节点的集群时候,当有一个节点和另外两个节点无法互通的时候,此集群将会形成两个独立的集群运行。这个时候可能出现数据的错误或者丢失。

这个时候设置discovery.zen.minimum_master_nodes属性为2的后。当存在一个节点无法互通的时候,另外两个节点依然会保持集群运行。但另外一个节点因为不满足两个主节点的限制则不会成为一个新的集群。当断开连接的节点恢复通讯后,会重新加入集群中。

所以为了防止出现上面的情况,elasticsearch集群中主节点的数量需要大于等于3。并且discovery.zen.minimum_master_nodes属性的值应该为:主节点数量/2 + 1;

7.X版本

在最新的版本中elasticsearch已经移除了discovery.zen.minimum_master_nodes参数。Elasticsearch 自己选择可以形成仲裁的节点。从7.0开始,如果想要启动一个全新的集群,并且集群在多台主机上都有节点,就必须指定该集群在第一次选举中应该使用的一组符合主节点条件的节点作为选举配置。也就是集群引导,已经加入集群的节点将选举配置存储在它们的数据文件夹中,并在重新启动后重用这些配置,而正在加入现有集群的新节点可以从集群的当前主节点接收这些信息。

可以通过为 cluster.initial_master_nodes参数设置一系列符合主节点条件的节点的主机名或 IP 地址来引导启动集群。

关于节点的内容可以查看:https://www.elastic.co/guide/en/elasticsearch/reference/6.6/modules-node.html