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

article/2025/9/13 4:05:25

集群中的每个节点都可以分配多个角色: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://chatgpt.dhexx.cn/article/iGGLcJXH.shtml

相关文章

Quorum简介部署

文章目录 简介账户/密钥管理隐私私有交易管理器 (Private transaction Manager)enclave公有/私有状态 状态验证交易和合约隐私 (Transaction and Contract Privacy)参考 简介 GoQuorum基于geth,在其基础上增加了一些联盟链需要的组件,主要包括以下几点&…

分布式系统理论之Quorum机制

一,Quorum机制介绍 对于数据存储而言,为了提高可用性(Availability),采用了副本备份,比如对于HDFS,默认每块数据存三份。某数据块所在的机器宕机了,就去该数据块副本所在的机器上读…

Hyperledger/Quorum等区块链技术综述

[1]邵奇峰,张召,朱燕超,周傲英.企业级区块链技术综述[J].软件学报,2019,30(09):2571-2592. 摘要:在传统跨机构交易的企业应用中,各个机构都是独立记录己方的交易数据,机构间数据的差异会引起争议,通常需要人工对账或中介机构来解决,因而增加了结算时间和交易费用.区…

基于以太坊项目quorum多机多节点搭建_1

准备工作 环境搭建 我这里使用4台虚拟机来模拟实际网络,在这四台虚拟机里分别搭建了quorum节点。 我这里使用quorum maker 工具来搭建quorum quorum maker 是一个带UI界面的自动化搭建quorum的工具。 quorum maker 安装 git clone https://github.com/synechr…

Quorum白皮书

Quorum白皮书下载

【quorum源码】quorum tessera源码剖析

目录 概述1. 项目结构2. 数据库结构3. 主要流程3.1 服务启动3.2 交易处理3.3 加密交易 4. Restful API4.1 Q2TRestApp4.2 ThirdPartyRestApp4.3 P2PRestApp4.4 EnclaveApplication 5. 一些核心接口App、Enclave相关的类图:com.quorum.tessera.server.TesseraServerc…

Quorum NWR算法

假如我们遇到这样一种事情:你开发实现了一套 AP 型的分布式系统,实现了最终一致性。业务也接入了,运行正常,一起看起来都那么美好。可是,突然有同事说,我们要拉这几个业务的数据做实时分析,希望…

paxosquorum

注: 这里谈论的2PC不同于事务中的2PC,而是专门为了同步和高可用改过的2PC协议 问题: 寻求一种能够保证,在给定多台计算机,并且他们之间由网络相互连通,中间的数据没有拜占庭将军问题(数据不会被伪造)的前…

分布式共识算法随笔 —— 从 Quorum 到 Paxos

分布式共识算法随笔 —— 从 Quorum 到 Paxos 概览: 为什么需要共识算法? 昨夜西风凋碧树,独上高楼,望尽天涯路 复制(Replication) 是一种通过将同一份数据在复制在多个服务器上来提高系统可用性和扩展写吞吐的策略, 。常见的复制策略有主从…

Quorum工作原理

文章目录 1. 概述2. 逻辑架构2.1 Quorum Node2.2 Constellation(星座)2.3 Tessera(特赛拉)2.4 Transaction Manager2.5 Enclave 3. 交易(事务)处理3.1 公开交易3.2 隐私交易3.3 交易处理3.4 隐私交易流程&a…

Quorum共识简析

背景 区块链共识是指多个节点或代理在给定的时间点就区块链状态达成一致的能力。当涉及区块链上分散记录保存和验证的核心功能时,单独依靠信任来确保添加到账本的信息是正确的可能会存在问题。因为没有中央实体来进行仲裁,这种问题在去中心化网络中更为…

Quorum区块链原理及其概念

Quorum概述 Quorum是由摩根大通研发的企业级区块链,用于解决金融或满足于企业需求的行业的需求的平台[56]。Quorum是基于以太坊扩展研发的一种联盟链,适用于对交易效率和吞吐量比较高的企业应用。Quorum作为以太坊的许可实施方案,对以太坊设…

Quorum 机制(分布式系统)

Quorum 机制,是一种分布式系统中常用的,用来保证数据冗余和最终一致性的投票算法,其主要数学思想来源于鸽巢原理。 基于Quorum投票的冗余控制算法 在有冗余数据的分布式存储系统当中,冗余数据对象会在不同的机器之间存放多份拷贝…

xgboost的原理,损失函数,优化,

不经感叹大佬真多,本文转自https://www.jianshu.com/p/7467e616f227 xgboostd多颗树的损失子树cart树,并且叶子节点为分数,不是类别,所有多棵树损失和容易优化,速度快分步提升,先优化一棵树,后面…

XGBoost简介

本文据此对XGBoost的原理做简单的介绍... XGBoost[1]是2014年2月诞生的专注于梯度提升算法的机器学习函数库,此函数库因其优良的学习效果以及高效的训练速度而获得广泛的关注。仅在2015年,在Kaggle[2]竞赛中获胜的29个算法中,有17个使用了XGB…

XGBoost原理及应用

XGBOST原理 XGBoost是使用梯度提升框架实现的高效、灵活、可移植的机器学习库,全称是EXtreme Gradient Boosting. XGBoost算法原理 其实算法的原理就是在一颗决策树的基础上不断地加树,比如在n-1颗树地基础上加一棵树变成n颗树的同时算法的精确率不断…

XGBoost原理与实例分析

这几天一直在研究XGboost的基本原理与代码调参,其原理是在GBDT的基础上进行优化,但也有很多的不同之处;所以自己准备更新两篇博客分为XGBoost原理与实例和XGBoost实战与调参优化来巩固这方面的知识。 一、XGBoost原理分析 在机器学习的问题…

XGBoost原理

前言 之前接触并实现过Adaboost和Random Forest。作为去年开始很火爆的,对结构化数据效果极佳的XGBoost,当然也需要了解一下了。下面将分段叙述XGBoost原理,以及与GBDT的关系等等内容。 ①、XGBoost vs GBDT 说到XGBoost,不得不说…

XGBoost算法原理以及实现

想问:在CSDN如何编辑数学公式呢? XGBoost算法是由GBDT算法演变出来的,GBDT算法在求解最优化问题的时候应用了一阶导技术,而XGBoost则使用损失函数的一阶导和二阶导,不但如此, 还可以自己定义损失函数&…

XGBoost原理介绍------个人理解版

本人第一次写博客,这是篇算法总结的文章,希望能对大家的学习有所帮助。有什么错误之处,还望留言指出,希望能与大家一起进步。 XGBoost全名叫(eXtreme Gradient Boosting)极端梯度提升,经常被用…