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

news2025/4/8 10:58:40

文章目录

    • 一、分布式系统中事务协调的问题
    • 二、分布式选举算法
      • 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.coloradmin.cn/o/2301414.html

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

相关文章

postgres源码学习之简单sql查询

postgres源码学习之sql查询 sql查询的主流程读取sql解析sql重写sql获得执行计划执行查询操作结果返回 sql查询的主流程 参考postgres的处理流程 由上一节,我们可以看到,当有新的连接通过权限认证之后,将进入等待接收sql语句,并执…

C#项目05-猜数字多线程

本项目利用多线程,通过点击按钮猜数字, 知识点 线程 基本概念 进程:一组资源,构成一个正在运行的程序,这些资源包括地址空间、文件句柄以及程序启动需要的其他东西的载体。 线程:体现一个程序的真实执行情况, 线…

《C语言动态顺序表:从内存管理到功能实现》

1.顺序表 1.1 概念 顺序存储的线性表,叫顺序表。 1.2顺序表存放的实现方式 可以使用数组存储数据,可以实现逻辑上相连,物理内存上也相连。也可以使用malloc在堆区申请一片连续的空间,存放数据,实现逻辑上相连&#…

通过API 调用本地部署 deepseek-r1 模型

如何本地部署 deepseek 请参考(windows 部署安装 大模型 DeepSeek-R1) 那么实际使用中需要开启API模式,这样可以无拘无束地通过API集成的方式,集成到各种第三方系统和应用当中。 上遍文章是基于Ollama框架运行了deepSeek R1模型…

DeepSeek-学习与实践

1.应用场景 主要用于学习与使用DeepSeek解决问题, 提高效率. 2.学习/操作 1.文档阅读 文档 DeepSeek -- 官网, 直接使用 --- 代理网站 --- 极客智坊 https://poe.com/DeepSeek-R1 https://time.geekbang.com/search?qdeepseek -- 搜索deepseek的资料 资料 20250209DeepSeekC…

撕碎QT面具(6):调节窗口大小后,控件被挤得重叠的解决方法

问题:控件重叠 分析原因:因为设置了最小大小,所以界面中的大小不会随窗口的变化而自动变化。 处理方案:修改mimumSize的宽度与高度为0,并设置sizePolicy为Expanding,让其自动伸缩。 结果展示(自…

解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱

一、引言 机器学习算法种类繁多,它们各自有着独特的优势和应用场景。前面我们学习了线性回归算法、逻辑回归算法、决策树算法。而今天,我们要深入探讨的是其中一种经典且广泛应用的聚类算法 —— K - 平均算法(K-Means Algorithm&#xff09…

【Linux】匿名管道的应用场景-----管道进程池

目录 一、池化技术 二、简易进程池的实现: Makefile task.h task.cpp Initchannel函数: 创建任务: 控制子进程: 子进程执行任务: 清理收尾: 三、全部代码: 前言: 对于管…

PostgreSQL的学习心得和知识总结(一百六十九)|深入理解PostgreSQL数据库之 Group By 键值消除 的使用和实现

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

Python基于循环神经网络的情感分类系统(附源码,文档说明)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

Zookeeper应用案例-分布式锁-实现思路

以下是具体实现代码 第一步:注册锁节点 第二步:获取锁节点,如果自己是最小的节点,就获取权限 第三步:拿到锁就开始自己的业务逻辑 第四步:业务逻辑好了就要释放这把锁 第五步:重新注册监听&…

java练习(32)

ps:题目来自力扣 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表…

伯克利 CS61A 课堂笔记 10 —— Trees

本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…

让编程变成一种享受-明基RD320U显示器

引言 作为一名有着多年JAVA开发经验的从业者,在工作过程中,显示器的重要性不言而喻。它不仅是我们与代码交互的窗口,更是影响工作效率和体验的关键因素。在多年的编程生涯中,我遇到过各种各样的问题。比如,在进行代码…

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者:后端小肥肠 目录 1. 前言 为什么选择DeepSeek? 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

Linux环境开发工具

Linux软件包管理器yum Linux下安装软件方式: 源代码安装rpm安装——Linux安装包yum安装——解决安装源、安装版本、安装依赖的问题 yum对应于Windows系统下的应用商店 使用Linux系统的人:大部分是职业程序员 客户端怎么知道去哪里下载软件&#xff1…

JupyterNotebook高级使用:常用魔法命令

%%writefile test.py def Test(name):print("Test",name,"success")运行结果:就是在我们的文件目录下面创建了这个test.py文件,主要是认识一下这个里面的%%writefile表示创建新的文件,这个文件里面的内容就是上面我们定义…

C++ Primer 类的作用域

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

50页PDF|数字化转型成熟度模型与评估(附下载)

一、前言 这份报告依据GBT 43439-2023标准,详细介绍了数字化转型的成熟度模型和评估方法。报告将成熟度分为五个等级,从一级的基础转型意识,到五级的基于数据的生态价值构建与创新,涵盖了组织、技术、数据、资源、数字化运营等多…

机器学习实战(8):降维技术——主成分分析(PCA)

第8集:降维技术——主成分分析(PCA) 在机器学习中,降维(Dimensionality Reduction) 是一种重要的数据处理技术,用于减少特征维度、去除噪声并提高模型效率。主成分分析(Principal C…