ES节点角色深层解读,及高可用集群架构角色设计

Posted Elastic开源社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES节点角色深层解读,及高可用集群架构角色设计相关的知识,希望对你有一定的参考价值。

文章目录

1、角色的重要性

角色是ES节点的重要属性,属于Elasticsearch的重要基础概念。

在高可用系统架构中,节点角色发挥着至关重要的作用。如果前期没有对业务系统和技术架构做足准备,没有充分考虑后期的扩展问题,势必会为将来的性能优化留下潜在问题。

ES中存在两个模式:“开发模式”和“生产模式”。

  • 开发模式存在的意义是为了降低ES的上手难度,在开发模式下不会触发启动检查,避免了刚考试学习ES在一些基础环境问题上死磕
  • 生产模式:生产模式存在的意义是尽可能的避免开发者因为对ES体系掌握不全面从而造成在项目初期对业务系统和性能评估的判断失误,从而给项目系统后期在系统架构上没有充分考虑性能扩展和数据结构有优化实践,为后期的性能优化带来阻碍,也为业务系统埋下了隐患。

2、高可用(HA)集群架构设计应遵循以下原则

  • 高可用原则
  • 职责单一原则
  • 易扩展原则
  • 避免资源浪费

3、节点角色划分

3.1 主节点(active master node)

1 主节点 ≠ master节点

集群中只允许有一个活跃的主节点(下面简称主节点),我们称之为 active master 节点。一般为了避免主节点宕机造成集群无主,所以需要配置候选节点以便在主节点宕机时选举出新的主节点。

通常在口语中所说的主节点(或者master节点)指的都是active master节点,而不是严格意义上的配置了master角色的节点,换句话说,配置了master的节点应该叫做候选节点,其不一定是主节点,只有在master选举中胜出的节点,才是主节点,即 active master节点。

2 主节点必须遵循以下分配原则:

  • 避免重负载任务:主节点负责轻量级集群范围的操作,例如创建或删除索引、跟踪哪些节点是集群的一部分以及决定将哪些分片分配给哪些节点。拥有一个稳定的主节点对于集群健康很重要。当选的主节点拥有履行其职责所需的资源,这对于集群的健康非常重要。如果所选的主节点承载了其他任务,比如数据的增删改查等资源密集型人物,会对集群的稳定运行造成较大影响。避免主节点负载过重的最可靠方法是把所有配置了master角色的节点配置为专用主节点(或者称之为专用候选节点),使它们能够专注于管理集群。
  • 负载均衡器:专用master节点仍将充当协调节点,也就是集群中的负载均衡器,将请求从客户端路由到集群中的其他节点,但是不要以负载均衡器的目的而设置候选节点。另外负载均衡节点
  • 任何不是 voting-onlymaster-eligible节点都可以被选举为 active master
  • 主节点必须有一个 path.data目录,其内容在重启后仍然存在,就像数据节点一样,因为这是存储集群元数据的地方。集群元数据描述了如何读取存储在数据节点上的数据,因此如果丢失,则无法读取存储在数据节点上的数据。
  • 高可用性 (HA) 集群需要至少三个候选节点,其中至少两个不是仅投票节点。这样即使其中一个节点发生故障,也可以保证剩下的节点能够选举出一个主节点。

3.2 候选节点(master-eligible nodes)★

候选节点即:master-eligible node,口语中经常也称之为 master node ,严格来说,用中文来解释,应该叫做 候选节点(中文口语中通常也叫 master节点)。默认情况下,候选节点默认也是有效的投票节点,即:配置了master角色的节点,默认具备选举权被选举权,可以参与选举,也可以为其他节点投票。

活跃的主节点一定是配置了master角色的节点,即一定是候选节点,但是候选节点不一定是主节点,一个集群中只可能有一个主节点,而可以同时存在多个候选节点,候选节点的作用主要在于当主节点宕机或发生故障脱离集群时,参与选举成为新的主节点,从而避免集群无主。

任何不是仅投票节点的主合格节点都可以通过主选举过程选举成为主节点**。**

3.3 专用主节点(dedicated master-eligible node)

专用候选节点(专用主节点)一般指仅配置了master角色的节点,其设计初衷为尽可能的让主节点职责单一,避免重负载任务给集群管理带来压力。

1 配置

node.roles: [ master ]

3.4 仅投票节点(voting_only node)

1 什么是仅投票节点

仅投票节点即:仅具备选举权可以为其他候选节点投票,而没有被选举权无法参与竞选的节点。

2 仅投票节点存在的意义

仅投票节点存在的意义就是为了降低资源浪费,注意是降低而无法做到完全避免。因为高可用系统在很多层面都需要以空间换时间,在很多情况下需要我们去权衡利弊,做出最佳选择。

为了避免让主节点执行重负载任务,遵循职责单一原则,我们一般不为其分配 data 角色,从而避免让主节点执行数据的增删改查这种重负载任务。

但是这无形中造成很大的资源浪费,尤其是小规模集群,本身服务器资源就不多,节点就少。以一个五节点的集群为例,如果我们为了遵循职责单一法则,让其中3个master节点都作为专用候选节点(仅配置master角色),那么真正执行增删改查的节点就只有两个了,

一个很好的办法就是“二加一部署”,即两个专用主节点 一个仅投票节点

节点角色是否主节点选举权被选举权备注
node-1master活跃的主节点,同时也是一个负载均衡器
node-2master候选节点,主要作用是当 node-1 故障时替代node-1成为主节点,次要作用是充当负载均衡器
node-3master、voting_only、data不可能X虽然配置了master角色,但是只能投票。其永远不可能成为主节点,因此可为其分配data角色,避免了node-3空置,降低了资源浪费
node-4data不可能无效X主要承担数据的读写任务,不具备有效的选举权和被选举权
node-5data不可能无效X主要承担数据的读写任务,不具备有效的选举权和被选举权

仅投票节点没有被选举权只有选举权,也就是仅投票节点永远无法成为主节点,这样的话我们就可以为其分配data角色让其承担数据负载,这样技能保证选举出的新的主节点是一个专用主节点,又降低的资源浪费。

3 配置仅投票节点

一般情况下,voting_only 和 master 角色是一起配置的,单独配置 voting_only 角色是没有意义的。

配置master角色的节点拥有被选举权选举权,而voting_only 的作用就是阉割掉候选节点的被选举权,让其只能投票,而不能参与选举。所以如果没有master角色,配置voting_only也是没有意义的。

node.roles: [ data, master, voting_only ]

3.5 数据节点(data nodes)

数据节点保存包含已编入索引的文档的分片。数据节点处理数据相关操作,如 CRUD、搜索和聚合。这些操作是 I/O 密集型、内存密集型和 CPU 密集型的。监控这些资源并在它们过载时添加更多数据节点非常重要。

配置数据节点:

node.roles: [ data, xxx ]

3.6 预处理节点(ingest nodes)

预处理节点有点类似于logstash的消息管道,所以也叫ingest pipeline,常用语一些数据写入之前的预处理操作,比如去除空格、split等操作,常和update_by_query、reindex等一起考

配置方法

node.roles: [ ingest, xxx ]

3.7 远程节点(remote_cluster_client client)

具有 remote_cluster_client角色的节点,使其有资格充当远程客户端

当需要通过远程访问节点时,该角色必须配置,比如通过publish_host配置的地址访问服务节点时,该角色必须启用

配置方法

node.roles: [ remote_cluster_client, xxx ]

4 小规模集群推荐高可用配置

专用主节点存在的意义和集群规模是正相关的,也就是说,集群规模越大,配置专用主节点的意义也就越大

对于 3.4.2 中提到的五节点的集群,两个专用主节点的设计,对于当前集群规模来说,仍然是存在很大的浪费的

举个栗子

我们可以把主节点想象成一个班级的班长,五个节点分别代表五个学生,这其中包含班长。

班级就是我们的集群,现在班级需要打扫卫生(重负载任务),班长的职责主要就是指挥其他学生打扫卫生,但是当班级里人数特别少的时候,指挥其他学生这个工作对于班长的负担并不大,因为学生人数本来就很少,这个时候缺的是打扫卫生的人,此时让班长同时也去打扫卫生是更加合理的。

但是如果班级学生很多,比如有几十个上百个甚至更多,此时班长就应该把他的主要职责放在“指挥”这件事上面,自己同时兼顾打扫卫生不仅不会对整个集群负载带来多少好处,反而会大大影响自己指挥整个班级。所以此时他应该这一件事做好,也就是专用主节点了。

节点角色是否主节点选举权被选举权
node-1master、data
node-2master 、data
node-3master 、data
node-4data不可能无效X
node-5data不可能无效X

小规模集群,尤其是节点个数为个位数的集群,分配专用主节点是得不偿失的!专用主节点带来的价值是远远无法弥补其浪费的节点所带来的损失的

ES集群分布式详解

参考技术A ES集群中各节点角色功能简介

本博客根据ES 7.15 ,介绍ES中各节点角色功能。集群节点角色可以在配置文件elasticsearch.yml中通过node.roles配置,如果配置了节点角色,那么该节点将只会执行配置的角色功能;如果不配置,该节点将会执行以下角色功能:

1、如果私自配置节点信息,请确保集群配置有master角色的节点和data角色的节点

2、如果有较大的机器学习(machine learning)任务或转换(transform)任务,建议将候选的主节点(Master-eligible node)与数据节点(data node)、机器学习节点(machine learning node)和转换节点(transforming node)分开是很有必要的。

3、每个节点都默认为协调节点(Coordinating node),如果node.roles设置为[]那么该节点将只执行协调节点功能

ES集群

(1)Cluster:代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。

(2)Shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

(3)replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

(4)Recovery:代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

(5)ES为什么要实现集群:在单台ES服务器节点上,随着业务量的发展索引文件慢慢增多,会影响到效率和内存存储问题等。ES集群,可以将单个索引的分片到多个不同分布式物理机器上存储,从而可以实现高可用、容错性等。ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运行的原因可能是内存也可能是存储。由于每个分片可以有多个副本,通过将副本分配到多个服务器,可以提高查询的负载能力。

(6)es如何解决高并发:ES是一个分布式全文检索框架,隐藏了复杂的处理机制,内部使用 分片机制、集群发现、分片负载均衡请求路由。 Shards 分片:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。Replicas分片:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

5、ES集群脑裂

6、ES集群的分布式存储

·  如新增一个文档流程 文档-->协调节点(hash运算)-->mater-->决策路由到对应主分片如node3节点-->同步副本分片到node2节点上-->返回结构到

协调节点coordinating node-->再传至matster

6、故障转移

·  停掉master

·  cerebro界面集群状态瞬间变黄了

·  这是之前master节点的分片开始转移至剩余的两个节点,集群剩余两个节点,且保证主副分片不在同一个几点

·  重新启动故障节点,集群再次恢复三个节点,分片自动转移过去,但是此时它已不是master节点

以上是关于ES节点角色深层解读,及高可用集群架构角色设计的主要内容,如果未能解决你的问题,请参考以下文章

FastDFS高可用集群架构配置搭建

Web架构之路:MongoDB集群及高可用实践

ES02# Elasticsearch术语与部署架构梳理

Mysql实现高可用架构之MHA

[k8s]elk架构设计-k8s集群里搭建

Hadoop-HA集群