rabbitmq:3.7.17
docker相关知识
springboot项目
准备至少两台主机,可以是真实主机,也可以是虚拟机,并且保证在同一个内网中:
主机1:192.168.111.100
主机2:192.168.111.101
两台主机提前安装好docker备用
主机1执行:
docker run -d --hostname rabbit01 --add-host=rabbit02:192.168.111.101 --restart=unless-stopped --name mq01 --net host -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin123 -e RABBITMQ_ERLANG_COOKIE="rabbitmq_cookie" rabbitmq:3.7.17-management
主机2执行:
docker run -d --hostname rabbit02 --add-host rabbit01:192.168.111.100 --restart=unless-stopped --name mq02 --net host -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin123 -e RABBITMQ_ERLANG_COOKIE="rabbitmq_cookie" rabbitmq:3.7.17-management
参数讲解:
-d 容器后台运行
--hostname rabbit01 容器的主机名为 rabbit01
--add-host rabbit02:xxxx 修改容器内部的hosts,添加的集群服务器都需要添加进来
--restart=unless-stopped docker容器重启后重启MQ
--name mq01 容器名为mq01,在宿主机上运行“docker ps”命令时显示的名称
--net host 容器和宿主机共用网络
-p 8072:5672 消息通讯端口
-p 8172:15672 后台管理端口
-e RABBITMQ_ERLANG_COOKIE 设置Erlang Cookie值,此值必须相同
-e RABBITMQ_DEFAULT_USER=admin 登录账号
-e RABBITMQ_DEFAULT_PASS=admin123 登录密码
验证:
访问http://192.168.111.100:15672/ 和 http://192.168.111.101:15672/
第一台服务器重启为主节点
# 进入docker容器
docker exec -it mq01 /bin/bash
# 停止应用
rabbitmqctl stop_app
# 重置应用
rabbitmqctl reset
# 开启应用
rabbitmqctl start_app
# 查看集群状态
rabbitmqctl cluster_status
# 退出docker容器
exit
第二台服务器加入到主节点
docker exec -it mq02 bash
rabbitmqctl stop_app
rabbitmqctl reset
# rabbit01是第一台主机的主机名,--ram 代表设置为内存节点,不使用则默认为磁盘节点,必须保证集群中至少有一个磁盘节点
rabbitmqctl join_cluster rabbit@rabbit01 或者 rabbitmqctl join_cluster --ram rabbit@rabbit01
rabbitmqctl start_app
rabbitmqctl cluster_status
exit
在任意一个节点执行:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
查看策略:
rabbitmqctl list_policies
在其它节点查看策略:
rabbitmqctl list_policies
Name:policy的名称
Pattern: queue的匹配模式(正则表达式)
priority:可选参数,policy的优先级
Definition:镜像定义,包括三个部分ha-mode、ha-params、ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic(自动)和manual(手动)
验证结果:
进入任意一台rabbitmq管理后台,首页查看:
在任意一台rabbitmq上面增加交换机和队列,另一台会自动同步。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
spring:
rabbitmq:
addresses: 192.168.111.100:5672,192.168.111.101:5672 #指定client连接到的server的地址,多个以逗号分隔
password: admin
username: 123456