elastic elasticsearch 源码解析之选主选举过程

文章详细阐述了Elasticsearch集群中的选主过程,包括角色定义如master、data等,以及选主协议、法定人数机制、避免冲突和脑裂的策略。选举过程中,节点通过ping检测、投票和比较版本来确定临时Master,最终确保集群的稳定性和高可用性。

选主

选举算法

角色定义

这里的选主为什么提角色? 是因为不同角色在选主中起到不同的作用.master的非voting_only节点不但参与投票同时还可以参与竞选, master 的voting_only角色仅投票不参与竞选,其余角色不参与.

支持的角色

master
data
data_content
data_hot
data_warm
data_cold
data_frozen
ingest
ml
remote_cluster_client
transform

如果不设置node.roles 则默认有所有角色, 如果配置了,以配置的为准.

remote_cluster_client跨集群搜索和副本角色

只有master角色才允许voting_only

高可用集群最少需要3个master

data角色如果分层的话,又可以分为

data_content,data_hot,data_warm,data_cold,或data_frozen

不同的层在存储时间,是否压缩,访问性能等进行差异化管理.以达到空间和性能的最优化.

法定人数机制

. 法定人数一般大于半数,主要目的是提高集群健壮性同时要避免脑裂问题.这个数值一般是多少? 一般

  • 奇数投票节点
  • n/2+1个quorum

正常情况quorum等于候选节点+投票节点之和

选举完成之后提交集群状态

选主协议

选主协议应该包含至少4个部分

  • 检测

  • 发起

  • 选主核心逻辑(互斥和一致性)

  • 发布状态

先发起的会成功,如果同时发起则失败.依据是什么? 时间戳?

为了避免选举冲突每个节点发起选举流程都是随机调度.

检测

一般提供两种, 一种检测master, 一种检测node, 一般通过ping,默认1s,连续失败3次判定节点失效.

发起

当检测判定主节点失效则会发起投票

选主核心逻辑

如何避免冲突?

  • 如果发现节点不是自己,则加入. 所以即使同时发起选举也不影响,大家会加入相同的集群,除非发生脑裂分区等异常

如何避免脑裂?

  • 检查自己集群法定人数如果自己集群法定人数(过半),则放弃,重新加入其他集群.这个主要是避免脑裂

选举常见问题

增减节点同步信息未完成发生选举

如果增减节点同步信息未完成发生选举,是否有不一致和集群可用性问题

投票设置

增减节点动态调整

增减节点动态调整投票配置,以增强集群的弹性

这个一般发生增减节点时,通过自动通信机制来实现.

节点数

一般需要奇数

如果不是奇数它会取消一个节点的选举权

奇数某些情况可以提高网络分区可用性问题

比如4个节点集群, 会有3个候选节点, 法定投票人数最少是2,那么一旦分区之后,至少有个一个分区包含2个节点,这时候仍然是可用的

如果每个节点配置的集群期望节点数不一致会导致什么问题?

数据丢失.这种场景一般发生在初次启动时, 已经启动之后因为有节点发现协议,它会慢慢的读取到正确的节点.

对集群来说它自己没法提供一个完全安全的引导启动配置, 即使所有节点的引导启动配置一致,也无法保证集群完全安全的启动.比如这样一个有4台node的集群,他们通过自动化同时启动很可能造成分区.因为4个node,只能有奇数(3)个node有投票权, 那么2个node投票就可以形成集群(如果是通过集群动态调整投票节点的话, 如果你固定配置某个节点没有投票权当然可以避免)

所以quorum是集群启动的必选项.

选主流程

选举临时Master->[本节点是Master?确人orelse加入]->启动NodeFD OR 启动MasterFD

为什么选举临时Master

需要足够票数

临时Master选举流程

ping所有节点->获取所有节点reposne+本节点也加入response->构建两个列表activeMaster和(活跃的Master节点)

正常情况activeMaster只能有一个,这里为什么是列表, 因为可能存在不一致情况.并且构建active master过程中如果节点不具备资格根据配置ignore_non_master_pings会忽略.

另一个要维护的列表是masterCandidates

两个列表构建完成之后, 如果没有active master则从候选master列表选择进行选举

选举临时Master

它的选主逻辑很简单就是从节点找出版本最高的然后最小的节点. 源码对应的方法是electMaster

    public MasterCandidate electMaster(Collection<MasterCandidate> candidates) {
   
   
        assert hasEnoughCandidates(candidates);
        List<MasterCandidate> sortedCandidates = new ArrayList<>(candidates);
        sortedCandidates.sort(MasterCandidate::compare);
        return sortedCandidates.get(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值