1. 仲裁队列
RabbitMQ集群有多机多节点和单机多节点,实际中使用多机多节点
当创建队列的主节点宕机后,该队列的数据就会丢失,要解决这个问题需要采用仲裁队列
仲裁队列是一种基于Raft一致性算法实现的持久化,复制的FIFO队列,仲裁队列提供队列复制的能力,保障数据的高可用性和安全性,使用仲裁队列可以在RabbitMQ节点间进行队列数据的复制,从而达到在一个节点宕机时,队列仍然可以提供服务的效果
Raft协议介绍
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


