欢迎光临
我们一直在努力

RabbitMQ---运维

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

(一).搭建RabbitMQ集群

这里我们搭建的集群为“单机多节点”的集群。即在一台服务器上,开启多个RabbitMQ节点,然后用端口号进行区分。

1.启动多个节点

目前,我们安装的RabbitMQ端口号为5672,15672.那么我们再启动两个RabbitMQ服务,端口号分别设置为5673,15673 和 5674,15674

RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached

RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached

RABBITMQ_NODE_PORT=5673   指的是  AMQP协议端口

ABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]"   指的是   启动参数,用来给 rabbitmq_management (管理插件)  指定监听端口

-rabbitmq_management listener [{port,15673} 指的是 管理后台web端口:15673

RABBITMQ_NODENAME=rabbit2  指的是   节点名称 rabbit@主机名   单机多节点必须用不同的名称

-detached   指的是  后台守护进程方式启动

2.把rabbit2,rabbit3添加到集群

rabbitmqctl -n rabbit2 join_cluster rabbit@iZ2zeicdhj4duz2pt4f9gfZ

rabbitmqctl -n rabbit3 join_cluster rabbit@iZ2zeicdhj4duz2pt4f9gfZ

3.重启rabbit2,rabbit3

rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 start_app

4.查看集群状态

rabbitmqctl cluster_status -n rabbit

(二).宕机演示

但是,目前的集群是有问题的,就是数据不同步,下面进行具体演示

新增一个队列

然后,手动添加两条消息

可以看到,是可以添加成功的

但是,我现在停掉rabbit,然后看rabbit2和rabbit3的结果

通过rabbit2可以看到已经看不到消息了

然后,我现在再将rabbit启动

发现,消息已经丢失了

(三).仲裁队列

在上面演示宕机的时候,发现,当我们将主节点的关闭再启动,发现消息已经丢失了。为了解决这个问题,RabbitMQ引入了“仲裁队列”。

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

1.Raft协议介绍

(1).Raft概念

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

在分布式系统中,为了消除单点提高系统的可用性,通常会使用副本来进行容错,为了保证多个副本的一致性,就引入了共识算法,Raft就属于共识算法。共识算法允许多个分布式节点就某个值或一系列值达成一致性协议。即使在一些节点发生故障,网络分区或其他问题的情况下,共识算法也能保证系统的一致性和数据的可靠性。

Raft使用Quorum机制来实现共识和容错,我们将对Raft集群的操作必须得到大多数节点的同意才能提交。

当客户端向Raft集群发送一系列读写操作时,Raft集群必须存在一个主节点,客户端发送的所有请求必须经过主节点进行处理。所以Raft算法的第一部分就是选主。

主节点会负责接收客户端发来的操作请求,将操作包装为日志同步给其他节点,在保证大部分节点都同步了本次操作后,就可以安全的给客户端返回响应了,这被称为Raft算法的日志复制。

由于主节点的责任非常大,所以只有符合条件的节点才可以当选为主节点。为了保证集群对外展现的一致性,主节点在处理操作日志时,也要谨慎,这被称为Raft算法的安全性

Raft算法将一致性问题分解成了三部分:①.Leader选举  ②.日志复制  ③.安全性

(2).选主

选主,就是在集群中选出一个主节点来负责一些特定的工作。在执行了选主过程后,集群中每个节点都会识别出一个特定的,唯一的节点作为leader

在Raft算法中,每个节点都有角色,主要分为三种:

①.Leader:负责处理所有的客户端请求,并将这些请求作为日志项复制到所有的Follower。Leader定期向所有的Follower发送心跳消息,来维持其领导者的地位,防止Follower进入选举过程。

②.Follower:接收来自Leader的日志条目,并在本地应用这些条目,Follower不直接处理客户请求

③.Candidate:当Follower在一段时间内没有收到Leader的心跳信息,Follower就会认为Leader挂了。在这种情况下,Follower就会转别角色为Candidate,并开始尝试通过投票过程成为新的Leader。

当所有节点刚启动的时候,都是follow状态,在一段时间内如果没有收到leader的心跳包,此时就会从follower切换为candidate,发起选举。如果收到多数派的投票则切换为leader状态。

Ⅰ.任期(term)

Raft将时间划分成任意长度的任期。每一段任期从一次选举开始在这个时候,会有一个或者多个candidate尝试去成为leader。在成功完成一次投票之后,一个leader就会接管集群知道任期结束。在某些情况下,一次选举无法选出leader,这个时候任期就会以没有leader而结束。同时,一个新的任期会很快重新开始

任期(term)更像一个逻辑时钟。可以通过它,来发现哪些节点的状态已经过期,每一个节点都保存了一个current term,在通信的时候带上这个任期值。

每一个节点都存储着一个当前任期号。这个任期号会随着时间单调递增。节点之间进行通信都是交换当前任期号,如果一个节点的当前任期号比其他节点小,那么就会更新为较大的那个值。如果一个leader或者candidate发现自己的任期号过期了,就会立刻回到follower状态,如果一个节点接收了一个带着过期的任期号请求,那么就会拒绝这次请求。

Raft算法中服务器节点之间采用RPC进行通信,主要由两类RPC请求:

①.RequestVote RPCs : 请求投票,由candidate在选举过程中发出

②.AppendEntries RPCs:追加条目,由leader发出,用来做日志复制和提供心跳机制

Ⅱ.选举过程

Raft采用心跳机制来触发leader选举,当服务器启动的时候,都是follow状态。如果follower在election timeout内没有收到来自leader的心跳,则会主动发起选举。

率先超时的节点,自增当前任期号然后切换为candidate状态,并投自己一票;然后以并行的方式发送RequestVote RPCs给集群中的其他服务器节点;最后等待其他节点的回复

如果赢得了选举,则成为leader

新的leader会立刻给所有节点发送消息,避免其他节点触发新的选举

如果其他节点赢得了选举,则自动切换为follower

如果一段时间内,没有收到majority投票,保持candidate状态,则重新发起选举

Raft为了避免出现上述问题,采用了随机选举超时时间,来确保很少产生无结果的投票,并且就算发生了也很快解决。选举超时时间是从一个固定的区间中随机选择。

raft.github.io

可以通过上面的链接来查看上述的动画

2.Raft协议下的消息复制

每个仲裁队列都有多个副本,包含一个主和多个从副本。客户端只会与主副本进行交互,然后主副本再将这些命令复制到从副本。当主副本下线,其中一个从副本就会被选举成为主副本,继续提供服务。

3.仲裁队列的使用

(1).创建仲裁队列

(2).观察管理平台

可以看到,有+2字样,标识这个队列有2个镜像节点。

4.宕机演示

目前来看,rabbit3为主副本,那么现在,我将rabbit3给停掉

可以看到,rabbit3已经停掉了

可以发现,消息依然存在

此时,rabbit节点成为了主副本

(四).HAProwy负载均衡

这里,讨论的是如何有效的对RabbitMQ集群使用软件负载均衡计数,目前主流的方式有在客户端实现负载均衡,或者使用HAProwy,LVS等负载均衡软件来实现。这里主要介绍HAProwy。

1.安装

HAProxy(High Availability Proxy)是⼀个开源的负载均衡器和TCP/HTTP应⽤程序的代理服务器, 它 被设计⽤来提供⾼可⽤性, 负载均衡和代理功能. HAProxy主要⽤于分发⽹络流量到多个后端服务器, 以提⾼⽹络的可靠性和性能。

#更新软件包
sudo apt-get update

#查找haproxy
sudo apt list|grep haproxy

#安装haproxy
sudo apt-get install haproxy

#查看服务状态
sudo systemctl status haproxy

#查看版本
haproxy -v

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

2.修改haproxy.cfg

在/etc/haproxy/haproxy.cfg 的文件中,追加下面的内容

# haproxy web 管理界面
listen stats #配置一个监听器
bind *:8100 #指定了监听器绑定到的IP地址和端口
mode http #监听器的工作模式为HTTP
stats enable #启用统计界面
stats realm Haproxy\\ Statistics
stats uri /
stats auth admin:admin #haproxy登录账号和密码
# 配置负载均衡
listen rabbitmq
bind *:5670 #监听器绑定到的IP地址和端⼝, 也就是集群前端IP, 供producer和consumer
来进⾏选择,由于5672端⼝已经默认使⽤, 这⾥选择5670端⼝
mode tcp#由于RabbitMQ使⽤AMQP协议,它是⼀个基于TCP的协议,所以这⾥使⽤TCP模
式
balance roundrobin #指定负载均衡策略为轮询
server rabbitmq1 127.0.0.1:5672 check inter 5000 rise 2 fall 3
server rabbitmq2 127.0.0.1:5673 check inter 5000 rise 2 fall 3
server rabbitmq3 127.0.0.1:5674 check inter 5000 rise 2 fall 3

server rabbitmq1 : 定义RabbitMQ服务的内部标识, 这⾥的rabbitmq1 是指haproxy内部使⽤的, 不是指RabbitMQ的节点名称。
127.0.0.1:5672 : RabbitMQ真实的IP和端⼝
check inter 5000 : 定义每隔多少毫秒检查RabbitMQ服务是否可⽤.
rise 2 : 定义RabbitMQ服务在发⽣故障之后,需要多少次健康检查才能被再次确认可⽤.
fall 3 : 定义需要经历多少次失败的健康检查之后,HAProxy才会停⽌使⽤此RabbitMQ服务

3.重启HAProxy

sudo systemctl restart haproxy

4.查看HAProxy

5.声明队列

6.测试

7.宕机测试

当我将rabbit节点停掉之后

主副本已经转移到了rabbit2上

8.恢复集群

当我将集群恢复之后,发现消息也是可以同步的

赞(0)
未经允许不得转载:171主机测评 » RabbitMQ---运维
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址