Elasticsearch:理解 Master,Elections,Quorum 及 脑裂

news2025/7/19 4:54:21

集群中的每个节点都可以分配多个角色:masterdataingestml(机器学习)等。 我们在当前讨论中感兴趣的角色之一是 master 角色。 在 Elasticsearch 的配置中,我们可以配置一个节点为 master 节点。master 角色的分配表明该节点是具有当选主节点资格的节点(master-eligible)。 在讨论主节点资格之前,让我们了解主节点的重要性。更多关于节点描述的内容,可以参考之前的文章 “Elasticsearch 中的一些重要概念: cluster, node, index, document, shards 及 replica”。

Master node

Master node,也即主节点。主节点负责集群范围内的操作,例如为节点分配分片、索引管理和其他轻量级操作。 主节点是一个关键组件,负责保持集群健康。 它努力保持集群和节点社区的状态完好无损。 一个集群只有一个主节点,其唯一的工作就是负责集群的操作 —— 仅此而已。

Master-eligible 节点是一组被标记为 master 角色的节点。 为节点分配 master 节点角色并不意味着该节点成为集群主节点,但如果选出的主节点崩溃,则离成为集群主节点更近了一步。 请记住,如果有机会,其他符合主节点资格的节点也有可能成为主节点,因此它们也离成为主节点更近了一步。

你可能会问,符合主节点资格的节点有什么用! 每个符合主节点资格的节点都会行使投票权来选择集群的主节点。 在幕后,当我们第一次启动节点以形成集群或主节点死亡时,首先采取的步骤之一就是选举一个主节点。 让我们在下一节中了解有关主集群选举的所有信息。

主节点选举

主集群是通过选举民主选出的! 当集群第一次形成或当前主节点死亡时,将举行一次选举以选择一个主节点。 作为选举的一部分,所有符合主节点资格的节点都会选择其中一个作为主节点。 然后,如果 master 由于某种原因崩溃,任何符合 master 资格的节点都会要求进行选举。 成员投票选举新的主人。一旦被选中,主节点将接管集群管理的职责。

并非所有的日子都是快乐的日子; — 在一些无法控制的情况下,主节点可能被干掉。 因此,符合主节点资格的节点会不断与主节点通信以确保其处于活动状态,并通知主节点自己的状态。 当 master 节点不在后,节点们迫在眉睫的工作就是发起选举,选出新的 master。

有一些属性,例如 cluster.election.duration 和 cluster.election.initial_timeout,可以帮助我们配置选举频率以及在符合主节点资格的节点要求选举之前等待多长时间。 例如,initial_timeout 属性是符合主节点资格的节点在请求选举之前等待的时间。 默认情况下,此值设置为 500 毫秒。 例如,假设符合主节点条件的节点 A 在 500 毫秒内没有从主节点接收到心跳。 然后它要求进行选举,因为它认为 master 已经不在了。

除了选举主节点之外,符合主节点资格的节点还必须协同工作才能使集群运行顺利进行。 然而,虽然 master 是集群的 “”,但它需要得到其他符合 master 资格的节点的支持和支持。 master 的作用是维护和管理集群状态,所以让我们在下一节中看一下。

集群状态 - Cluster state

集群状态包含有关分片、副本、模式、映射、字段信息等的所有元数据。 这些详细信息作为全局状态存储在集群中,并写入每个节点。 主节点是唯一可以提交集群状态的节点。 它有更多的责任来维护集群的最新信息。 主节点分阶段提交集群数据(类似于分布式架构中的两阶段提交事务):

  • 主节点计算集群变化并将它们发布到各个节点,然后等待确认。
  • 每个节点都会收到集群更新,但它们尚未应用于其本地状态。 收到后,他们将确认发回给主节点。
  • 当从符合主节点资格的节点接收到一定数量的确认时(主节点不需要等待来自每个节点的确认,只需等待符合主节点资格的节点),主节点提交更改以更新集群状态。
  • 主节点在成功提交集群更改后,向各个节点广播最终消息,指示它们提交先前收到的集群更改。
  • 各个节点提交集群更新。

cluster.publish.timeout 属性设置了一个时间限制(默认为 30 秒),以成功提交每批集群更新。 此期间从向节点发布第一个集群更新消息的时间开始,直到提交集群状态。 如果全局集群更新在默认的 30 秒内成功提交,则 master 会等到这段时间过去,然后再开始下一批集群更新。 然而,故事并没有就此结束!

如果在给定的 30 秒内未提交集群更新,则可能是主节点已死亡。 在这种情况下,当前的 master 拒绝集群更新并辞去 master 的职位。 新主节点的选举因此开始。

尽管全局集群更新已提交,但 master 仍在等待那些尚未发回确认的节点。 除非收到确认,否则 master 无法将此集群更新标记为成功。 在这种情况下,master 会跟踪这些节点并等待 90 秒的宽限期,该宽限期由 cluster.follower_lag.timeout 属性设置,默认为 90 秒。 如果节点在这 90 秒的宽限期内没有响应,它们将被标记为故障节点,结果,主节点将它们从集群中移除。

正如你现在可能已经了解到的那样,Elasticsearch 的幕后发生了很多事情。 集群更新频繁发生,而 master 有大量责任维护移动部件。 在前面的集群更新场景中,master 在继续提交状态之前等待来自一组称为 quorum 的 master-eligible 节点的确认,而不是等待其余节点。 quorum 是 master 有效运行所需的最少 master 节点数,这将在下面来详细描述。

Quorum - 法定节点数

主节点负责维护和管理集群。 但是,它会咨询符合主节点资格的法定节点数以进行集群状态更新和主节点选举。 法定节点数是主节点有效操作集群所需的主节点合格节点的精心选择的子集。 这是主节点将咨询的大多数节点,以便在集群状态和其他问题上达成共识。

虽然我们正在了解法定节点数,但好消息是我们(用户/管理员)不必担心如何形成法定节点数。 集群根据可用的符合主节点资格的节点自动制定法定节点数。 给定一组符合主节点条件的节点,有一个简单的公式可以找到所需的最小主节点数(法定节点数):

Minimum number of master nodes = (number of master-eligible nodes / 2) + 1

假设我们有一个 20 节点的集群,我们有 8 个节点被分配为符合主节点条件的节点(节点角色设置为主节点)。 通过应用这个公式,我们的集群创建了一个具有(精心选择的)5 个符合主节点资格的节点 (8 / 2 + 1 = 5) 的法定节点数。 这个想法是我们需要至少 5 个合格的主节点来形成一个法定节点数。

经验法则是,任何节点集群中推荐的最少 master-eligible 成员为三个。 至少设置三个主节点是管理集群的必经之路。 在集群法定人数中拥有至少三个节点的另一大优势是这可以缓解裂脑问题,这将在下一节中讨论。

脑裂 - Split brain

Elasticsearch 的集群健康状况严重依赖于多种因素:网络、内存、JVM 垃圾回收等。 在某些情况下,集群会被分成两个集群:一个集群中有几个节点,另一个集群中有一些节点。 例如,请看下图:

带有一个主节点的两个节点的集群

正如你在图中看到的,我们有一个集群,其中有两个符合主节点资格的节点,但其中一个(节点 A)被选为主节点。 只要我们处于快乐的一天状态,集群就是健康的,主节点尽职尽责。

让我们在工作中有所作为。 假设节点 B 由于硬件问题而停止运行。 因为节点 A 是主节点,它会继续使用手头的一个节点为查询提供服务:我们实际上拥有一个单节点集群,同时我们等待另一个节点 B 启动以加入集群。

这就是它可能变得棘手的地方。 在启动时,假设网络连接严重,使得节点 B 无法看到节点 A 的存在。这导致节点 B 承担主角色,因为它认为集群中没有主节点,即使节点 A 作为主节点存在. 这会导致如下图所示的裂脑情况:

脑裂集群:一个具有两个活动主节点的集群

因为两个节点由于网络问题没有通信,所以它们仍然愉快地工作,成为集群的一部分。 因为两个节点都是主节点,所以任何到达其中任何一个的请求都只能由接收节点执行。 然而,一个节点中的数据对另一个节点不可见,这会导致数据差异。 这就是为什么我们应该在一个集群中至少有三个符合主节点资格的节点的原因之一。 拥有三个节点可以完全避免脑裂集群的形成。

专用主节点

因为可以为一个节点分配多个角色,所以看到一个包含 20 个节点的集群,其中所有节点都执行所有角色并不奇怪。 创建这种类型的集群架构没有坏处; 但是,这种类型的设置仅适用于轻量级集群需求。 正如我们已经了解到的,主节点是集群中的关键节点,它使集群保持运转。

如果预计数据将以指数增长速度被索引或搜索,则包括主节点在内的每个节点都会受到性能影响。 一个性能缓慢的主节点是在自找麻烦:集群运行速度变慢甚至停滞。 因此,始终建议创建一台专用机器来托管主节点。 拥有专用的主节点可以让集群平稳运行并减少数据丢失和应用程序停机时间。

如前所述,经验法则是至少在一个集群中拥有三个专用的符合主节点条件的节点。 形成集群时,请确保将 node.roles 设置为 master,如以下代码片段所示,以创建节点专用的主节点。 这样,专用主角色就不会超载来执行数据或摄取相关操作,而只是全职管理集群。

node.roles: [ master ]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/395808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人机协同“全能秘书”丨 AI+金融“降本增效”全靠它!

近年来,我国金融科技蓬勃发展,以人工智能为主要代表的创新技术,为各大金融企业提供了更智能化的金融服务模式,科技与金融业务的深度融合,为金融行业注入新的发展动力。相比较传统人工客服,智能客服以算法为…

函数模板(template关键字的应用)

注释:本文主要介绍了函数模板的由来以及用法,还有关键字template。 我们感到时间的延续像一条我们无法逆行的小溪。 ——柏格森 文章目录一、语言的定式二、函数模板2.1 函数模板格式2.2 模板函数的实例化2.2.1隐式实例化/显式实例化2.3 模板参数的匹配…

SQL注入——floor报错注入

目录 一,涉及到的函数 rand() floor() concat_ws() as别名,group by分组 count() 报错原理 一,涉及到的函数 rand()函数:随机返回0~1间的小数 floor()函数:小数向…

C/C++开发,无可避免的多线程(篇六).线程池封装类

一、线程池概念 线程池是一种多线程处理方式,它包含一个线程工作队列和一个任务队列。当有任务需要处理时,线程池会从线程工作队列中取出一个空闲线程来处理任务,如果线程工作队列中没有空闲线程,则任务会被放入任务队列中等待处理…

M1、M2芯片Mac安装虚拟机

目录前言一、安装二、网络设置三、连接SSH客户端前言 一直想着给M1 Mac上安装虚拟机,奈何PD收费,找的破解也不稳定,安装上镜像就起不来。 注:挂长久的分享莫名其妙被封,需要安装包请私信我。 一、安装 虚拟机选择&a…

一次惨痛教训让我写了个Windows定期备份文件脚本

目录前言正文前言 说实话在写这篇文章的时候,咸鱼不禁又想起了那件男默女泪的往事 我喜欢做笔记,我觉得好记性不如烂笔头,所以在我的学习生涯以及职业生涯阶段,我用过四款笔记应用——Onenote、语雀、印象笔记、Typora 其中我个…

Nacos配置中心,分组配置参考,以及python、go、bash客户端连接获取

Nacos使用说明 nacos官方网站 https://nacos.io/zh-cn/docs/v2/what-is-nacos.html 1、基本配置说明 nacosIP地址:http://xxxxx:8848/nacos/ 服务管理端登录账号:nacos XXX Java最小配置,其他客户端可参考,配置可对应到第三章…

【动态规划】

动态规划1引言题目509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯小结53. 最大子数组和结语引言 蓝桥杯快开始了啊&#xff0c;自从报名后还没认真学过算法有(>﹏<)′&#xff0c;临时抱一下佛脚&#xff0c;一起学学算法。 题目 509. 斐波那契数 斐波那契数 &am…

你来看看这几行代码到底创建了几个字符串?

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

Java中对象的finalization机制

本篇文章我们详细介绍Java中对象的finalization机制&#xff0c;以及怎么使用finalize()方法&#xff0c;将即将被回收的对象&#xff0c;拉回来。1、finalization机制Java语言提供了对象终止&#xff08;finalization&#xff09;机制来允许开发人员提供对象被销毁之前的自定义…

Spring的Async注解线程池扩展方案

目录- [Spring的Async注解线程池扩展方案]- [目录]- [1. 扩展目的]- [2. 扩展实现]- [2.1 扩展Async注解的执行拦截器AnnotationAsyncExecutionInterceptor]- [2.2 扩展Async注解的Spring代理顾问AsyncAnnotationAdvisor]- [2.3 扩展Async注解的 Spring Bean 后置处理器AsyncAn…

Linux安装及管理应用和账号和权限管理 讲解

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

不系统学习NodeJs之进程线程

不系统学习NodeJs之进程线程 从工作期间断断续续接触Node&#xff0c;从去年的3月份、10月份、又到今年的3月份&#xff0c;终于又决定要再仔细看看Node的相关。 不系统学习的各种时期笔记&参考记录于此。 参考&#xff1a; Node.js 中文网 一篇文章构建你的 NodeJS 知识…

BIC高颜值在线绘图新增颜色集合本地存储功能

用户可以把自己选择的颜色集合存储在自己浏览器本地(鼠标滑过颜色名字可以显示具体代表哪些颜色和色号)&#xff0c;供同一个工具的多套数据使用或者在不同工具之间共享颜色集合的使用&#xff0c;统一多张图一致的配色。最新访问地址&#xff1a;https://www.bic.ac.cn/BIC/ &…

JavaWeb—CSS

目录 &#xff11;、CSS 技术 &#xff11;.&#xff11;、CSS 技术介绍 &#xff11;.&#xff12;、CSS 语法规则&#xff1a; &#xff11;.&#xff13;、CSS 和 HTML 的结合方式 &#xff11;.&#xff13;.&#xff11;、第一种&#xff1a; &#xff11;.&#xf…

Iterator 迭代器

迭代器 为了兼顾 各个子类的特性 实现无差别可以 访问数据 举个例子 遍历数组和遍历链表 两者代码的写法不一样 为了实现 使用相同的代码 对不同的数据容器进行遍历 就出现了 迭代器 for语句的执行和 interator的实现息息相关 目的 访问各个类型 集合 的数据&#xff…

Spring源码解析-Spring 循环依赖

Spring源码解析简图&#xff1a; Spring 如何解决循环依赖&#xff0c;⽹上的资料很多&#xff0c;但是感觉写得好的极少&#xff0c;特别是源码解读⽅⾯&#xff0c;我就⾃⼰单独出⼀ 篇&#xff0c;这篇⽂章绝对肝&#xff01; 文章目录&#xff1a; 一. 基础知识 1.1 什么…

记录--elementui源码学习之仿写一个el-button

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本篇文章记录仿写一个el-button组件细节&#xff0c;从而有助于大家更好理解饿了么ui对应组件具体工作细节。本文是elementui源码学习仿写系列的又一篇文章&#xff0c;后续空闲了会不断更新并仿写其他…

Unity iOS 无服务器做一个排行榜 GameCenter

排行榜需求解决方案一(嗯目前只有一)UnityEngine.SocialPlatformsiOS GameCenterAppStoreConnect配置Unity 调用(如果使用GameCenter系统的面板&#xff0c;看到这里就可以了&#xff09;坑(需要获取数据做自定义面板的看这里)iOS代码Unity 代码吐槽需求 需求&#xff1a;接入…

某某游戏加密坐标分析

这个游戏里面坐标有很多种存放方式。 例如明文存放的DOUBLE&#xff0c;加密的各种类型。 我们不知道哪一个对于我们是有用的,哪一些只是辅助UI或则掉到LUA虚拟机坑里的数据。 那就根据作用大小来决定,一一尝试吧。 最好去找修改之后有效果的地址&#xff0c;当然只是本地&…