-清理单机和网络开发
1.关闭原先的单节点 2.阿里网络安全组开放对应的端口 3.防火墙一定要关闭
-准备3个节点安装好rabbitmq,形成集群 (记得每个节点间隔几十秒再启动,如果失败删除宿主机文件重新搭建)
#节点一,主节点,创建-v映射目录
docker run -d --hostname rabbit_host1 --name rabbitmq1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_NODENAME=rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_cookie='rabbitmq_cookie_admin' --privileged=true -v /usr/local/rabbitmq/1/lib:/var/lib/rabbitmq -v /usr/local/rabbitmq/1/log:/var/log/rabbitmq rabbitmq:management
#节点二,创建-v映射目录
docker run -d --hostname rabbit_host2 --name rabbitmq2 -p 15673:15672 -p 5673:5672 --link rabbitmq1:rabbit_host1 -e RABBITMQ_NODENAME=rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_cookie='rabbitmq_cookie_admin' --privileged=true -v /usr/local/rabbitmq/2/lib:/var/lib/rabbitmq -v /usr/local/rabbitmq/2/log:/var/log/rabbitmq rabbitmq:management
#节点三,创建-v映射目录
docker run -d --hostname rabbit_host3 --name rabbitmq3 -p 15674:15672 -p 5674:5672 --link rabbitmq1:rabbit_host1 --link rabbitmq2:rabbit_host2 -e RABBITMQ_NODENAME=rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_cookie='rabbitmq_cookie_admin' --privileged=true -v /usr/local/rabbitmq/3/lib:/var/lib/rabbitmq -v /usr/local/rabbitmq/3/log:/var/log/rabbitmq rabbitmq:management
参数说明
-
–hostname 自定义Docker容器的 hostname
配置hostname需要在vim /etc/hosts
比如
192.168.115.136 rabbit_host1
192.168.115.138 rabbit_host2
192.168.115.139 rabbit_host3
-
–link 容器之间连接,link不可或缺,使得三个容器能互相通信
- –privileged=true 使用该参数,container内的root拥有真正的root权限,否则容器出现permission denied
- -v 宿主机和容器路径映射
参数 RABBITMQ_NODENAME,缺省 Unix*: rabbit@$HOSTNAME
参数 RABBITMQ_DEFAULT_USER=admin
参数 RABBITMQ_DEFAULT_PASS=xdclass.net168
- Erlang cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_cookie 参数的值必须相同,
相当于不同节点之间通讯的密钥,erlang.cookie是erlang的分布式token文件,集群内各个节点的erlang.cookie需要相同,才可以互相通信
配置集群
节点一配置集群
docker exec -it rabbitmq1 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app exit
节点二加入集群,–ram是以内存方式加入,忽略该参数默认为磁盘节点。
docker exec -it rabbitmq2 bash rabbitmqctl stop_app rabbitmqctl join_cluster --ram rabbit@rabbit_host1 rabbitmqctl start_app exit
节点三加入集群,–ram是以内存方式加入,忽略该参数默认为磁盘节点。
docker exec -it rabbitmq3 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbit_host1 rabbitmqctl start_app exit
#查看集群节点状态,配置启动了3个节点,1个磁盘节点和2个内存节点
- rabbitmqctl cluster_status
访问节点一的web管控台,可以看到多个节点
到此为止,我们已经完成了RabbitMQ普通模式集群的建立,启动了3个节点,1个磁盘节点和2个内存节点
测试
node1 主节点创建队列,发送消息 (可以选择消息是否持久化)
node2和node3通过节点自身的web管控台可以看到队列和消息
问题:如果把node1节点停止,node2和node3会收不到消息
备注:如果是在非主节点(非磁盘节点)创建队列和发送消息,则其他队列可以显示
背景
上面搭建了普通集群,如果磁盘节点挂掉后,如果没开启持久化数据就丢失了,其他节点也无法获取消息,所以我们这个集群方案需要进一步改造为镜像模式集群。
策略policy介绍
rabbitmq的策略policy是用来控制和修改集群的vhost队列和Exchange复制行为
就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步
创建一个策略来匹配队列
-
路径:rabbitmq管理页面 —> Admin —> Policies —> Add / update a policy
-
参数: 策略会同步同一个VirtualHost中的交换器和队列数据
1.name:自定义策略名称 2.Pattern:^ 匹配符,代表匹配所有 3.Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)
ha-mode: 指明镜像队列的模式,可选下面的其中一个 all:表示在集群中所有的节点上进行镜像同步(一般都用这个参数) exactly:表示在指定个数的节点上进行镜像同步,节点的个数由ha-params指定 nodes:表示在指定的节点上进行镜像同步,节点名称通过ha-params指定 ha-sync-mode:镜像消息同步方式 automatic(自动),manually(手动)
配置好后,+2的意思是有三个节点,一个节点本身和两个镜像节点, 且可以看到策略名称 xdclass_mirror
- 集群重启顺序
集群重启的顺序是固定的,并且是相反的 启动顺序:磁盘节点 => 内存节点 关闭顺序:内存节点 => 磁盘节点 最后关闭必须是磁盘节点,否则容易造成集群启动失败、数据丢失等异常情况SpringBoot AMQP单机配置
spring:
rabbitmq:
host: 10.211.55.13
port: 5672
virtual-host: /
password: guest
username: guest
# 投递到交换机
publisher-/confirm/i-type: correlated
# 交换机到队列
publisher-returns: true
##指定消息在没有被队列接收时是否强行退回还是直接丢弃,true是退回
template:
mandatory: true
#开启手动确认消息,如果消息重新入对则会一直重试,可以配置重试次数
listener:
simple:
acknowledge-mode: manual
高可用镜像集群配置
#消息队列
spring:
rabbitmq:
addresses: 10.211.55.13:5672,10.211.55.13:5673,10.211.55.13:5674
virtual-host: /dev
password: admin
username: admin
#开启消息二次确认,生产者到broker的交换机
publisher-/confirm/i-type: correlated
#开启消息二次确认,交换机到队列的可靠性投递
publisher-returns: true
#为true,则交换机处理消息到路由失败,则会返回给生产者
template:
mandatory: true
#消息手工确认ACK
listener:
simple:
acknowledge-mode: manual
-
高可用集群测试
关闭消费者监听 生产者发送一个消息 停止节点一和节点二,web管控台访问不了 启动消费者监听,可以消费到消息



