RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)
Leader:负责处理客户端请求并复制日志到所有 Follower。 Follower:接收 Leader 发送的日志信息。 Candidate:在没有收到 Leader 心跳的情况下,切换为 Candidate 状态并发起选举。
发布日期:2025-05-04 06:53:20
浏览次数:8
分类:精选文章
本文共 1647 字,大约阅读时间需要 5 分钟。
仲裁队列与Raft协议
1. 仲裁队列概述
在 RabbitMQ 中,普通队列存在一个关键问题:当一个节点宕机后,其他节点无法读写宕机节点的队列数据。为了解决此问题,RabbitMQ 引入了仲裁队列。
2. 仲裁队列的作用
- 仲裁队列通过 Raft 协议实现不同节点间队列消息数据的复制。在主节点宕机时,其他节点仍能通过仲裁队列继续服务。
3. Raft 协议概述
Raft 协议是一种共识算法,用于解决分布式系统中的单点故障问题。它通过三个子问题确保系统一致性:Leader 选举、日志复制和安全性。
4. Raft 节点角色
Raft 节点有三种角色:
5. 任期与选举流程
-
任期(Term):从一次选举开始到 Leader 宕机为止为一个任期。节点会存储当前任期号,并在每次成功选举后单调递增。
-
选举流程:
- 新节点启动时默认为 Follower。
- 若在选举超时时间内未收到 Leader 心跳,节点切换为 Candidate 并发起选举。
- 候选节点通过 RequestVote RPC 向其他节点请求投票。
- 若获得超过半数投票(包括自己的一票),成为新的 Leader。
- 若未获得半数票数,保留 Candidate 状态并重新发起选举。
6. 选举超时与避免集群选举
为了避免集群同时发起选举,Raft 使用随机选举超时时间(150-300ms)。这样可以确保大多数情况下不会出现所有节点同时成为 Candidate。
7. 消息复制
- 仲裁队列有多个副本,包括一个主节点和多个从节点。
- 客户端只与主节点交互,主节点将命令复制到从节点。
- 主节点故障时,从节点会被选举为新的主节点,继续提供服务。
8. 仲裁队列的使用
8.1 MQ 管理平台
MQ 管理平台提供了对仲裁队列的监控和管理功能。
8.2 Spring AMQP 配置
- 配置:
spring: application: name: rabbitmq rabbitmq: host: env-base port: 5672 username: root password: 1111
- Bean 配置:
import com.cyk.rabbitmq.constants.MQConst;import org.springframework.amqp.core.Queue;import org.springframework.amqp.core.QueueBuilder;@Configurationclass QuorumConfig { @Bean fun quorumQueue(): Queue = QueueBuilder .durable(MQConst.QUORUM_QUEUE) .quorum() .build();} - 生产者接口:
@RestController@RequestMapping("/mq")class MQApi( private val rabbitTemplate: RabbitTemplate) { @GetMapping fun quorum(): String { rabbitTemplate.convertAndSend("", MQConst.QUORUM_QUEUE, "quorum msg 1") return "ok" }}
9. 结果展示
- 通过配置和使用 Spring AMQP,可以轻松创建并管理仲裁队列。
- 仲裁队列确保了消息的高可用性和系统的容错能力。
- 当主节点下线时,其他节点仍能通过仲裁队列继续服务。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2026年06月10日 17时21分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP线程安全和非线程安全
2023-03-01
R3LIVE开源项目常见问题解决方案
2023-03-01
php缃戠珯,www.wfzwz.com
2023-03-01
php缓存查询函数
2023-03-01
php编写TCP服务端和客户端程序
2023-03-01
php编码规范
2023-03-01
PHP编码规范-PSR1、psr2 /psr3 psr4
2023-03-01
PHP编程效率的20个要点
2023-03-01
PHP网页缓存技术优点及代码
2023-03-01
PHP自动化测试(一)make test 和 phpt
2023-03-01
php自定义函数: 文件大小转换成智能形式
2023-03-01
php英语单词,php常用英语单词,快速学习php编程英语(6)
2023-03-01
PHP获取curl传输进度
2023-03-01
PHP获取IP所在地区(转)
2023-03-01
PHP获取IP的方法对比
2023-03-01
php获取json里面内容
2023-03-01
R2的版本由来
2023-03-01
PHP获取图片宽度高度、大小尺寸、图片类型、用于布局的img属性
2023-03-01
PHP获取当前文件的绝对路径
2023-03-01