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
相关推荐
梦想的旅途21 小时前
企业微信API实战:Python自动化消息推送
java·前端·python·自动化·企业微信
mldong1 小时前
流程定义设计:一份 LogicFlow JSON 全解
java·架构
rannn_11110 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
IKUN家族11 小时前
Spring IoC&DI
java·spring·rpc
山荷枝12 小时前
03-框架--Spring
java·后端·spring
ChaHae-In13 小时前
SpringBoot统一功能处理
java·spring boot·后端
coder!mq13 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding13 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
心平气和量大福大14 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言