RabbitMQ运维

1. 仲裁队列

RabbitMQ集群有多机多节点和单机多节点,实际中使用多机多节点

当创建队列的主节点宕机后,该队列的数据就会丢失,要解决这个问题需要采用仲裁队列

仲裁队列是一种基于Raft一致性算法实现的持久化,复制的FIFO队列,仲裁队列提供队列复制的能力,保障数据的高可用性和安全性,使用仲裁队列可以在RabbitMQ节点间进行队列数据的复制,从而达到在一个节点宕机时,队列仍然可以提供服务的效果

Raft协议介绍

raft-atc14

Raft是一种用于管理和维护分布式系统一致性的协议,它是一种共识算法,旨在实现高可用性和数据的持久性,Raft通过在节点间复制数据来保证分布式系统中的一致性,即使在节点故障的情况下也能保证数据不会丢失

在分布式系统下,为了消除单点提供系统可用性,通常会使用副本来进行容错,但这会带来另一个问题,即如何保证多个副本的一致性

共识算法就是做这个事情的,它允许多个分布式节点就某个值或一系列值达成一致性协议,即使在一些节点发生故障,网络分区或其他问题的情况下,共识算法也能保证系统的一致性和数据的可靠性

常见的共识算法有 Paxos、Rafe、Zab等

  • Paxos:一种经典的共识算法,用于解决分布式系统中的一致性问题
  • Raft:一种较新的共识算法,Paxos不易实现,Raft对Paxos算法进行简化和改进,旨在易于理解和实现
  • Zab:ZooKeeper使用的共识算法,基于Paxos算法,大部分和Raft相同,主要区别是对于Leader的任期,状态复制过程中,raft的心跳从LEader向Fallower发送,而Zab相反
  • Gossip:Gossip 算法每个节点都是对等的,即没有角色之分,Gossip算法中的每个节点都会将数据改动告诉给其他节点

Raft基本概念

Raft使用Quorum机制来实现共识和重错,对Raft集群的操作必须得到大多数节点的统一才能提交

Raft集群必须存在一个主节点,客户端向集群发起的所有操作都会经由主节点处理,所以Raft算法的第一部分就是选主,没有主节点集群就无法工作

选主(Leqader relection)

在Raft算法中,每个节点都处于以下角色之一

  • Leader(领导者)负责处理所有客户请求,并将这些请求作为日志复制到所有 Follower,Leader定期向所有Follower发送心跳消息,以维持其领导地位,防止Follower进入选举过程
  • Follower(跟随着)接收来自Leader的日志条目,并在本地应用这些条目,跟随着不直接处理客户端请求
  • Candidate(候选者):当跟随者在一段时间内没有收到来自Leader的心跳消息时,它会变得不确定Leader是否仍然可以使用,在这种情况下,Follower会转变为Candidate,并尝试通过投票过程称为新的Leader

任期(term)

Raft将时间分成任意长度的任期,每一段任期从一次选举开始,在这个时候会有一个或者多个Candidate尝试称为leader,在成功完成选主后,一个leader就会一直管理节点到任期结束,再某些情况下,一次选举无法选出leader,这个时候这个任期会以没有leader而结束,同时一个新的任期会重新开始

选举过程

Raft协议下的消息复制

消息复制和主副本选举的操作,需要超过半数的副本统一,生产者发送一条消息,需要超过半数的队列复制都将消息写入磁盘以后才会向生产者确认,在就意味着少部分比较慢的副本不会影响整个队列的性能

仲裁队列的使用

复制代码
@Bean("quorumQueue")
public Queue quorumQueue() {
   return QueueBuilder.durable("quorum_queue").quorum().build();
}

Map<String, Object> param = new HashMap<>();
param.put("x-queue-type", "quorum");
channel.queueDeclare("quorum_queue",true,false,false,param);

2. HAProxy 负载均衡

面对大量业务访问、高并发请求,可以使用高性能的服务器来提升RabbitMQ服务的负载能力,当单机容量达到极限的时候,可以采用集群的策略来对负载能力做进一步的提升,但还存在问题

如果集群中有三个节点,客户端访问哪一个节点都是不合理的

1)如果访问的是node1,但是node1挂了,程序会出现问题,所以最后是有一个统一的入口,一个节点故障时,流量可以及时转移到其他节点上

2)如果所有客户端都与node1建立连接,那么node1的网络负载必然会大大层架,而其他接地那又由于没有那么多的负载而造成硬件资源的浪费

使用HAProxy实现

2.1 安装

复制代码
#更新软件包
sudo apt-get update

#查找haproxy
sudo apt list|grep haproxy

#安装haproxy
sudo apt-get install haproxy

#查看服务状态
sudo systemctl status haprox

#查看版本
haproxy -v

#如果要设置HAProxy服务开机⾃启,可以使⽤:
sudo systemctl enable haproxy

修改配置

2.2 使用

复制代码
spring:
  rabbitmq:
    addresses: amqp://study:study@124.71.229.73:5670/bite
相关推荐
学长毕业设计5 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
东小西6 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西6 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午6 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065256 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
小范同学_6 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
予昊7 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
2601_962203517 小时前
【SpringAI入门】初识SpringAI
java
weixin_461408588 小时前
Mybatis-flex小记
java·开发语言·mybatis
2601_962177138 小时前
【MySQL篇】聚合查询,联合查询
android·java·mysql