上篇文章:

RabbitMQ集群搭建https://blog.csdn.net/sniper_fandc/article/details/149312481?fromshare=blogdetail&sharetype=blogdetail&sharerId=149312481&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目录

1 Raft一致性算法

1.1 角色划分和相关名词

1.2 Leader选举

1.3 日志复制

2 仲裁队列使用

2.1 配置文件

2.2 声明仲裁队列

2.3 生产者

2.4 演示仲裁队列的复制


        仲裁队列是基于Raft一致性算法实现的队列。其主要作用是提供复制能力,向其它节点复制消息从而保证集群的高可用性。要介绍仲裁队列首先就需要了解Raft算法:

1 Raft一致性算法

        Raft一致性算法是一种通过投票选择主节点来保证节点之间达成共识的算法。通过选举Leader(主节点),由Leader和客户端进行交互,负责把客户端的操作打包成日志然后把日志同步给其它从节点(日志复制),只有大部分从节点都成功同步并返回确认主节点才会认为此次操作成功。

        关于Raft算法的具体细节见原文:

https://web.stanford.edu/~ouster/cgi-bin/papers/raft-atc14

1.1 角色划分和相关名词

        Raft算法共有三种角色:

        Leader(领导者):Leader就相当于主节点,负责和客户端交互和日志复制,并且定期向所有Follower发送心跳包,防止Follower以为Leader挂掉而进入选举Leader的流程。

        Follower(跟随者):Follower相当于从节点,接受来自Leader的日志并同步到本地,作用就是集群的副本。

        Candidate(候选人):当Follower一段时间内接收不到Leader的心跳包(认为其挂掉了),就会出发选举Leader的流程,此时Follower变为Candidate。

        在三种角色的划分下,整个集群的工作时间被划分为两个部分:选举期(election)和任期(term)选举期就是进行Leader选举时间的投票时期,Leader选举成功后就会进入term,任期就是集群正常工作的时期

        term长度任意长(如果某次选举期没有选出Leader就认为该term长度为0,即没有任期)。每个节点内部都记录着current term(当前任期号,单调递增),节点之间通信时会携带该任期号,当节点任期号小于通信节点的任期号,就会把当前任期号改为较大值。Candidate(可能没有竞争过其它Candidate)或Leader(可能之前宕机后恢复或者Leader网络恢复正常)如果接收到新Leader的心跳包,就会发现自己已经的term已经过期了,就会恢复Follower角色并修改任期号为最新值

        节点之间采用RPC通信,有两种类型的请求:

        RequestVote RPCs:请求投票,Candidate在选举过程中发出。

        AppendEntries RPCs:追加条,Leader发出的日志复制和心跳机制。

1.2 Leader选举

        Leader选举有三条规则:

        1.每个节点只有一票;

        2.Candidate超过半数节点投票就会选举为Leader;

        3.投票按照先来先到原则进行投。

        而触发选举有两个时机,一是集群启动的初始时刻,此时没有Leader,率先超过心跳包过期时间的进入Candidate发起投票。二是其它节点没有及时接受到心跳包(故障或网络问题),先发现问题的先进入Candidate发起投票。因此假设集群有5个节点,Leader选举流程如下:

        初始情况下,集群没有Leader,节点外圈的环形进度条表示超时时间。S3节点会率先超时成为Candidate。

        S3成为Candidate后发起投票,并先给自己投了一票,上图绿色的则是请求投票的数据包(RequestVote RPCs)。

        其它节点接受到投票请求后把各自唯一一票投给S3,于是S3接收到5票(超过半数投票),因此成为Leader。

        S3成为Leader后向其它节点告知新的Leader的信息,发送心跳包(AppendEntries RPCs),如上图黄色数据包。待接受其它节点的响应后,便开始正常的工作流程,如与客户端交互、日志复制等,在任期期间,S3会不断向Follower发送心跳包维持Leader任期。

        对于Candidate除了成为Leader,还可能出现其它两种情况:一是其它节点成为Leader;二是多个Candidate平票,无法选出Leader。

        假设发生其它节点成为Leader:

        S3先成为Candidate,S1后成为Candidate,因此S3获得3票,S1只获得2票,于是S3成为Leader。S3成为新Leader后向所有节点发送心跳包,此时S1处于Candidate状态接收到心跳包后得知S3的term高于自己,说明已经有新Leader,于是变为Follower,开始正常工作。

        假设发生多个Candidate平票:

        这种情况常发生在偶数个节点参与投票,并且有多个Follower同时成为Candidate的时机。比如S1和S3同时成为Candidate,并各自收到其它节点1票和自己的一票,平票状态无法选出Leader,因此会进行下一轮投票。

        但是如果由于同时成为Candidate很有可能结束投票的时间也一致,因此下一轮还可能同时成为Candidate并平票。因此Raft算法采用随机选举超时时间:每个Candidate的投票期的时间在一个区间内随机生成,保证各个Candidate的选举时间不一样,因此就很难出现同时选举并平票的情况。

1.3 日志复制

        成为Leader的节点负责和客户端进行通信,其它节点作为副本。Leader把和客户端的交互的消息打包成日志,并同步给其它节点。只有其它节点超过半数(同步较慢的节点并不影响整个集群的性能)都把消息同步到本地,并返回确认,Leader节点才会认为此次操作成功。

        而仲裁队列就是上述Raft算法运行的集群上的队列,每个仲裁队列有一个主和多个从副本,主副本在主节点(创建仲裁队列的节点是主节点)上,从副本在从节点上。由主副本把消费复制到从副本上,当主副本挂掉从副本就会参与选举Leader成为新的主副本进行工作。

2 仲裁队列使用

        这里使用SpringBoot来创建和使用仲裁队列:

2.1 配置文件

spring:rabbitmq:addresses: amqp://admin:admin@192.168.159.150:5673/testVirtual

2.2 声明仲裁队列

public class RabbitMQConnection {public static final String QUORUM_QUEUE = "quorum.queue";}
@Configurationpublic class RabbitMQConfig {@Bean("quorumQueue")public Queue quorumQueue(){return QueueBuilder.durable(RabbitMQConnection.QUORUM_QUEUE).quorum().build();}}

2.3 生产者

@RestController@RequestMapping("/producer")public class ProducerController {@Resource(name = "rabbitTemplate")private RabbitTemplate rabbitTemplate;@RequestMapping("quorum")public String quorum() {rabbitTemplate.convertAndSend("", RabbitMQConnection.QUORUM_QUEUE, "Hello SpringBoot RabbitMQ");return "发送成功";}}

2.4 演示仲裁队列的复制

        仲裁队列所在的主副本在rabbitmq1节点上,管理界面登录的是rabbit节点,可以发现,我们向rabbitmq1的仲裁队列上发送消息,成功发送:

        上述+2表示还有2个副本。仲裁队列副本默认有5个,1主4从副本。当集群中节点的个数小于5个,比如4个节点,则1主3从副本;当集群中节点数大于五个,比如6个节点,则默认只有5个副本,1主4从副本,从副本随机分配在除主节点外的其它5个节点上(有一个节点会没有从副本)。

        当rabbitmq1节点宕机时,如果是普通队列,所有节点上的消息都会消失,而仲裁队列其它节点消息还会存在:

        可以发现,在rabbitmq1宕机后,发生选举rabbitmq2成为新的Leader,而rabbit还是Follower。

下篇文章:

RabbitMQ—HAProxy负载均衡https://blog.csdn.net/sniper_fandc/article/details/149312701?fromshare=blogdetail&sharetype=blogdetail&sharerId=149312701&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

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

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

相关文章

[2025CVPR-目标检测方向] CorrBEV:多视图3D物体检测

1. ​研究背景与动机​ 论文关注自动驾驶中相机仅有的多视图3D物体检测(camera-only multi-view 3D object detection)问题。尽管基于鸟瞰图(BEV)的建模近年来取得显著进展(如BEVFormer和SparseBEV等基准模型&#xf…

oracle 数据库批量变更数据 将a表字段批量更新为b表字段

需求:将excel表中的数据批量更新到 taccoinfo表中vc_broker字段0、备份:create table taccoinfo0724 as select vc_custno ,vc_broker from taccoinfo 1、创建临时表: create table taccoinfo0724_1 as select vc_custno ,vc_broker from…

vim-xcode 项目常见问题解决方案

vim-xcode 项目常见问题解决方案 项目基础介绍 vim-xcode 是一个开源项目,旨在通过 Vim 编辑器与 Xcode 项目进行交互。该项目允许开发者在 Vim 中直接构建、测试和运行 Xcode 项目,从而提高开发效率。vim-xcode 主要使用 Vimscript 编写,并依…

个性化网页计数器

需要一个服务器环境来存放我们的计数器脚本和数据库。对于初学者来说,PHP和MySQL是一个不错的组合,因为它们易于学习且广泛应用。接下来,我们开始编写PHP脚本。这个脚本的主要任务是接收来自网页的请求,并将访问信息存储到数据库中…

详解力扣高频SQL50题之1683. 无效的推文【入门】

传送门:1683. 无效的推文 题目 表:Tweets ----------------------- | Column Name | Type | ----------------------- | tweet_id | int | | content | varchar | ----------------------- 在 SQL 中,tweet_id 是这个表的主键。 content 只…

Spring Boot与Python的联动:实战案例解析

目录一、背景与需求二、技术准备2.1 Spring Boot 基础2.2 Python 环境搭建三、基于 RESTful API 的调用3.1 创建 Python Flask 应用3.2 创建 Spring Boot 应用3.3 测试与验证四、通过 ProcessBuilder 调用 Python 脚本4.1 创建 Python 脚本4.2 Spring Boot 中调用脚本4.3 注意事…

力扣刷题(第九十七天)

灵感来源 - 保持更新,努力学习- python脚本学习密钥格式化解题思路移除原字符串中的所有破折号,并将小写字母转换为大写。从后向前遍历处理后的字符串,每 K 个字符为一组。最后将各组逆序拼接,并用破折号分隔。class Solution:def…

ESP32入门实战:PC远程控制LED灯完整指南

引言:物联网远程控制基础 远程控制是物联网应用的基础功能之一,通过ESP32实现PC远程控制LED灯不仅是一个经典入门项目,更是理解网络通信、嵌入式开发和物联网交互的绝佳实践。本文将详细介绍如何通过WiFi和UDP协议,从零开始构建一…

主流摄像头协议及其开源情况,GB/T 28181协议介绍

一、主流摄像头协议及开源情况 1. RTSP(Real Time Streaming Protocol) 技术特性:基于TCP/UDP的实时流传输协议,支持双向通信(如暂停、播放控制)。应用场景:摄像头实时监控、视频点播系统。开源…

「iOS」——RunLoop学习

底层学习iOS--RunLoop学习RunLoop的概念RunLoop与线程的关系RunLoop的结构ModeObserverTimerSourceRunLoop 执行流程RunLoop 的应用1.AutoreleasePool是什么时候释放的2.触控事件的响应3.刷新界面4.线程保活小知识mach Port**Toll-Free Bridging(对象桥接&#xff0…

从零构建 Node20+pnpm+pm2 环境镜像:基于 Dockerfile 的两种方案及持久化配置指南

前言:在Node.js项目部署中,环境一致性和服务自动恢复是运维的核心需求。无论是本地开发还是生产部署,使用Docker封装Node20、pnpm(高效包管理)和pm2(进程守护)环境,能避免“本地能跑…

【Python机器学习】4.3. 模型优化

喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 4.3.1. 实战中会遇到的问题 首先看一个例子: 根据任检测数据x1x_1x1​、x2x_2x2…

Impact rating 影响等级定义(学习笔记)

影响等级可以通过四个方面定义,包含安全性safety,经济型financial,操作性operational,和私密性privacy 即[S,F,O,P]这四个方面。每个方面又可以定义四个不同的等级,包含severe(严重的)&#xff…

同花顺前端潜在面试题目与答案

潜在面试题目与答案 以下是根据您提供的“岗位职责”和“岗位要求”整理出的潜在面试题目和参考答案。请注意,这些答案仅供参考,您需要根据自己的实际经验和理解进行更详细和个性化的阐述。 一、基础技术知识(Vue/前端工程化/HTML/CSS/JS&…

J2EE模式---组合实体模式

组合实体模式基础概念组合实体模式(Composite Entity Pattern)是一种企业级设计模式,属于 J2EE 模式的一种,其核心思想是将多个实体对象组合成一个更高层次的对象(组合实体),以简化客户端与这些…

基于CloudBase+React+CodeBudddy的云上智能睡眠应用开发实践

本文详细记录了如何利用CloudBase云开发平台、React前端框架和CodeBudddy智能编程技术栈,构建一个云端智能睡眠监测与分析系统。通过完整的项目实践,探索AIoT时代健康管理应用的开发范式。一、智能睡眠监测:云时代的健康守护者在快节奏的现代…

QML 模型

QML模型基础架构QML采用经典的Model-View-Delegate (MVD)​架构来分离数据与界面,这与MVC模式类似但更加适合声明式UI开发。在这个架构中:​Model​:负责管理数据,可以是简单的整数,也可以是复杂的C自定义模型​View​…

基于Trae IDE与MCP实现网页自动化测试的最佳实践

引言 在现代Web开发流程中,自动化测试已成为保障应用质量、提升开发效率的关键环节。Playwright作为一款新兴的测试框架,因其出色的跨浏览器支持能力和丰富的API特性,正逐渐成为自动化测试领域的主流选择。本文将详细介绍如何在葡萄城Trae ID…

Android 动画优化

动画是提升 Android 应用用户体验的核心手段 —— 流畅的过渡动画能让页面切换更自然,交互反馈动画能让操作更有质感。但动画也是性能 “重灾区”:掉帧、卡顿、内存暴涨等问题,往往源于对动画原理和优化技巧的忽视。本文将从动画性能的核心瓶…

Linux——进程间通信,匿名管道,进程池

文章目录一、进程间通信(IPC)的理解1.为什么进程间要通信(IPC)2.如何进行通信二、匿名管道1.管道的理解2.匿名管道的使用3.管道的五种特性4.管道的四种通信情况5.管道缓冲区容量三、进程池1.进程池的理解2.进程池的制作四、源码Pr…