Dokcer 部署RabbitMQ集群-镜像模式(实战)

RabbitMQ简介

RabbitMQ是一个开源的消息中间件,它实现了高级消息队列协议(AMQP),支持多种语言,如Java、Python、Ruby、PHP、C#、JavaScript等。


RabbitMQ部署模式大概分为以下三种:

  1. 单一模式。
  2. 普通模式(默认的集群模式)。
  3. 镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案,在对业务可靠性要求较高的场合中比较适用)。

RabbitMQ模式详解

abbitmq普通集群模式,是将交换机、绑定、队列的元数据复制到集群里的任何一个节点,但队列内容只存在于特定的节点中,客户端通过连接集群中任意一个节点,即可以生产和消费集群中的任何队列内容(因为每个节点都有集群中所有队列的元数据信息,如果队列内容不在本节点,则本节点会从远程节点获取内容,然后提供给消费者消费)。
从该模式不难看出,普通集群可以让不同的繁忙队列从属于不同的节点,这样可以减轻单节点的压力,提升吞吐量,但是普通集群不能保证队列的高可用性,因为一旦队列所在节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。
rabbitmq镜像集群依赖于普通集群,所以需要先搭建rabbitmq普通集群。

环境说明

要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用,本次实践部署rabbitmq采用的版本(rabbitmq:3.8.7-management)。

主机列表

主机 节点模式
192.168.1.32 磁盘节点
192.168.1.33 内存节点
192.168.1.35 内存节点

部署RabbitMQ

创建持久数据目录

1
mkdir /data/rabbitmq -p   //三台主机均执行

host配置(rabbitmq集群需要解析主机名)

1
2
3
4
5
6
cd /data/rabbitmq
vim hosts
# hosts 内容
192.168.1.32 rabbit1
192.168.1.33 rabbit2
192.168.1.35 rabbit3

创建容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
docker run -d --restart=always \
--net host \
--hostname rabbit1 \
--name rabbit1 \
-v /data/rabbitmq:/var/lib/rabbitmq \
-v /data/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_ERLANG_COOKIE='secret cookie here' \
rabbitmq:3.8.7-management

docker run -d --restart=always \
--net host \
--hostname rabbit2 \
--name rabbit2 \
-v /data/rabbitmq:/var/lib/rabbitmq \
-v /data/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_ERLANG_COOKIE='secret cookie here' \
rabbitmq:3.8.7-management

docker run -d --restart=always \
--net host \
--hostname rabbit3 \
--name rabbit3 \
-v /data/rabbitmq:/var/lib/rabbitmq \
-v /data/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_ERLANG_COOKIE='secret cookie here' \
rabbitmq:3.8.7-management

注意:hostname 不要重复

参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-d
#容器后台运行
--restart=always
# 容器重启策略, always 在容器退出时总是重启容器
--net host
#容器和宿主机共用网络(注意端口冲突)
--hostname rabbit1
#容器的主机名为 rabbit1,容器内部的hostname
--name rabbit1
#容器名为rabbit1,在宿主机上运行“docker ps”命令时显示的名称
-v /data/rabbitmq:/var/lib/rabbitmq
#将宿主机目录/data/rabbitmq挂载到容器的/var/lib/rabbitmq目录
-v /data/rabbitmq/hosts:/etc/hosts
#将宿主机目录/data/rabbitmq/hosts文件挂载到容器的/etc/hosts文件
-e RABBITMQ_DEFAULT_USER=user01
#设置rabbitmq默认用户为user01
-e RABBITMQ_DEFAULT_PASS=password01
#设置rabbitmq默认密码为password01
-e RABBITMQ_ERLANG_COOKIE='secret cookie'
#设置rabbitmq的cookie为“secret cookie”,可以自定义为其他文本,三个容器保持一致即可。
rabbitmq:3.8.7-management
#使用rabbitmq:3.8.7-management这个镜像

三台机器都执行上面的命令,hostname和容器name需要修改

将节点2,3加入集群

在rabbit2机器进入容器的命令行

docker exec -it rabbit2 /bin/bash
加入集群
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl join_cluster rabbit@rabbit1 --ram  //表示该节点为内存节点,默认为磁盘节点。
rabbitmqctl start_app
rabbit3执行相同的命令

查询集群状态
rabbitmqctl cluster_status

特别说明:

1
2
3
4
5
6
# 在上述部署已完成的情况下更改节点模式(硬盘模式-disc、内存模式-ram)
# 更改节点: rabbit@rabbit2为硬盘模式,操作如下:
# 进入任意容器内
rabbitmqctl -n rabbit@rabbit2 stop_app
rabbitmqctl -n rabbit@rabbit2 change_cluster_node_type disc
rabbitmqctl -n rabbit@rabbit2 start_app

配置镜像集群策略

1
2
3
4
5
新添加用户
rabbitmqctl list_users //查看用户列表
rabbitmqctl add_user admin 123456 //新增用户、密码
rabbitmqctl set_user_tags admin administrator // 设置admin用户标记,administrator表示最高权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" //设置权限

开启镜像集群模式

搭建镜像集群是在web控制台完成的,主要操作就是在Admin界面添加一个Policy
添加策略:登录rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy,填写对应的镜像策略。
Alt
Alt

1
2
3
4
5
6
7
Policy参数含义
pattern: 队列名字的通配符 或者 ^ 匹配符,只有一个^代表匹配所有
ha-mode:镜像队列提供了三种模式:
all:全部的节点队列都做镜像;
exactly:指定镜像队列的节点最高镜像数量;
nodes:只为指定具体节点配置镜像队列;
ha-sync-mode :节点之前的同步模式。有自动和手动两种,默认是手动,这里设置为自动。

设置完成并添加了这个策略后,新建的和已存在的队列默认会支持此策略。

出现如下图所示,表示配置完成
Alt
到此,镜像集群部署工作完成。

RabbitMQ监控

使用两种流行的工具介绍RabbitMQ监视: Prometheus,一个监视工具包;和Grafana,一个度量可视化系统。
从3.8.0版开始,RabbitMQ附带了内置的Prometheus&Grafana支持。
Rabbitmq_prometheus插件随附了对Prometheus度量标准收集器的支持。该插件以Prometheus文本格式在专用TCP端口上公开所有RabbitMQ指标。
这些度量标准提供了对RabbitMQ节点状态和运行时的深入了解。他们使有关RabbitMQ的行为,使用它的应用程序以及各种基础结构元素的推理变得更加明智。

启用rabbitmq_prometheus

1
2
在所有节点上启用rabbitmq_prometheus 插件
rabbitmq-plugins enable rabbitmq_prometheus

获取指标,如下所示有监控指标出现,即表示监控插件开启

1
2
3
4
curl -s localhost:15692/metrics | head -n 3
# TYPE erlang_mnesia_held_locks gauge
# HELP erlang_mnesia_held_locks Number of held locks.
erlang_mnesia_held_locks 0