jjzjj

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

Elastic开源社区 2023-07-11 原文

文章目录

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节点角色深层解读,及高可用集群架构角色设计的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  4. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  5. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  8. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  9. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  10. ruby-on-rails - self 在 Rails 模型中的值(value)是什么?为什么没有明显的实例方法可用? - 2

    我的rails3.1.6应用程序中有一个自定义访问器方法,它为一个属性分配一个值,即使该值不存在。my_attr属性是一个序列化的哈希,除非为空白,否则应与给定值合并指定了值,在这种情况下,它将当前值设置为空值。(添加了检查以确保值是它们应该的值,但为简洁起见被删除,因为它们不是我的问题的一部分。)我的setter定义为:defmy_attr=(new_val)cur_val=read_attribute(:my_attr)#storecurrentvalue#makesureweareworkingwithahash,andresetvalueifablankvalueisgiven

随机推荐