Elasticsearch:理解 Master,Elections,Quorum 及 脑裂
集群中的每个节点都可以分配多个角色:master、data、ingest、ml(机器学习)等。 我们在当前讨论中感兴趣的角色之一是 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 ]
相关文章:

Elasticsearch:理解 Master,Elections,Quorum 及 脑裂
集群中的每个节点都可以分配多个角色:master、data、ingest、ml(机器学习)等。 我们在当前讨论中感兴趣的角色之一是 master 角色。 在 Elasticsearch 的配置中,我们可以配置一个节点为 master 节点。master 角色的分配表明该节点…...

【致敬女神】HTMLReport应用之Unittest+Python+Selenium+HTMLReport项目自动化测试实战
HTMLReport应用之UnittestPythonSeleniumHTMLReport项目自动化测试实战1 测试框架结构2 技术栈3 实现思路3.1 使用HtmlTestRunner3.2 使用HTMLReport4 TestRunner参数说明4.1 源码4.2 参数说明5 框架代码5.1 common/reportOut.py5.2 common/sendMain.py5.3 report5.3.1 xxx.htm…...

JAVA的16 个实用代码优化小技巧
一、类成员与方法的可见性最小化 举例:如果是一个private的方法,想删除就删除。 如果一个public的service方法,或者一个public的成员变量,删除一下,不得思考很多。 二、使用位移操作替代乘除法 计算机是使用二进制…...

并发编程的三大挑战之原子性及其解决方案
目录 一、原子性问题 1、带来原子性问题的原因 2、如何解决线程切换带来的原子问题 2.1、使用synchronized关键字来保证 2.2、使用CAS来保证原子性 2.3、使用lock锁来保证 一、原子性问题 1、带来原子性问题的原因 线程切换是带来原子的根本原因,java的并发程…...
QML动画(其他的动画)
PauseAnimation (暂停动画) 为动画提供暂停 Rectangle{id:rect1width: 100;height: 100;x:100;y:100color: "lightBlue"SequentialAnimation{running: trueColorAnimation {target: rect1;property: "color";…...

Spark 配置项
Spark 配置项硬件资源类CPU内存堆外内User Memory/Spark 可用内存Execution/Storage Memory磁盘ShuffleSpark SQLJoin 策略调整自动分区合并自动倾斜处理配置项分为 3 类: 硬件资源类 : 与 CPU、内存、磁盘有关的配置项Shuffle 类 : Shuffle 计算过程的配置项Spark SQL : Spar…...
掌握Vue3模板语法,助你轻松实现高效Web开发
Vue3作为前端开发中的一种主流框架,为我们提供了多种灵活的方式来处理模板语法。除了基础的模板语法,Vue3还提供了一些高级的语法,可以让我们更好地处理组件、响应式数据和UI逻辑等。在这篇博客中,我们将介绍Vue3中的一些高级模板…...

Jmeter+Ant+Jenkins接口自动化测试平台搭建
平台简介一个完整的接口自动化测试平台需要支持接口的自动执行,自动生成测试报告,以及持续集成。Jmeter支持接口的测试,Ant支持自动构建,而Jenkins支持持续集成,所以三者组合在一起可以构成一个功能完善的接口自动化测…...
ncnn部署(CMakelists.txt)
1. NCNN 环境安装 参考博客: 基于ncnn的yolov5模型部署 1. 1 protobuf编译 打开VS2013/VS2019的X64命令行(注意不是cmd),我这里以V32013环境进行编译 > cd <protobuf-root-dir> > mkdir build-vs2013 > cd build-vs2013 > cmake -G"NMake Makefil…...

SQL分库分表
什么是分库分表? 分库分表是两种操作,一种是分库,一种是分表。 分库分表又分为垂直拆分和水平拆分两种。 (1)分库:将原来存放在单个数据库中的数据,拆分到多个数据库中存放。 (2&…...

大数据分析案例-基于逻辑回归算法构建微博评论情感分类模型
🤵♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…...
0105深度优先搜索算法非递归2种实现对比-无向图-数据结构和算法(Java)
1 两种非递归实现 在前面我们解决无向图的单点通性和单点路径问题时,都用到了深度优先搜索算法。深度优先搜索算法可以用递归和非递归两种方式。这里讨论非递归实现。 无向图结构使用邻接表实现。 第一种非递归方法(推荐),代码如…...

传统手工数据采集耗时耗力?Smartbi数据填报实现数据收集分析自动化
企业在日常经营管理过程中,往往需要收集很多内外部的信息,清洗整理后再进行存储、分析、呈现、决策支持等各种作业,如何高效收集结构化数据是企业管理者经常要面对的问题。传统手工的数据采集方式不仅耗费了大量人力时间成本,还容…...
《Spring源码深度分析》第5章 Bean的加载
目录标题前言一、Bean加载入口与源码分析1、Bean加载的入口2、Bean加载源码二、FactoryBean的使用三、缓存中获取单例bean(待补充)前言 经过前面的分析,我们终于结束了对XML 配置文件的解析,接下来将会面临更大的挑战,就是对 bean 加载的探索…...
华为OD机试真题Java实现【求最大数字】真题+解题思路+代码(20222023)
求最大数字 题目 给定一个由纯数字组成以字符串表示的数值,现要求字符串中的每个数字最多只能出现2次,超过的需要进行删除;删除某个重复的数字后,其它数字相对位置保持不变。 如34533,数字3重复超过2次,需要删除其中一个3,删除第一个3后获得最大数值4533 请返回经过删…...

Java——异常机制
前言 随着对java的不断深入学习,在对语法以及编程思想有了一定的了解之后,在编程的过程中有可能会因为用户的输入不正确或者逻辑错误而出现异常或者错误,因此如何去捕捉与避免不应该出现的异常或者错误就变得十分重要。本文就介绍了java的异…...

【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(下)
系列文章目录 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(上) 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(中) 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate…...

ESP32设备驱动-土壤湿度传感器驱动
土壤湿度传感器驱动 1、土壤湿度传感器介绍 土壤湿度传感器由两个探头组成,用于测量水的体积含量。 两个探头让电流通过土壤,然后得到电阻值来测量水分值。 当有更多的水时,土壤会传导更多的电,这意味着电阻会更小。 因此,水分含量会更高。 干燥的土壤导电性差,所以当…...

公网远程连接MongoDB数据库【内网穿透】
文章目录1. 安装数据库2. 内网穿透2.1 创建隧道映射2.2 测试随机公网地址远程连接3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供…...

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

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...