rabbitmq集群
多机多节点
由于多机多节点是在通过同一个局域网内,多个机器,多个服务器,每个服务器上面部署不同的rabbitmq节点。
单机多节点
单机多节点比如在一个机器上面部署多个rabbitmq服务,也会称之为伪节点。由于这里我们只有一个服务器,我们就使用单机多节点。
基于ubuntu的单机多节点搭建:
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的端口号,并且云服务器也要开放,并且要设置账号密码才能在web页面查看。
停滞节点并且重置
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
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset
这里的名称需要和上面定义的名称,如果定义的名称是rabbit2,那就是rabbit2.
接着就是添加集群了。
rabbitmqctl -n rabbit2 join_cluster rabbit@iZf8ziwyfxxz8w9blmn9sjZ
rabbitmqctl -n rabbit3 join_cluster rabbit@iZf8ziwyfxxz8w9blmn9sjZ
这时候就在单机上面添加好了节点了。
此时可以看到节点加入成功了,但是没有成功运行。
重启rabbitmq节点。
rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 start_app
此时rabbitmq的节点就已经搭建起来了。
宕机演示
添加集群之后我们的web账号就可以互相登录了。
在其中一个添加队列,另外两个节点也会自动添加队列。rabbit主节点关闭后,队列的从节点的数据也会丢失。
仲裁队列
基于raft队列实现的算法持久化,仲裁队列是基于raft一致性算法实现的队列。仲裁队列提供了队列的复制能力,保障数据的高可用性和安全性。从而一个节点宕机的时候,其他节点还是可以提供服务。
共识算法:
它允许多个分布式节点就某一系列值构成某种协议,即使某个节点发生故障,共识算法也能保障数据的一致性。raft算法就是一种新的共识算法,是paxos的升级版本。
raft算法
用于管理和维护分布式系统的一致性算法,他是一个共识算法,对数据进行复制到其他节点,raft是使用quorum来实现容错的,对队列的操作必须要大于n/2节点以上的同意才可以。这里的节点就是分布式系统中的成员。
raft核心就是选出主节点,其他节点是从节点,主节点负责接收客户端发来的请求,将操作包装好发给从节点,选出主节点然后日志复制,日志安全性。
领导者:选出主节点之后,主节点用于处理复制给其他从节点,给从节点发送心跳包,告诉他们现在我还是主节点。
跟随者:接受来自主节点的复制条目等等内容,但是不直接处理客户端请求。
候选人:如果没有收到心跳包,跟随者变成候选人,然后发起投票,投票自己能不能成为领导者。没有赢得选举的话就还是跟随者。
任期:
正常选举的任期就是leader的开始到结束,但是如果没有选举出来leader,那就会进行下一轮任期,这一轮任期直接跳过重新选举。通信的时候会带上该任期,来判断。比如主节点挂了但是忽然又好了,但是这时候从节点已经选举出来leader,但是这时候从节点就不认你了,因为他们进入一个新的任期,只能做小弟了。
raft算法中最主要的两类通信方式:
选举过程:
如果在规定时间内没有收到leader的消息,节点就会主动要求选举。
其中有一个节点就已经超过超时时间了,就会想要当leader,把任期加一,并且给自己投一票,然后给每个从节点发送一个requestvote rpcs,让他们投给自己。
- 赢得选举。
- 其他节点赢得选举。
- 一段时间后没有收到投票,保持候选人状态,继续发起选举。
每个节点在任期内只有一票,先收到哪个请求,基本上就是投给那个节点。任期要大于等于自己的节点才会给你投票。并且迅速广而告之。
当出现每个人都把票投给自己这样的情况下死机,raft采用了随机选举超时时间,来确保发生这样非常极端的情况。 比如某两个节点得票数一样,那就会进入新一轮选举,新一轮的选举两节点就会设置随机选举超时时间。
日志复制
客户端发送请求给leader节点,那么leader节点就会在收到请求同时发送给从节点,其他节点也就记录这些请求。
可以在mq的web页面中设置仲裁队列。
客户端和mq之间通过客户端和主节点之间进行通信,主节点丢失的时候会选举出新的主节点。
仲裁队列的使用
先定义queue。
@Bean
public Queue quorumQueue(){
return QueueBuilder.durable("quorum_queue").quorum().build();
}
这时候就看见仲裁队列就已经启动好了,登录另外一个mq的web界面。这里的+2就是两个副本,也就是两个镜像。
rabbit就是leader,仲裁队列可以显示成员和leader,但是在普通队列中却没有。当我们将某个mq服务断掉了。
就可以看到后面的+2,变成+1。仲裁队列默认镜像数是5,也就是一个主节点,4个从节点。
负载均衡
当某个节点压力比较大,很容易导致节点挂掉,负载均衡可以相对平衡分配。
使用Haproxy实现负载均衡。
安装hapoxy
更新软件包。
sudo apt-get update
查找haproxy。
sudo apt list|grep haproxy
安装haproxy。
sudo apt-get install haproxy
查看haproxy状态
sudo systemctl status haproxy
接着修改文件
vim /etc/haproxy/haproxy.cfg
然后在配置文件中添加以下内容:
# haproxy web 管理界面
listen stats
bind *:8100
mode http
stats enable
stats realm Haproxy\ Statistics
stats uri /
stats auth admin:admin
# 配置负载均衡
listen rabbitmq
bind *:5670
mode 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
最后就是重启hapoxy。
sudo systemctl restart haproxy
使用hapoxy
把idea中的配置改成5670,这时候就可以使用该端口号进行负载均衡。
如果hapoxy也挂掉了怎么办,那就要涉及到当hapoxy挂掉的时候,切换到其他节点,当然了这里我们就不过多阐述。