【分布式理论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等高可用分布式系统设计,通过广播机制和事务提议确保数据一致性,适用于需要强一致性保证的系统。

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

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

驱动开发系列37 - Linux Graphics 2D 绘制流程(二)- 画布创建和窗口关联

一:概述 前面介绍Pixmap表示一块画布,是绘制发生的地方,本节看看驱动程序如何为画布分配内存/显存,以及如何与窗口关联的。 二:为画布分配BO 在系统启动时(用户登录系统之后,会重启Xorg),在 Xorg 服务器初始化时,要为屏幕创建根窗口的 Pixmap,并绑定到 GPU framebu…

DeepSeek服务器繁忙 多种方式继续优雅的使用它

前言 你的DeepSeek最近是不是总是提示”服务器繁忙,请稍后再试。”,尝试过了多次重新生成后,还是如此。之前DeepSeek官网连续发布2条公告称,DeepSeek线上服务受到大规模恶意攻击。该平台的对话框疑似遭遇了“分布式拒绝服务攻击”&#xff0…

【Mpx】-环境搭建项目创建(一)

一.概述 官方文档:https://mpxjs.cn/guide/basic/start.html mpxjs/cli文档: https://github.com/mpx-ecology/mpx-cli 二.脚手架安装&创建项目 2.1项目创建 //脚手架安装 npm i -g mpxjs/cli //创建Mpx项目 mpx create mpx-demo(项目名称) //安装依赖 np…

【快速入门】Unity 常用组件(功能块)

欢迎关注 、订阅专栏 【unity 新手教程】谢谢你的支持!💜💜 文章目录 Unity 常用组件(功能块):Transform - 变换:坐标、朝向、大小Mesh Filter - 加载网格数据Mesh Renderer- 渲染网格Camera - …

python爬虫系列课程2:如何下载Xpath Helper

python爬虫系列课程2:如何下载Xpath Helper 一、访问极简插件官网二、点击搜索按钮三、输入xpath并点击搜索四、点击推荐下载五、将下载下来的文件解压缩六、打开扩展程序界面七、将xpath.crx文件拖入扩展程序界面一、访问极简插件官网 极简插件官网地址:https://chrome.zzz…

Unity性能优化个人经验总结(不定期更新)

字符串 在使用常量或静态变量 Update、LateUpdate、FixedUpdate等每帧调用或调用频率很高的函数内使用字符串时,均使用常量或静态变量处理。 原因解释:除了常量或静态变量的字符串将会在每一次调用时,将会new一个新的字符串,导…

机器学习小项目之加利福尼亚房价数据分析

1. 安装必要的库 首先,确保安装了以下必要的 Python 库: pip install scikit-learn pandas matplotlib2. 导入所需库 在代码中,我们需要导入一些常用的库来处理数据、训练模型和评估结果: import pandas as pd import numpy a…

基于MATLAB的均匀面阵MUSIC算法DOA估计仿真

基于MATLAB的均匀面阵MUSIC算法DOA估计仿真 文章目录 前言一、二维MUSIC算法原理二、二维MUSIC算法MATLAB仿真三、MATLAB源代码总结 前言 \;\;\;\;\; 在波达角估计算法中,MUSIC 算法与ESPRIT算法属于特征结构子空间算法,是波达角估计算法中的基石。在前面…

【SQL】SQL多表查询

多表查询案例联系点击此处 🎄概念 一般我们说的多表查询都涉及外键和父子表之间的关系。比如一对多:一般前面指的是父表后面指的是子表。 ⭐分类 一对多(多对一) 多对多 一对一 ⭐一对多 📢案例:部门与员工的关系 📢关系&…

【架构】分层架构 (Layered Architecture)

一、分层模型基础理论 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0365cf0bfa754229bdedca6b472bffc7.png 1. 核心定义 分层架构(Layered Architecture)模型是一种常见的软件设计架构,它将软件系统按照功能划分为不同的层次,每个层次都有特定的职责和功能…

2025年02月19日Github流行趋势

项目名称:OmniParser 项目地址url:https://github.com/microsoft/OmniParser 项目语言:Jupyter Notebook 历史star数:12878 今日star数:2153 项目维护者:yadong-lu, ThomasDh-C, aliencaocao, nmstoker, kr…

uni-app发起网络请求的三种方式

uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header:设置请求的 header,header 中不能设置 Referer; method:请求方法; timeout:超时时间,单位 ms&a…

Scrapy:DownloaderAwarePriorityQueue队列设计详解

DownloaderAwarePriorityQueue 学习笔记 1. 简介 DownloaderAwarePriorityQueue 是 Scrapy 中一个高级的优先级队列实现,它不仅考虑请求的优先级,还会考虑下载器的负载情况。这个队列为每个域名(slot)维护独立的优先级队列&#…

用DeepSeek零基础预测《哪吒之魔童闹海》票房——从数据爬取到模型实战

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 **一、为什么要预测票房?****二、准备工作****三、实战步骤详解****Step 1:数据爬取与清洗&am…

django连接mysql数据库

1.下载mysqlclient第三方库 2.在settings.py里连接数据库(提前建好) DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: 学生信息,USER: root,PASSWORD: 999123457,HOST: localhost,POST: 3306,} } 3.在models.py里创建一个类&#xff0…

Linux中的Ctrl+C与Ctrl+Z

CtrlC与CtrlZ的区别 在Linux中,当我们在执行一个命令运行代码时,由于运行时间过长或中途出现报错,此时,我们可能需要终止该操作,这时候,该使用CtrlC还是CtrlZ呢? 1、CtrlC CtrlC:终…

新手向:SpringBoot后端查询到数据,前端404?(附联调时各传参方式注解总结-带你一文搞定联调参数)

前言: 在 Spring Boot 项目开发中,后端小伙伴可能经常遇到这样诡异的场景: 后台日志显示查询到了数据,但前端却一脸懵逼地告诉你 404 Not Found?接口明明写好了,Postman 直接访问却提示找不到&#xff1f…

网络安全重点总结

第一章 网络安全基础 信息安全的三个目标 1.保密性 2. 完整性 3. 可用性 4. 合法使用网络安全的发展态势: 1. 计算机病毒层出不穷 2. 黑客对全球网络的恶意攻击石头逐年上升 3. 由于技术不完备,导致系统催在缺陷,漏洞 4. 世界各国军方在加紧…

电解电容的参数指标

容量 这个值通常是室温25℃,在一定频率和幅度的交流信号下测得的容量。容量会随着温度、直流电压、交流电压值的变化而改变。 额定电压 施加在电容上的最大直流电压,通常要求降额使用。 例如额定电压是4V,降额到70%使用,最高施…

百问网(100ask)的IMX6ULL开发板的以太网控制器(MAC)与物理层(PHY)芯片(LAN8720A)连接的原理图分析(包含各引脚说明以及工作原理)

前言 本博文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 。 本博文和博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 的目录是找出百问网(100ask)的IMX6ULL开发板与NXP官方提供的公板MCIMX6ULL-EVK(imx6ull14x14evk)在以太网硬件…