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

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


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


相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
负载均衡 关系型数据库 应用服务中间件
高可用系列文章之二 - 传统分层架构技术方案
高可用系列文章之二 - 传统分层架构技术方案
|
3月前
|
机器学习/深度学习 NoSQL Redis
Redis高可用之集群架构(第三部分)
Redis高可用之集群架构(第三部分)
|
1月前
|
Cloud Native 安全 网络安全
构建未来:云原生架构在企业数字化转型中的关键角色网络安全与信息安全:防御前线的关键技术
【2月更文挑战第30天】 随着数字转型的浪潮席卷各行各业,企业正寻求更加灵活、可扩展的解决方案以适应不断变化的市场需求。本文将深入探讨云原生架构如何成为支持这一转型的核心技术,分析其优势和挑战,并提出实施策略。云原生技术的采用不仅加速了开发过程,还提供了自动化运维、弹性伸缩等特性,为企业带来了前所未有的敏捷性和效率。然而,迁移至云原生架构也伴随着技术复杂性增加和安全风险的挑战。文章最后,我们将提供一系列最佳实践,帮助企业在采纳云原生技术的过程中规避风险,实现持续创新。 【2月更文挑战第30天】 在数字化时代,数据成为核心资产,而网络安全与信息安全则是维护这些资产不可或缺的屏障。本文深入探讨了
|
1月前
|
存储 监控 NoSQL
Redis 架构深入:主从复制、哨兵到集群
大家好,我是小康,今天我们来聊下 Redis 的几种架构模式,包括主从复制、哨兵和集群模式。
Redis 架构深入:主从复制、哨兵到集群
|
1月前
|
分布式计算 API 数据处理
Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
【2月更文挑战第15天】Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
60 1
|
2月前
|
缓存 负载均衡 监控
从零开始搭建一个高可用的后端架构
【2月更文挑战第6天】本文将介绍如何从零开始搭建一个高可用的后端架构,包括架构设计、技术选型、部署和监控等方面。通过对各种技术的分析和实践,帮助读者深入理解高可用架构的实现和优化。
|
2月前
|
网络协议 中间件 数据库
Zookeeper学习系列【三】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)
Zookeeper学习系列【三】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)
95 0
|
3月前
|
存储 负载均衡 NoSQL
Redis 高可用篇:你管这叫主从架构数据同步原理?
Redis 高可用篇:你管这叫主从架构数据同步原理?
241 5
|
6天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
6天前
|
消息中间件 监控 持续交付
构建高效微服务架构:后端开发的进阶之路
【4月更文挑战第20天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。微服务架构作为一种新兴的分布式系统设计方式,以其独立部署、易于扩展和维护的特点,成为解决这一问题的关键。本文将深入探讨微服务的核心概念、设计原则以及在后端开发实践中如何构建一个高效的微服务架构。我们将从服务划分、通信机制、数据一致性、服务发现与注册等方面入手,提供一系列实用的策略和建议,帮助开发者优化后端系统的性能和可维护性。