【分布式理论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算法的选举过程包括以下步骤:
- 节点角色转换:在Raft中,所有节点在没有领导者的情况下,都会是“跟随者”(Follower)。如果在一定时间内(超时)没有收到领导者的心跳包,跟随者会自愿变为“候选者”(Candidate),开始发起选举。
- 选举过程:当一个节点变为候选者时,它会向其他所有节点发起选举请求。如果一个节点的选举请求得到了大多数节点的投票支持,它就会成为领导者(Leader)。此时,其他节点会变回“跟随者”角色,开始接受领导者的指挥。
- 选举的胜者:如果有多个候选者同时发起选举,系统会出现“选举超时”,导致选举周期重复进行,直到某一个候选者最终获得超过半数节点的投票支持,成为领导者。
- 选举超时与心跳机制:选举是基于超时控制的。在Raft中,选举超时是随机的,防止多个节点同时发起选举。选举超时到达后,节点会开始投票,直到某个候选者得到过半数支持。
- 领导者的责任:当一个节点成为领导者时,它需要定期向所有跟随者发送“心跳包”(Heartbeat)。如果在选举超时内,跟随者没有收到领导者的心跳包,它们会再次发起选举。这是为了确保领导者一直在系统中活动,保证整个系统的稳定性。
- 领导者失败后的恢复:如果领导者失败,系统会重新启动选举过程,选举新的领导者,确保系统始终能继续工作。
如果领导者发生故障,或者网络出现分区,选举过程会重新启动,确保集群内总是有一个领导者。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算法的选举过程包括四种状态:
原理:
- 角色划分:ZAB将节点分为四种角色:
- 领导者(Leader):负责处理所有客户端请求并将请求转换成提议(Proposal),然后广播给集群中的所有跟随者。
- 跟随者(Follower):接受领导者的提议,进行确认,并按照领导者的日志进行操作。
- 观察者(Observer):类似于跟随者,但不参与选举和日志同步,它只是观测集群的状态。
- Looking状态:当集群中没有领导者时,所有节点都进入该状态,开始选举新领导者。
- 选举过程:ZAB的选举是通过一个三元组(ServerID, ZXID, epoch)来确定领导者。每个节点都维护自己的事务ID(ZXID)和选举轮次(epoch)。ZAB算法的选举规则是:节点通过比较ZXID来决定谁是领导者。如果ZXID相同,则比较节点的ServerID,选择ID最大的节点作为领导者。
- 数据一致性:ZAB通过广播机制来确保数据的一致性。每个事务请求被转化为提议,并由领导者广播给所有跟随者。只有当超过半数的跟随者确认提议时,领导者才会提交提议,确保所有节点的数据一致。
在选举过程中,ZAB算法使用三元组信息(ServerID, ZXID, epoch)来确定领导者。选举规则是:首先比较ZXID,选择ZXID最大的节点作为领导者;如果ZXID相同,则选择ServerID较大的节点。
三、小结与比较
Bully、Raft与ZAB算法各自具有不同的特点和适用场景:
- Bully算法:通过简单的ID比较选举出主节点,最大ID的节点最终成为主节点。适用于节点间连接良好的场景,但可能在节点数量多时效率较低。
- Raft算法:通过投票选举方式确保选举的公平性,候选者必须获得超过半数节点的支持才能成为领导者,适合高可用性和一致性要求高的系统。
- ZAB算法:针对ZooKeeper等高可用分布式系统设计,通过广播机制和事务提议确保数据一致性,适用于需要强一致性保证的系统。
这三种算法在解决分布式系统中选举问题的同时,也对提高系统的可用性与一致性起到了关键作用。通过选举机制,能够确保在事务协调者不可用时,系统能够迅速选举出新的协调者,保证系统的持续运行。
参考:《分布式架构原理与实践-崔皓》
相关文章:
【分布式理论12】事务协调者高可用:分布式选举算法
文章目录 一、分布式系统中事务协调的问题二、分布式选举算法1. Bully算法2. Raft算法3. ZAB算法 三、小结与比较 一、分布式系统中事务协调的问题 在分布式系统中,常常有多个节点(应用)共同处理不同的事务和资源。前文 【分布式理论9】分布式…...
详细介绍Tess4J的使用:从PDF到图像的OCR技术实现
在当今的数字化时代,OCR(光学字符识别)技术被广泛应用于文档扫描、图片文字识别以及其他自动化数据提取任务。Tesseract作为一款强大的开源OCR引擎,在处理图像和PDF中的文本提取方面具有非常高的准确度和效率。本文将详细介绍如何…...
postgres源码学习之简单sql查询
postgres源码学习之sql查询 sql查询的主流程读取sql解析sql重写sql获得执行计划执行查询操作结果返回 sql查询的主流程 参考postgres的处理流程 由上一节,我们可以看到,当有新的连接通过权限认证之后,将进入等待接收sql语句,并执…...
C#项目05-猜数字多线程
本项目利用多线程,通过点击按钮猜数字, 知识点 线程 基本概念 进程:一组资源,构成一个正在运行的程序,这些资源包括地址空间、文件句柄以及程序启动需要的其他东西的载体。 线程:体现一个程序的真实执行情况, 线…...
前端504错误分析
前端出现504错误(网关超时)通常是由于代理服务器未能及时从上游服务获取响应。以下是详细分析步骤和解决方案: 1. 确认错误来源 504含义:代理服务器(如Nginx、Apache)在等待后端服务响应时超时。常见架构:前端 → 代理服务器 → 后端服务,问题通常出在代理与后端之间。…...
《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…...
DeepSeek和ChatGPT的全面对比
一、模型基础架构对比(2023技术版本) 维度DeepSeekChatGPT模型家族LLAMA架构改进GPT-4优化版本参数量级开放7B/35B/120B闭源175B位置编码RoPE NTK扩展ALiBiAttention机制FlashAttention-3FlashAttention-2激活函数SwiGLU ProGeGLU训练框架DeepSpeedMeg…...
无线网络安全配置指南:WPA、WPA2、WPA3及WAPI详解
对于做 Wi-Fi 的朋友,大家可能天天都需要配置各种加密和模式,但是有时候可能会一时忘记如何配置,基于日常的工作经验,总结了一篇文档:《无线网络安全配置指南:WPA、WPA2、WPA3及WAPI详解》,具体…...
撕碎QT面具(6):调节窗口大小后,控件被挤得重叠的解决方法
问题:控件重叠 分析原因:因为设置了最小大小,所以界面中的大小不会随窗口的变化而自动变化。 处理方案:修改mimumSize的宽度与高度为0,并设置sizePolicy为Expanding,让其自动伸缩。 结果展示(自…...
解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
一、引言 机器学习算法种类繁多,它们各自有着独特的优势和应用场景。前面我们学习了线性回归算法、逻辑回归算法、决策树算法。而今天,我们要深入探讨的是其中一种经典且广泛应用的聚类算法 —— K - 平均算法(K-Means Algorithm)…...
【Linux】匿名管道的应用场景-----管道进程池
目录 一、池化技术 二、简易进程池的实现: Makefile task.h task.cpp Initchannel函数: 创建任务: 控制子进程: 子进程执行任务: 清理收尾: 三、全部代码: 前言: 对于管…...
机器学习(1)安装Pytorch
1.安装命令 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 2.安装过程Log: Looking in indexes: https://download.pytorch.org/whl/cu118 Co…...
Linux 多Python版本统一和 PySpark 依赖 python 包方案
背景 Linux 服务器经常有多个Python版本,比如 Python2 有两个版本,Python3 有两个版本。在使用上容易混淆,而且有些需要新增一些 module 更容易,安装如果路径不统一,导致日常使用时,会出现找不到新安装mod…...
PostgreSQL的学习心得和知识总结(一百六十九)|深入理解PostgreSQL数据库之 Group By 键值消除 的使用和实现
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...
DeepSeek是什么?两种模型的对比?
最近DeepSeek的风也是很大,它也是很火,那么DeepSeek是什么呢? 什么是DeepSeek? DeepSeek是一家专注通用人工智能(AGI)的中国科技公司,主攻大模型研发与应用。DeepSeek-R1是其开源的推理模型&a…...
跟着 Lua 5.1 官方参考文档学习 Lua (2)
文章目录 2.3 – Variables2.4 – Statements2.4.1 – Chunks2.4.2 – Blocks2.4.3 – Assignment2.4.4 – Control Structures2.4.5 – For Statement2.4.6 – Function Calls as Statements2.4.7 – Local Declarations 2.3 – Variables Variables are places that store v…...
Python基于循环神经网络的情感分类系统(附源码,文档说明)
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...
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. 效果展示及源…...
LeetCode 0624.数组列表中的最大距离:只关心最小最大值
【LetMeFly】624.数组列表中的最大距离:只关心最小最大值 力扣题目链接:https://leetcode.cn/problems/maximum-distance-in-arrays/ 给定 m 个数组,每个数组都已经按照升序排好序了。 现在你需要从两个不同的数组中选择两个整数ÿ…...
如何解决服务器端口被攻击:全面防护与快速响应
服务器端口被攻击是网络安全中常见的问题之一,尤其是当服务器暴露在公共网络上时,容易成为黑客的目标。攻击者可能通过扫描开放端口、利用漏洞或发动拒绝服务(DoS/DDoS)攻击来破坏服务器的正常运行。本文将详细介绍如何检测、防御…...
Golang深度学习
前言 在2009年,Google公司发布了一种新的编程语言,名为Go(或称为Golang),旨在提高编程效率、简化并发编程,并提供强大的标准库支持。Go语言的设计者们希望通过Go语言能够解决软件开发中的一些长期存在的问…...
Linux环境开发工具
Linux软件包管理器yum Linux下安装软件方式: 源代码安装rpm安装——Linux安装包yum安装——解决安装源、安装版本、安装依赖的问题 yum对应于Windows系统下的应用商店 使用Linux系统的人:大部分是职业程序员 客户端怎么知道去哪里下载软件࿱…...
JupyterNotebook高级使用:常用魔法命令
%%writefile test.py def Test(name):print("Test",name,"success")运行结果:就是在我们的文件目录下面创建了这个test.py文件,主要是认识一下这个里面的%%writefile表示创建新的文件,这个文件里面的内容就是上面我们定义…...
C++ Primer 类的作用域
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
