【分布式理论12】事务协调者高可用:分布式选举算法

文章目录

    • 一、分布式系统中事务协调的问题
    • 二、分布式选举算法
      • 1. Bully算法
      • 2. Raft算法
      • 3. ZAB算法
    • 三、小结与比较

一、分布式系统中事务协调的问题

在分布式系统中,常常有多个节点(应用)共同处理不同的事务和资源。前文

【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法
【分布式理论10】分布式协同:分布式互斥算法最佳实现:分布式锁的原理与实现
【分布式理论11】分布式协同之分布式事务

中介绍了分布式互斥与分布式事务两类常见问题。分布式互斥问题解决了多个应用访问同一资源的问题,而分布式事务问题则解决了多个应用访问不同资源时的一致性问题。解决这些问题的过程中,事务协调者的角色非常重要。事务协调者作为资源访问的中介,能协调不同节点之间的操作。然而,事务协调者本身的可用性成为了一个不可忽视的问题。

为了增强事务协调者的可用性,通常会使用集群模式,通过主从互备机制来保障事务协调者的持续在线。主节点负责信息的更新,所有从节点负责信息的读取。若主节点出现故障,系统会通过选举机制从从节点中选举出新的主节点,保证系统的正常运行。

 

二、分布式选举算法

分布式选举问题的核心在于从一组节点中选举出一个领导者节点(主节点)。这个过程通常称为“领导者选举”。在分布式系统中,确保系统中只有一个领导者是至关重要的,因为只有领导者能够进行协调和决策。下面将介绍几种常见的分布式选举算法。

1. Bully算法

Bully算法的核心思想是从存活的节点中选举出ID最大(或最小)的节点作为主节点。Bully算法适用于含主从节点的分布式系统,主要通过三种消息类型进行节点间的通信:

  • Election消息:发起选举请求。
  • Alive消息:对Election消息的响应。
  • Victory消息:竞选成功的主节点发送给其他节点,声明自己为主节点。

在Bully算法中,选举过程分为以下几个步骤:
5. 每个节点检查自己的ID是否为存活节点中最大的,如果是,发送Victory消息宣布自己为主节点。
6. 否则,向比自己ID大的节点发送Election消息,并等待响应。
7. 如果在超时内没有收到Alive消息,节点认为自己是主节点(会导致脑裂???),发送Victory消息。
8. 如果收到比自己ID大的节点的Alive消息,则放弃竞选,等待Victory消息。

这个算法之所以叫"Bully"(欺负人),是因为ID最大的节点通过“欺负”其他节点、强行让其接受自己为主节点,最终赢得选举。

举个例子:假设有4个节点,ID分别为1、2、3、4。如果节点4突然掉线,节点1发现自己没有收到其他节点的心跳包,就会发起选举。节点2和节点3的ID都比节点1大,所以节点1会向它们发送选举消息。节点2和节点3会发出“活跃消息”,让节点1知道它们不可能成为主节点。最终,节点3会成为新的主节点。

 

2. Raft算法

Raft算法是一种投票选举算法,遵循“少数服从多数”的原则,规定在一个选举周期内获得票数最多的节点为主节点。Raft算法将节点分为三种角色:

  • Leader:领导者节点,负责管理和协调其他节点。
  • Candidate:候选者节点,具有被选举为领导者的资格。
  • Follower:跟随者节点,接受领导者的指令,不发起选举。

Raft算法的选举过程包括以下步骤:

  1. 节点角色转换:在Raft中,所有节点在没有领导者的情况下,都会是“跟随者”(Follower)。如果在一定时间内(超时)没有收到领导者的心跳包,跟随者会自愿变为“候选者”(Candidate),开始发起选举。
  2. 选举过程:当一个节点变为候选者时,它会向其他所有节点发起选举请求。如果一个节点的选举请求得到了大多数节点的投票支持,它就会成为领导者(Leader)。此时,其他节点会变回“跟随者”角色,开始接受领导者的指挥。
  3. 选举的胜者:如果有多个候选者同时发起选举,系统会出现“选举超时”,导致选举周期重复进行,直到某一个候选者最终获得超过半数节点的投票支持,成为领导者。
  4. 选举超时与心跳机制:选举是基于超时控制的。在Raft中,选举超时是随机的,防止多个节点同时发起选举。选举超时到达后,节点会开始投票,直到某个候选者得到过半数支持。
  5. 领导者的责任:当一个节点成为领导者时,它需要定期向所有跟随者发送“心跳包”(Heartbeat)。如果在选举超时内,跟随者没有收到领导者的心跳包,它们会再次发起选举。这是为了确保领导者一直在系统中活动,保证整个系统的稳定性。
  6. 领导者失败后的恢复:如果领导者失败,系统会重新启动选举过程,选举新的领导者,确保系统始终能继续工作。

如果领导者发生故障,或者网络出现分区,选举过程会重新启动,确保集群内总是有一个领导者。Raft算法中的“日志复制”机制可以保证数据的一致性,通过将客户端的操作记录到日志中,领导者向跟随者同步日志,并等待确认,直到达到多数节点的确认,领导者才会提交该操作。

在这里插入图片描述

 

举个例子:假设有5个节点(ID分别为A、B、C、D、E),初始时A是领导者。如果A节点由于故障未能发送心跳包,B、C、D、E会感知到没有收到心跳包,开始选举过程。B、C和D可能会同时成为候选者,最终一个候选者(比如B)会获得超过半数的选票,成为新的领导者。

 

3. ZAB算法

ZAB(ZooKeeper Atomic Broadcast)算法是专为ZooKeeper设计的一种协议,目的是保证集群中数据的一致性。ZAB算法通过将集群中的事务请求转化为提议,并通过广播方式同步到集群中的所有节点,来保证数据一致性。ZAB算法的选举过程类似于Raft算法,但有其独特的实现方式。ZAB算法的选举过程包括四种状态:

原理:

  1. 角色划分:ZAB将节点分为四种角色:
    • 领导者(Leader):负责处理所有客户端请求并将请求转换成提议(Proposal),然后广播给集群中的所有跟随者。
    • 跟随者(Follower):接受领导者的提议,进行确认,并按照领导者的日志进行操作。
    • 观察者(Observer):类似于跟随者,但不参与选举和日志同步,它只是观测集群的状态。
    • Looking状态:当集群中没有领导者时,所有节点都进入该状态,开始选举新领导者。
  2. 选举过程:ZAB的选举是通过一个三元组(ServerID, ZXID, epoch)来确定领导者。每个节点都维护自己的事务ID(ZXID)和选举轮次(epoch)。ZAB算法的选举规则是:节点通过比较ZXID来决定谁是领导者。如果ZXID相同,则比较节点的ServerID,选择ID最大的节点作为领导者。
  3. 数据一致性:ZAB通过广播机制来确保数据的一致性。每个事务请求被转化为提议,并由领导者广播给所有跟随者。只有当超过半数的跟随者确认提议时,领导者才会提交提议,确保所有节点的数据一致。

在选举过程中,ZAB算法使用三元组信息(ServerID, ZXID, epoch)来确定领导者。选举规则是:首先比较ZXID,选择ZXID最大的节点作为领导者;如果ZXID相同,则选择ServerID较大的节点。

 

三、小结与比较

Bully、Raft与ZAB算法各自具有不同的特点和适用场景:

  • Bully算法:通过简单的ID比较选举出主节点,最大ID的节点最终成为主节点。适用于节点间连接良好的场景,但可能在节点数量多时效率较低。
  • Raft算法:通过投票选举方式确保选举的公平性,候选者必须获得超过半数节点的支持才能成为领导者,适合高可用性和一致性要求高的系统。
  • ZAB算法:针对ZooKeeper等高可用分布式系统设计,通过广播机制和事务提议确保数据一致性,适用于需要强一致性保证的系统。

这三种算法在解决分布式系统中选举问题的同时,也对提高系统的可用性与一致性起到了关键作用。通过选举机制,能够确保在事务协调者不可用时,系统能够迅速选举出新的协调者,保证系统的持续运行。

 

参考:《分布式架构原理与实践-崔皓》

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

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

相关文章

免费deepseek的API获取教程及将API接入word或WPS中

免费deepseek的API获取教程: 1 https://cloud.siliconflow.cn/中注册时填写邀请码:GAejkK6X即可获取2000 万 Tokens; 2 按照图中步骤进行操作 将API接入word或WPS中 1 打开一个word,文件-选项-自定义功能区-勾选开发工具-左侧的信任中心-信任中心设置…

【SFRA】笔记

GK_SFRA_INJECT(x) SFRA小信号注入函数,向控制环路注入一个小信号。如下图所示,当前程序,小信号注入是在固定占空比的基础叠加小信号,得到新的占空比,使用该占空比控制环路。 1.2 GK_SFRA_COLLECT(x, y) SFRA数据收集函数,将小信号注入环路后,该函数收集环路的数据,以…

论文笔记-WSDM2024-LLMRec

论文笔记-WSDM2024-LLMRec: Large Language Models with Graph Augmentation for Recommendation LLMRec: 基于图增强的大模型推荐摘要1.引言2.前言2.1使用图嵌入推荐2.2使用辅助信息推荐2.3使用数据增强推荐 3.方法3.1LLM作为隐式反馈增强器3.2基于LLM的辅助信息增强3.2.1用户…

Ubuntu 系统 cuda12.2 安装 MMDetection3D

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! ---------------------------------------…

Tomcat的升级

Tomcat 是一个开源的 Java Servlet 容器,用于部署 Java Servlet 和 JavaServer Pages(JSP)。随着新版本的发布,Tomcat 通常会带来性能改进、安全增强、新特性和对最新 Java 版本的更好支持。升级 Tomcat 服务器通常涉及到以下几个…

Python常见面试题的详解10

1. 哪些操作会导致 Python 内存溢出,怎么处理? 要点 1. 创建超大列表或字典:当我们一次性创建规模极为庞大的列表或字典时,会瞬间占用大量的内存资源。例如,以下代码试图创建一个包含 10 亿个元素的列表,在…

多个用户如何共用一根网线传输数据

前置知识 一、电信号 网线(如以太网线)中传输的信号主要是 电信号,它携带着数字信息。这些信号用于在计算机和其他网络设备之间传输数据。下面是一些关于网线传输信号的详细信息: 1. 电信号传输 在以太网中,数据是…

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南

本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型(14B、32B)全过程与测试结果。 NPU:910B3 (65GB) * 8 (910B 有三个版本 910B1、2、3) 模型:DeepSeek-R1-Distill-Qwen-14B、DeepSeek…

【前端】Vue组件库之Element: 一个现代化的 UI 组件库

文章目录 前言一、官网1、官网主页2、设计原则3、导航4、组件 二、核心功能:开箱即用的组件生态1、丰富的组件体系2、特色功能亮点 三、快速上手:三步开启组件化开发1、安装(使用Vue 3)2、全局引入3、按需导入(推荐&am…

关于uniApp的面试题及其答案解析

我的血液里流淌着战意!力量与智慧指引着我! 文章目录 1. 什么是uniApp?2. uniApp与原生小程序开发有什么区别?3. 如何使用uniApp实现条件编译?4. uniApp支持哪些平台,各有什么特点?5. 在uniApp中…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型

ngx_pool_t 定义在 src/core/ngx_core.h typedef struct ngx_pool_s ngx_pool_t; ngx_pool_s 定义在 src/core/ngx_palloc.h struct ngx_pool_s {ngx_pool_data_t d;size_t max;ngx_pool_t *current;ngx_chain_t *chain;ng…

力扣 最长递增子序列

动态规划,二分查找。 题目 由题,从数组中找一个最长子序列,不难想到,当这个子序列递增子序列的数越接近时是越容易拉长的。从dp上看,当遍历到这个数,会从前面的dp选一个最大的数加上当前数,注意…

Linux | 进程控制(进程终止与进程等待)

文章目录 Linux | 进程控制 — 进程终止 & 进程等待1、进程终止进程常见退出方法1.1退出码基本概念获取退出码的方式常见退出码约定使用场景 1.2 strerror函数 & errno宏1.3 _exit函数1.4_exit和exit的区别1.4.1 所属头文件与函数原型1.4.2 执行过程差异**结合现象分析…

Android - Handler使用post之后,Runnable没有执行

问题:子线程创建的Handler。如果 post 之后,在Handler.removeCallbacks(run)移除了,下次再使用Handler.postDelayed(Runnable)接口或者使用post时,Runnable是没有执行。导致没有收到消息。 解决办法:只有主线程创建的…

鱼皮面试鸭30天后端面试营

day1 1. MySQL的索引类型有哪些? MySQL里的索引就像是书的目录,能帮数据库快速找到你要的数据。以下是各种索引类型的通俗解释: 按数据结构分 B树索引:最常用的一种,数据像在一棵树上分层存放,能快速定位范围数据…

【核心算法篇十二】《深入解剖DeepSeek多任务学习:共享表示层的24个设计细节与实战密码 》

引言:为什么你的模型总在"精神分裂"? 想象你训练了一个AI实习生: 早上做文本分类时准确率90%下午做实体识别却把"苹果"都识别成水果公司晚上做情感分析突然开始输出乱码这就是典型的任务冲突灾难——模型像被不同任务"五马分尸"。DeepSeek通…

DeepSeek应用——与PyCharm的配套使用

目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回,且在本地模型报错 记录自己学习应用DeepSeek的过程,使用的是自己电脑本地部署的私有化蒸馏模型...... (举一反三,这个不单单是可以用…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

vscode通过ssh连接服务器实现免密登录+删除

文章目录 参考: 1、 vscode通过ssh连接服务器实现免密登录删除(吐血总结)

MySQL 主从复制原理及其工作过程

一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核…