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()函数:小数向…...
P6入门:在EPS下创建项目(P6Professional)
引言 在 Primavera P6 中,一旦创建了企业项目结构EPS,就可以开始向该结构添加项目。项目是一组活动和数据,它们构成了创建产品或服务的计划。项目有开始日期和结束日期,可以包括活动、资源、工作分解结构、组织分解结构、日历、关…...
Linux安装及管理应用和账号和权限管理 讲解
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
【JDK1.8 新特性】Stream API
1. 前言 Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是 Stream API。Stream API ( java.util.stream) 把真正的函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为Stream API可以极大提供Java程序员的生产力&…...
Springboot Maven打包跳过测试的五种方式总结 -Dmaven.test.skip=true
使用Maven打包的时候,可能会因为单元测试打包失败,这时候就需要跳过单元测试。也为了加快打包速度,也需要跳过单元测试。 Maven跳过单元测试五种方法。 在正式环境中运行Springboot应用,需要先打包,然后使用java -ja…...
静态链接和动态链接的区别
链接即为编译(包含预编译,编译和汇编过程)完成之后的过程,此过程又分为静态链接和动态链接两种方式。 1、静态链接 静态链接就是在生成可执行文件的时候(链接阶段),把所有需要的函数的二进制代…...
MATLAB学习笔记1
MATLAB学习笔记1 - 向量和矩阵 Matlab的数组可以是行向量,列向量,矩阵形式等 1.利用[ ]创建数组 例:包含7和9的一个数组,使用空格或,为行 x [7 9]//x是一个1*2的矩阵 y[7,9]//y是一个1*2的矩阵例:包含7和…...
Gorm -- 查询记录
文章目录查询单条记录通过结构体查询对应表指定表并将查询一条记录结果放至字典中按照主键查询查询多行记录按照主键查询使用结构体查询指定表名查询并放至字典列表中指定查询字段查询条件Where 条件(、like、in)通过结构体或字典设置查询条件或非排序Li…...
「Python 基础」错误、调试与测试
文章目录1. 错误处理2. debugassertloggingpdbIDE3. unittest编写运行setUp 与 tearDown4. doctest1. 错误处理 try:# 可能有异常的代码块r 10/int(2) except ValueError as e:# 有异常时执行,捕获指定类型及其子类型的错误print(ValueError, e) except ZeroDivis…...
17万字 JUC 看这一篇就够了(一) (精华)
JUC 今天我们来进入到 Java并发编程 JUC 框架的学习 ,内容比较多,但希望我们都能静下心来,耐心的看完这篇文章 文章目录JUC进程概述对比线程创建线程ThreadRunnableCallable线程方法APIrun startsleep yieldjoininterrupt打断线程打断 park终…...
C++右值引用/移动语义
在此之前,我们所用的引用,其实都是左值引用。 int a 10; int& ra a; 下面我们来重新认识一下引用: 而何为左值?左值引用其实是什么?请往下看~ 左值是一个表示数据的表达式(如变量名或解引用的指针)ÿ…...
wordpress 日期/杭州seo代理公司
Sed简介sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲…...
做内部优惠券网站/西安关键词优化排名
数组的类型Bash提供了2种数组类型,索引(indexed)和关联(associative)数组。索引数组(下标从0开始)较常用,下面是其的使用。数组的创建通过shell内建命令declare显式创建,…...
付网站建设费用计入科目/网页设计与制作案例教程
修改完成后的varnish配置:http://songknight.blog.51cto.com/2599480/693359 varnish VCL流程图:http://songknight.blog.51cto.com/2599480/692239 在各大论坛和网站上有很多varnish的文章,某也搜索了不少,不过可惜的是目前大部分…...
专业做学校网站的公司/磁力搜索器 磁力猫
原文 Rasa NLU 是一个开源的、可本地部署并配套有语料标注工具(rasa-nlu-trainer)的自然语言理解框架。其本身是只支持英文和德文,中文因为其特殊性需要加入特定的 tokenizer 作为整个流水线的一部分,Rasa_NLU_Chi 作为 Rasa_NLU…...
教师在哪些网站可以做兼职/线上推广有哪些平台效果好
前言 程序员这个行业,日新月异,技术体系更新速度快,新技术新框架层出不穷,所有的技术都像是一个无底洞,当你学得越多就会发现不懂的越多,不懂的越多,需要学习的就更多。 因此,一旦…...
做iframe跳转怎么自适应网站/seo全网推广营销软件
1、QRCode QRCode最简单的使用 import qrcode qrcode.make("第一个二维码").get_image().show() 根据文本生成二维码并且直接显示。 根据文本或URL生成二维码,保存到指定目录并显示二维码 import qrcode import os text input("请输入文本或者URL:&…...