如果使用docker安装,无需关注erlang版本适配
1. 单机
docker pull rabbitmq:management
docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:management
2. 集群
2.1 第1台主机
- docker-compose.yml
version: '3'
services:
rabbit1:
container_name: rabbit1
image: rabbitmq:management
restart: always
hostname: rabbit1
extra_hosts:
- "rabbit1:192.168.95.36"
- "rabbit2:192.168.95.37"
- "rabbit3:192.168.95.38"
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=passw0rd
ports:
- "4369:4369"
- "5671:5671"
- "5672:5672"
- "15670:15670"
- "15671:15671"
- "15672:15672"
- "15674:15674"
- "15692:15692"
- "25672:25672"
- "61613:61613"
- docker-compose-plugins.yml
version: '3'
services:
rabbit1:
container_name: rabbit1
image: rabbitmq:3.11.2-management
restart: always
hostname: rabbit1
extra_hosts:
- "rabbit1:192.168.95.36"
- "rabbit2:192.168.95.37"
- "rabbit3:192.168.95.38"
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=passw0rd
volumes:
- "./plugins.erl:/etc/rabbitmq/enabled_plugins"
ports:
- "1883:1883"
- "4369:4369"
- "5671:5671"
- "5672:5672"
- "15670:15670"
- "15671:15671"
- "15672:15672"
- "15674:15674"
- "15692:15692"
- "25672:25672"
- "61613:61613"
- plugins.erl
[rabbitmq_delayed_message_exchange, rabbitmq_management, rabbitmq_mqtt, rabbitmq_stomp, rabbitmq_web_stomp, rabbitmq_web_stomp_examples].
2.2 第2台主机
- docker-compose.yml
version: '3'
services:
rabbit1:
container_name: rabbit2
image: rabbitmq:3.11.2-management
restart: always
hostname: rabbit2
extra_hosts:
- "rabbit1:192.168.95.36"
- "rabbit2:192.168.95.37"
- "rabbit3:192.168.95.38"
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=passw0rd
ports:
- "4369:4369"
- "5671:5671"
- "5672:5672"
- "15670:15670"
- "15671:15671"
- "15672:15672"
- "15674:15674"
- "15692:15692"
- "25672:25672"
- "61613:61613"
- docker-compose-plugins.yml
version: '3'
services:
rabbit1:
container_name: rabbit2
image: rabbitmq:3.11.2-management
restart: always
hostname: rabbit2
extra_hosts:
- "rabbit1:192.168.95.36"
- "rabbit2:192.168.95.37"
- "rabbit3:192.168.95.38"
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=passw0rd
volumes:
- "./plugins.erl:/etc/rabbitmq/enabled_plugins"
ports:
- "1883:1883"
- "4369:4369"
- "5671:5671"
- "5672:5672"
- "15670:15670"
- "15671:15671"
- "15672:15672"
- "15674:15674"
- "15692:15692"
- "25672:25672"
- "61613:61613"
- plugins.erl
[rabbitmq_delayed_message_exchange, rabbitmq_management, rabbitmq_mqtt, rabbitmq_stomp, rabbitmq_web_stomp, rabbitmq_web_stomp_examples].
2.3 第3台主机
- docker-compose.yml
version: '3'
services:
rabbit1:
container_name: rabbit3
image: rabbitmq:management
restart: always
hostname: rabbit3
extra_hosts:
- "rabbit1:192.168.95.36"
- "rabbit2:192.168.95.37"
- "rabbit3:192.168.95.38"
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=passw0rd
ports:
- "4369:4369"
- "5671:5671"
- "5672:5672"
- "15670:15670"
- "15671:15671"
- "15672:15672"
- "15674:15674"
- "15692:15692"
- "25672:25672"
- "61613:61613"
- docker-compose-plugins.yml
version: '3'
services:
rabbit1:
container_name: rabbit3
image: rabbitmq:management
restart: always
hostname: rabbit3
extra_hosts:
- "rabbit1:192.168.95.36"
- "rabbit2:192.168.95.37"
- "rabbit3:192.168.95.38"
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=passw0rd
volumes:
- "./plugins.erl:/etc/rabbitmq/enabled_plugins"
ports:
- "1883:1883"
- "4369:4369"
- "5671:5671"
- "5672:5672"
- "15670:15670"
- "15671:15671"
- "15672:15672"
- "15674:15674"
- "15692:15692"
- "25672:25672"
- "61613:61613"
- plugins.erl
[rabbitmq_delayed_message_exchange, rabbitmq_management, rabbitmq_mqtt, rabbitmq_stomp, rabbitmq_web_stomp, rabbitmq_web_stomp_examples].
- 分别启动
cd /usr/local/docker/rabbitmq
docker-compose up -d
- 分别启动(插件版)
cd /usr/local/docker/rabbitmq
docker-compose -f docker-compose-plugins.yml up -d
- 加入集群
默认情况下,RabbitMQ 启动后是磁盘节点,如果想以内存节点方式加入,可以加 —ram 参数。 如果想要修改节点类型,可以使用命令:
# docker exec -it rabbit2 /bin/bash
rabbit2# rabbitmqctl stop_app
rabbit2# rabbitmqctl reset
rabbit2# rabbitmqctl join_cluster rabbit@rabbit1
rabbit2# rabbitmqctl start_app
修改节点类型之前需要先
rabbitmqctl change_cluster_node_type disc(ram)
<font style="color:rgb(36, 41, 47);"> rabbitmqctl stop_app</font>
。
通过下面命令来查看集群状态:
注意,由于 RAM 节点仅将内部数据库表存储在内存中,因此在内存节点启动时必须从其他节点同步这些数据,所以一个集群必须至少包含一个磁盘节点。
rabbitmqctl cluster_status
集群模式( 镜像集群)
在我们使用 rabbitmq 作为消息服务时,在服务负载不是很大的情况下,一般我们只需要一个 rabbitmq 节点便能为我们提供服务,可这难免会发生单点故障,要解决这个问题,我们便需要配置 rabbitmq 的集群和镜像。
:::info
镜像模式参数
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
[-p Vhost] : 可选参数,针对指定vhost下的queue进行设置 Name: policy的名称 Pattern: exchanges或queue的匹配模式(正则表达式) Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-modeha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
- [x] all:表示在集群中所有的节点上进行镜像
- [x] exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
- [x] nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定 ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual。 - [x] automatic:新增加节点自动同步全量数据。 - [x] manual: 新增节点只同步新增数据,全量数据需要手工同步。 [Priority] :可选参数,policy的优先级 ::: :::color5 进入任意一个RabbitMQ节点,执行如下命令:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
可以设置镜像队列,”^”表示匹配所有队列,即所有队列在各个节点上都会有备份。
在集群中,只需要在一个节点上设置镜像队列,设置操作会同步到其他节点**。
+ 查看当前策略
rabbitmqctl list_policies
+ 删除策略**
rabbitmqctl clear_policy ha-all
:::
#### 3. 插件
##### 3.1 不进入容器
erlang
查看安装的插件
docker exec rabbit1 rabbitmq-plugins list

- E 显式启用
- e 隐式启用
:::
启用插件
docker exec rabbit1 rabbitmq-plugins enable rabbitmq_delayed_message_exchange
禁用插件
docker exec rabbit1 rabbitmq-plugins disable rabbitmq_delayed_message_exchange
部署在容器中,需重启容器生效
docker exec -it rabbit1
3.2 进入容器
docker exec -it rabbit1 bash
或者
docker exec -it rabbit1 /bin/bash
查看安装的插件
rabbitmq-plugins list
启用插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
禁用插件
rabbitmq-plugins disable rabbitmq_delayed_message_exchange
重启生效
rabbitmqctl stop :因为rabbitmqctl是没有restart命令的,所以重启rabbitmq服务需要这么两步
rabbitmq-server restart : 重启rabbitmq
如果需安装对应版本的插件,比如mq的延时队列插件(rabbitmq_delayed_message_exchange)
cd ./plugins
wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.11.1/rabbitmq_delayed_message_exchange-3.11.1.ez
4. 负载均衡
ha 同样采用 Docker 方式来部署,先看一下 haproxy.cfg 配置文件:
# Simple configuration for an HTTP proxy listening on port 80 on all
# interfaces and forwarding requests to a single backend "servers" with a
# single server "server1" listening on 127.0.0.1:8000
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms
listen rabbitmq_cluster
bind *:5672
option tcplog
mode tcp
balance leastconn
server rabbit1 192.168.95.36:5672 weight 1 check inter 2s rise 2 fall 3
server rabbit2 192.168.95.37:5672 weight 1 check inter 2s rise 2 fall 3
server rabbit3 192.168.95.38:5672 weight 1 check inter 2s rise 2 fall 3
listen http_front
bind 0.0.0.0:8002
stats uri /haproxy?stats
listen rabbitmq_admin
bind *:8001
server rabbit1 192.168.95.36:15672
server rabbit2 192.168.95.37:15672
server rabbit3 192.168.95.38:15672
- docker-compose.yml
启动之后,就可以通过 ha 的地址来访问 RabbitMQ 集群管理页面了。 如果公司内部有现成的负载均衡,比如 LVS,那么也可以省略这一步。
version: '3'
services:
haproxy:
container_name: haproxy
image: haproxy:latest
restart: always
network_mode: host
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
ports:
- "5672:5672"
- "8001:8001"
- "8002:8002"