如果使用docker安装,无需关注erlang版本适配

1. 单机

  1. docker pull rabbitmq:management
  2. docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:management

2. 集群

2.1 第1台主机
  • docker-compose.yml
  1. version: '3'
  2. services:
  3. rabbit1:
  4. container_name: rabbit1
  5. image: rabbitmq:management
  6. restart: always
  7. hostname: rabbit1
  8. extra_hosts:
  9. - "rabbit1:192.168.95.36"
  10. - "rabbit2:192.168.95.37"
  11. - "rabbit3:192.168.95.38"
  12. environment:
  13. - RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
  14. - RABBITMQ_DEFAULT_USER=admin
  15. - RABBITMQ_DEFAULT_PASS=passw0rd
  16. ports:
  17. - "4369:4369"
  18. - "5671:5671"
  19. - "5672:5672"
  20. - "15670:15670"
  21. - "15671:15671"
  22. - "15672:15672"
  23. - "15674:15674"
  24. - "15692:15692"
  25. - "25672:25672"
  26. - "61613:61613"
  • docker-compose-plugins.yml
  1. version: '3'
  2. services:
  3. rabbit1:
  4. container_name: rabbit1
  5. image: rabbitmq:3.11.2-management
  6. restart: always
  7. hostname: rabbit1
  8. extra_hosts:
  9. - "rabbit1:192.168.95.36"
  10. - "rabbit2:192.168.95.37"
  11. - "rabbit3:192.168.95.38"
  12. environment:
  13. - RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
  14. - RABBITMQ_DEFAULT_USER=admin
  15. - RABBITMQ_DEFAULT_PASS=passw0rd
  16. volumes:
  17. - "./plugins.erl:/etc/rabbitmq/enabled_plugins"
  18. ports:
  19. - "1883:1883"
  20. - "4369:4369"
  21. - "5671:5671"
  22. - "5672:5672"
  23. - "15670:15670"
  24. - "15671:15671"
  25. - "15672:15672"
  26. - "15674:15674"
  27. - "15692:15692"
  28. - "25672:25672"
  29. - "61613:61613"
  • plugins.erl
  1. [rabbitmq_delayed_message_exchange, rabbitmq_management, rabbitmq_mqtt, rabbitmq_stomp, rabbitmq_web_stomp, rabbitmq_web_stomp_examples].
2.2 第2台主机
  • docker-compose.yml
  1. version: '3'
  2. services:
  3. rabbit1:
  4. container_name: rabbit2
  5. image: rabbitmq:3.11.2-management
  6. restart: always
  7. hostname: rabbit2
  8. extra_hosts:
  9. - "rabbit1:192.168.95.36"
  10. - "rabbit2:192.168.95.37"
  11. - "rabbit3:192.168.95.38"
  12. environment:
  13. - RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
  14. - RABBITMQ_DEFAULT_USER=admin
  15. - RABBITMQ_DEFAULT_PASS=passw0rd
  16. ports:
  17. - "4369:4369"
  18. - "5671:5671"
  19. - "5672:5672"
  20. - "15670:15670"
  21. - "15671:15671"
  22. - "15672:15672"
  23. - "15674:15674"
  24. - "15692:15692"
  25. - "25672:25672"
  26. - "61613:61613"
  • docker-compose-plugins.yml
  1. version: '3'
  2. services:
  3. rabbit1:
  4. container_name: rabbit2
  5. image: rabbitmq:3.11.2-management
  6. restart: always
  7. hostname: rabbit2
  8. extra_hosts:
  9. - "rabbit1:192.168.95.36"
  10. - "rabbit2:192.168.95.37"
  11. - "rabbit3:192.168.95.38"
  12. environment:
  13. - RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
  14. - RABBITMQ_DEFAULT_USER=admin
  15. - RABBITMQ_DEFAULT_PASS=passw0rd
  16. volumes:
  17. - "./plugins.erl:/etc/rabbitmq/enabled_plugins"
  18. ports:
  19. - "1883:1883"
  20. - "4369:4369"
  21. - "5671:5671"
  22. - "5672:5672"
  23. - "15670:15670"
  24. - "15671:15671"
  25. - "15672:15672"
  26. - "15674:15674"
  27. - "15692:15692"
  28. - "25672:25672"
  29. - "61613:61613"
  • plugins.erl
  1. [rabbitmq_delayed_message_exchange, rabbitmq_management, rabbitmq_mqtt, rabbitmq_stomp, rabbitmq_web_stomp, rabbitmq_web_stomp_examples].
2.3 第3台主机
  • docker-compose.yml
  1. version: '3'
  2. services:
  3. rabbit1:
  4. container_name: rabbit3
  5. image: rabbitmq:management
  6. restart: always
  7. hostname: rabbit3
  8. extra_hosts:
  9. - "rabbit1:192.168.95.36"
  10. - "rabbit2:192.168.95.37"
  11. - "rabbit3:192.168.95.38"
  12. environment:
  13. - RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
  14. - RABBITMQ_DEFAULT_USER=admin
  15. - RABBITMQ_DEFAULT_PASS=passw0rd
  16. ports:
  17. - "4369:4369"
  18. - "5671:5671"
  19. - "5672:5672"
  20. - "15670:15670"
  21. - "15671:15671"
  22. - "15672:15672"
  23. - "15674:15674"
  24. - "15692:15692"
  25. - "25672:25672"
  26. - "61613:61613"
  • docker-compose-plugins.yml
  1. version: '3'
  2. services:
  3. rabbit1:
  4. container_name: rabbit3
  5. image: rabbitmq:management
  6. restart: always
  7. hostname: rabbit3
  8. extra_hosts:
  9. - "rabbit1:192.168.95.36"
  10. - "rabbit2:192.168.95.37"
  11. - "rabbit3:192.168.95.38"
  12. environment:
  13. - RABBITMQ_ERLANG_COOKIE=rabbitmq_cookie
  14. - RABBITMQ_DEFAULT_USER=admin
  15. - RABBITMQ_DEFAULT_PASS=passw0rd
  16. volumes:
  17. - "./plugins.erl:/etc/rabbitmq/enabled_plugins"
  18. ports:
  19. - "1883:1883"
  20. - "4369:4369"
  21. - "5671:5671"
  22. - "5672:5672"
  23. - "15670:15670"
  24. - "15671:15671"
  25. - "15672:15672"
  26. - "15674:15674"
  27. - "15692:15692"
  28. - "25672:25672"
  29. - "61613:61613"
  • plugins.erl
  1. [rabbitmq_delayed_message_exchange, rabbitmq_management, rabbitmq_mqtt, rabbitmq_stomp, rabbitmq_web_stomp, rabbitmq_web_stomp_examples].
  • 分别启动
  1. cd /usr/local/docker/rabbitmq
  2. docker-compose up -d
  • 分别启动(插件版)
  1. cd /usr/local/docker/rabbitmq
  2. docker-compose -f docker-compose-plugins.yml up -d
  • 加入集群
如果将 rabbit1 作为主节点的话,需要在 rabbit2 上执行命令,将其加入到集群,如下:
  1. # docker exec -it rabbit2 /bin/bash
  2. rabbit2# rabbitmqctl stop_app
  3. rabbit2# rabbitmqctl reset
  4. rabbit2# rabbitmqctl join_cluster rabbit@rabbit1
  5. rabbit2# rabbitmqctl start_app
默认情况下,RabbitMQ 启动后是磁盘节点,如果想以内存节点方式加入,可以加 —ram 参数。 如果想要修改节点类型,可以使用命令:
  1. rabbitmqctl change_cluster_node_type disc(ram)
修改节点类型之前需要先<font style="color:rgb(36, 41, 47);"> rabbitmqctl stop_app</font> 通过下面命令来查看集群状态:
  1. rabbitmqctl cluster_status
注意,由于 RAM 节点仅将内部数据库表存储在内存中,因此在内存节点启动时必须从其他节点同步这些数据,所以一个集群必须至少包含一个磁盘节点。
  • 集群模式( 镜像集群)

    在我们使用 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-mode
ha-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 rabbitmq - 图1 :::color4 有 E 或* e 标志的则为启用的插件
  • E 显式启用
  • e 隐式启用

:::

  1. 启用插件
  2. docker exec rabbit1 rabbitmq-plugins enable rabbitmq_delayed_message_exchange
  3. 禁用插件
  4. docker exec rabbit1 rabbitmq-plugins disable rabbitmq_delayed_message_exchange
  5. 部署在容器中,需重启容器生效
  6. docker exec -it rabbit1
3.2 进入容器
  1. docker exec -it rabbit1 bash
  2. 或者
  3. docker exec -it rabbit1 /bin/bash

rabbitmq - 图2

  1. 查看安装的插件
  2. rabbitmq-plugins list
  3. 启用插件
  4. rabbitmq-plugins enable rabbitmq_delayed_message_exchange
  5. 禁用插件
  6. rabbitmq-plugins disable rabbitmq_delayed_message_exchange
  7. 重启生效
  8. rabbitmqctl stop :因为rabbitmqctl是没有restart命令的,所以重启rabbitmq服务需要这么两步
  9. rabbitmq-server restart : 重启rabbitmq

如果需安装对应版本的插件,比如mq的延时队列插件(rabbitmq_delayed_message_exchange)

  1. cd ./plugins
  2. wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.11.1/rabbitmq_delayed_message_exchange-3.11.1.ez

rabbitmq - 图3

4. 负载均衡

ha 同样采用 Docker 方式来部署,先看一下 haproxy.cfg 配置文件:
  1. # Simple configuration for an HTTP proxy listening on port 80 on all
  2. # interfaces and forwarding requests to a single backend "servers" with a
  3. # single server "server1" listening on 127.0.0.1:8000
  4. global
  5. daemon
  6. maxconn 256
  7. defaults
  8. mode http
  9. timeout connect 5000ms
  10. timeout client 5000ms
  11. timeout server 5000ms
  12. listen rabbitmq_cluster
  13. bind *:5672
  14. option tcplog
  15. mode tcp
  16. balance leastconn
  17. server rabbit1 192.168.95.36:5672 weight 1 check inter 2s rise 2 fall 3
  18. server rabbit2 192.168.95.37:5672 weight 1 check inter 2s rise 2 fall 3
  19. server rabbit3 192.168.95.38:5672 weight 1 check inter 2s rise 2 fall 3
  20. listen http_front
  21. bind 0.0.0.0:8002
  22. stats uri /haproxy?stats
  23. listen rabbitmq_admin
  24. bind *:8001
  25. server rabbit1 192.168.95.36:15672
  26. server rabbit2 192.168.95.37:15672
  27. server rabbit3 192.168.95.38:15672
  • docker-compose.yml
  1. version: '3'
  2. services:
  3. haproxy:
  4. container_name: haproxy
  5. image: haproxy:latest
  6. restart: always
  7. network_mode: host
  8. volumes:
  9. - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
  10. ports:
  11. - "5672:5672"
  12. - "8001:8001"
  13. - "8002:8002"
启动之后,就可以通过 ha 的地址来访问 RabbitMQ 集群管理页面了。

http://192.168.95.28:8001/

如果公司内部有现成的负载均衡,比如 LVS,那么也可以省略这一步。