使用docker搭建RabbitMQ集群
docker运行RabbitMQ容器
docker使用参考:Docker、Docker compose实战
docker run -d --hostname rabbit01 --name myrabbit01 -p 5672:5672 -p 15672:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=886291 rabbitmq:management
docker run -d --hostname rabbit02 --name myrabbit02 -p 5673:5672 --link myrabbit01:rabbit01 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management
docker run -d --hostname rabbit03 --name myrabbit03 -p 5674:5672 --link myrabbit01:rabbit01 --link myrabbit02:rabbit02 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management
参数说明
- -d:以后台进程运行
- –hostname rabbit01:RabbitMQ主机名称
- –name:容器名称
- -p:端口映射(宿主机端口:容器内端口),5672:amqp访问端口,15672:http访问端口
注意点
1.使用:http://宿主ip:15672 访问,用户名密码使用默认:guest/guest。
2.多个容器之间使用“–link”连接,此属性不能少;
3.Erlang Cookie值必须相同,也就是RABBITMQ_ERLANG_COOKIE参数的值必须相同,原因见下文“配置相同Erlang Cookie”部分;
使用镜像搭建集群,docker-compose.xml配置见下面的github具体配置.
加入RabbitMQ节点到集群
启动了3个节点,1个磁盘节点和2个内存节点。在RabbitMQ集群里,必须至少有一个磁盘节点存在。
- RAM Node:内存节点,将所有的队列,交换机, 绑定,用户 权限与vhost的元数据存储在内存中,可以让队列和交换机声明更加的便捷。
- Disk Node:将元数据存储在磁盘中,单节点系统,只运行 磁盘类型的节点,防止重启RabbitMQ时,丢失系统的配置信息。
#设置节点1,加入到集群:
docker exec -it myrabbit01 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
#执行完之后分别在每台机器上查看节点状态
rabbitmqctl cluster_status
exit
#设置节点2,加入到集群:
docker exec -it myrabbit02 bash
rabbitmqctl stop_app
rabbitmqctl reset
# --ram指的是作为内存节点,不配置的--ram的话默认为磁盘节点
rabbitmqctl join_cluster --ram rabbit@rabbit01
rabbitmqctl start_app
#执行完之后分别在每台机器上查看节点状态
rabbitmqctl cluster_status
exit
#设置节点3,加入到集群:
docker exec -it myrabbit03 bash
rabbitmqctl stop_app
rabbitmqctl reset
# --ram指的是作为内存节点,不配置的--ram的话默认为磁盘节点
rabbitmqctl join_cluster --ram rabbit@rabbit01
rabbitmqctl start_app
#执行完之后分别在每台机器上查看节点状态
rabbitmqctl cluster_status
exit
参数“--ram”表示设置为内存节点,忽略此参数默认为磁盘节点。
配置相同Erlang Cookie
RabbitMQ是用Erlang实现的,Erlang Cookie相当于不同节点之间相互通讯的秘钥,Erlang节点通过交换Erlang Cookie获得认证。
添加镜像策略
基于普通模式集群,在策略里面添加镜像策略即可。把需要的队列做成镜像队列,属于HA方案。该模式解决了普通模式中的问题,根本区别在于消息实体会主动在镜像节点间同步,而不是在客户端拉取数据时临时拉取。当然弊端就是降低系统性能,大量消息写入,集群内的网路带宽会被大大消耗。
#进入jt_rabbitmq01的容器内
docker exec -it jt_rabbitmq01 bash
#执行下面命令
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
docker-compose
docker-compose.yml
- rabbitmq1
version: "3"
services:
rabbitmq1:
image: rabbitmq:3.8.3-management
container_name: rabbitmq1
restart: always
privileged: true
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitcookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=886291
ports:
- "5672:5672"
- "4369:4369"
- "1883:1883"
- "15672:15672"
- "25672:25672"
volumes:
- /jianda/rabbitmq1:/var/lib/rabbitmq:z
- rabbitmq2
version: "3"
services:
rabbitmq2:
image: rabbitmq:3.8.3-management
container_name: rabbitmq2
restart: always
privileged: true
extra_hosts:
- "rabbitmq1:10.10.9.155"
environment:
- CLUSTERED=true
- CLUSTER_WITH=rabbitmq1
- RAM_NODE=true
- TZ=Asia/Shanghai
- RABBITMQ_ERLANG_COOKIE=rabbitcookie
hostname: rabbitmq2
ports:
- "5672:5672"
- "4369:4369"
- "1883:1883"
- "15672:15672"
- "25672:25672"
volumes:
- /jianda/rabbitmq2:/var/lib/rabbitmq:z
- rabbitmq3
version: "3"
services:
rabbitmq3:
image: rabbitmq:3.8.3-management
container_name: rabbitmq3
restart: always
privileged: true
extra_hosts:
- "rabbitmq1:10.10.9.155"
- "rabbitmq2:10.10.9.156"
environment:
- CLUSTERED=true
- CLUSTER_WITH=rabbitmq1
- RAM_NODE=true
- TZ=Asia/Shanghai
- RABBITMQ_ERLANG_COOKIE=rabbitcookie
hostname: rabbitmq3
external_links:
- rabbitmq1:172.***.***.27
ports:
- "5672:5672"
- "4369:4369"
- "1883:1883"
- "15672:15672"
- "25672:25672"
volumes:
- /zimo/rabbitmq3:/var/lib/rabbitmq:z