Docker安装过程,这里使用的是Docker Desktop,直接在官网下载完以后安装就好;具体的过程就不介绍了,与安装其他软件差不太多。
Rabbit MQ集群中的节点分为内存节点(RAM)
、磁盘节点(disk,消息持久化)
,每一个集群中都至少有一个磁盘节点;
RabbitMQ的集群有两种模式:普通模式(默认)
和镜像模式
;
普通模式
集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点,对于消费者来说,若消息进入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消息从A中取出,并经过B发送给消费者。
适合于消息无需持久化的场景,如日志队列。当队列非持久化,且创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化,只能等故障节点恢复。
缺点:无法解决单点故障问题。
镜像模式
与普通模式不同之处时消息实体会主动在镜像节点间同步
,而不是在取数据时临时拉取,高可用;镜像集群模式可以保证集群只要不全部宕机,数据就不会丢失,当相对于性能来说,镜像集群模式会比普通集群模式多出消耗数据的传输。
Docker Desktop安装完以后,就可以在PowerShell
中执行Docker脚本了,这里创建三个RabbitMQ的节点,使用Docker来拉取镜像,创建容器的过程如下:
# RabbitMQ01
docker run --name rabbitmq01 --hostname rabbitmq01 -v rabbimq01:/var/lib/rabbitmq -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
# RabbitMQ02
docker run --name rabbitmq02 --hostname rabbitmq02 -v rabbimq02:/var/lib/rabbitmq -d -p 15673:15672 -p 5673:5672 --link rabbitmq01:rabbitmq01 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
# RabbitMQ03
docker run --name rabbitmq03 --hostname rabbitmq03 -v rabbimq03:/var/lib/rabbitmq -d -p 15674:15672 -p 5674:5672 --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
Note:
a、创建时要注意使用
--hostname
来创建主机名称;
b、RABBITMQ_ERLANG_COOKIE
起到节点认证的作用,且集群内所有节点的值必须相同,集群部署时需要同步该值;
c、--link
(docker容器间互联的方法):单方向的互联
,先启动的容器只能用IP地址连接后启动的容器,后启动的容器可通过IP地址、容器名、别名进行连接。
完成以上的内容以后三个RabbitMQ的节点就算时创建完成了。
将节点添加到集群的命令如下:
#进入rabbitmq01容器,重新初始化一下,如果是新安装则reset可以忽略重置。
docker exec -it rabbitmq01 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
#进入rabbitmq02容器,重新初始化一下,将02节点加入到集群中
docker exec -it rabbitmq02 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #参数“--ram”表示设置为内存节点,忽略该参数默认为磁盘节点。 rabbit@rabbitmq01 为设置的主节点rabbitmq01
rabbitmqctl start_app
exit
#进入rabbitmq03容器,重新初始化一下,将03节点加入到集群中
docker exec -it rabbitmq03 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
完成以上步骤以后,一个普通模式
的集群就已经搭建完成了。
接下来将集群变更为镜像模式,使用的命令如下:
#随便进入一个容器
docker exec -it rabbitmq01 bash
#设置策略匹配所有名称是amp开头的队列都存储在2个节点上的命令如下
rabbitmqctl set_policy -p / ha "^amp*" '{"ha-mode":"exactly","ha-params":2}'
#或者
#设置策略匹配所有名称的队列都进行高可用配置
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
#查询策略
rabbitmqctl list_policies -p / #查看vhost下的所有的策略(policies )
# 使用set policy 命令设置镜像队列策略:
rabbitmqctl set_policy -p [virtualhost] [Name] [Pattern] [Definition] [Priority]
# virtualhost: 虚拟机名称
# Name:策略名称
# Pattern:正则表达式
# Definition:策略定义
# Priority:优先级
至此,集群的镜像模式也搭建完成。
这时访问http://localhost:15673
以后就可以显示如下的画面,所有的节点信息都会显示
以上的操作完成了RabbitMQ集群的搭建,但是在SpringBoot中对于集群的访问时,是按照配置的顺序执行的,只有第一个建立连接的节点挂掉以后才会去与第二个建立连接。如果要实现节点之间的负载均衡,就需要用到下面提到的代理工具HAProxy。
建置HAProxy的过程如下,首先进行HAProxy配置文档的配置:
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
chroot /usr/local/etc/haproxy
uid 99
gid 99
daemon
pidfile /var/run/haproxy.pid
defaults
log global
#使用4层代理模式,”mode http”为7层代理模式
mode tcp
#if you set mode to tcp,then you nust change tcplog into httplog
option tcplog
option dontlognull
retries 3
maxconn 2000
timeout connect 5s
#客户端空闲超时时间为 60秒 则HA 发起重连机制
timeout client 60s
#服务器端链接超时时间为 15秒 则HA 发起重连机制
timeout server 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 0.0.0.0:5679
#配置TCP模式
mode tcp
#简单的轮询
balance roundrobin
#rabbitmq集群节点配置
#inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
# 192.168.1.19 是主机的地址
server rabbitmq02 192.168.1.19:5673 check inter 5000 rise 2 fall 2
server rabbitmq03 192.168.1.19:5674 check inter 5000 rise 2 fall 2
server rabbitmq01 192.168.1.19:5675 check inter 5000 rise 2 fall 2
#配置haproxy web监控,查看统计信息
listen stats
bind 0.0.0.0:8100
mode http
option httplog
stats enable
#设置haproxy监控地址为http://127.0.0.1:8100/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 5s
stats auth admin:123456
关于HAProxy配置相关的更多内容可以参考:HAproxy的配置详解
建置HAProxy容器:
docker run -d --name haproxy8100 -p 5679:5679 -p 8100:8100 -v d:/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:1.9.6
然后在浏览器中输入http://localhost:8100/rabbitmq-stats
访问,画面如下:
这样就可以看到配置的三个节点以及当前的状态。