Dokcer 部署RabbitMQ集群-镜像模式(实战)
概述
RabbiMQ模式
RabbitMQ模式大概分为以下三种:
- 单一模式。
- 普通模式(默认的集群模式)。
- 镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用)。
RabbiMQ模式详解
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 //三台主机均执行
2.host配置(rabbitmq集群需要解析主机名)
cd /data/rabbitmq
vim hosts
# hosts 内容
192.168.1.32 rabbit1
192.168.1.33 rabbit2
192.168.1.35 rabbit3
3.创建容器
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 不要重复
参数说明
-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需要修改
4.将节点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
特别说明:
# 在上述部署已完成的情况下更改节点模式(硬盘模式-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
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,填写对应的镜像策略。


Policy参数含义
pattern: 队列名字的通配符 或者 ^ 匹配符,只有一个^代表匹配所有
ha-mode:镜像队列提供了三种模式:
all:全部的节点队列都做镜像;
exactly:指定镜像队列的节点最高镜像数量;
nodes:只为指定具体节点配置镜像队列;
ha-sync-mode :节点之前的同步模式。有自动和手动两种,默认是手动,这里设置为自动。
设置完成并添加了这个策略后,新建的和已存在的队列默认会支持此策略。
出现如下图所示,表示配置完成

到此,镜像集群部署工作完成。
当然如果你觉得麻烦、追求稳定,可在华为云购买rabbitmq服务,双12优惠给力 华为云-分布式消息队列 RabbitMQ
RabbitMQ监控
使用两种流行的工具介绍RabbitMQ监视: Prometheus,一个监视工具包;和Grafana,一个度量可视化系统。
从3.8.0版开始,RabbitMQ附带了内置的Prometheus&Grafana支持。
Rabbitmq_prometheus插件随附了对Prometheus度量标准收集器的支持。该插件以Prometheus文本格式在专用TCP端口上公开所有RabbitMQ指标。
这些度量标准提供了对RabbitMQ节点状态和运行时的深入了解。他们使有关RabbitMQ的行为,使用它的应用程序以及各种基础结构元素的推理变得更加明智。
启用rabbitmq_prometheus
在所有节点上启用rabbitmq_prometheus 插件
rabbitmq-plugins enable rabbitmq_prometheus
获取指标,如下所示有监控指标出现,即表示监控插件开启
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
智能推荐
Docker 容器内运行 Dubbo 服务
原文:http://www.aqcoder.com/post/content?id=41 在使用 Docker 容器内运行 Dubbo 服务的时候一个令人很头痛的问题就是服务地址注册。 Docker 容器内有自己的 IP 段,和宿主主机是隔离的,Dubbo 会使用容器内的 IP 注册到 zookeeper 注册中心上。这样其他的服务是无法访问的。 方式一:–host 一个很直接的方案就...
python基础教程
Python基础教程 一、简介 1.1 python语言介绍 python的创始人:Guido Van Rossum Python下载地址:https://www.python.org/ Python文档下载地址:https://www.python.org/doc/ Pycharm下载地址:https://www.runoob.com/w3cnote/pycharm-windows-instal...
1、Git安装与配置
1、Git安装与配置 一:版本控制 定义:版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 为什么要用版本控制:在起初的项目开发中,我们会不断的编写代码,但是,害怕有一天系统突然挂掉了,完蛋,辛苦写的代码就这么没了,所有为了防止这一点,都会开发一点就以目录拷贝的形式保存下来,自己这么1.0、2.0、3.0…的这么去标记,开始的还好,后面的话你压根就不知道...
Golang net/rpc 包的深度解读和学习
Golang 提供了一个开箱即用的RPC服务,实现方式简约而不简单。本文对net/rpc 包做深度解读和学习实战。 RPC 简单介绍 远程过程调用 (Remote Procedure Call,RPC) 是一种计算机通信协议。允许运行在一台计算机的程序调用另一个地址空间的子程序(一般是开放网络中的一台计算机),而程序员就像调用调用本地程序一样,无需额外做交互编程。RPC 是一种 CS (Clien...
merge sort
归并排序(merge sort) 具体算法: I.对原数组进行分组:对数组进行遍历,每检测出一个有序序列则记录一个分组,一般分组都是上升序列,下降序列也会被转换成上升序列 II.对两两相邻的分组进行合并,合并后的分组也将被记录 III.迭代合并之前合并后的分组直到出现最后的一个有序的大分组,也就是排序的最终结果 java.util.DualPivotQuicksort类中的static void ...
猜你喜欢
Java函数的学习
java学习 百知教育学习 - 胡鑫喆 - Java函数的学习 01_函数的定义 函数的定义 概念:实现特定功能的一段代码,可反复使用 定义语法: 函数名称许遵循命名规范 函数定义在类的内部,与main函数并列,并且使函数产生作用,需进行函数的调用 使用函数去掉冗余代码 02_函数的参数 函数的参数(函数名称() 其中()就是一个参数表) 无参函数(01_函数的定义中的下划线就为无参函数) 有参函...
03-段寄存器属性探测
1.段属性探测 要点回顾: 要点回顾: 上一节课我们讲过段寄存器有96位: 我们可以通过MOV指令进行读写(LDTR和TR除外) 但我们只能看见16位,那如果证明Attribute、Base、Limit的存在呢? 1、段寄存器成员简介 2、探测Attribute 3、探测Base 3、探测Limit 课后练习:...
解决swagger返回map复杂结构不能解析 Resolver error at definitions
解决: 没错,重点就是加上alternateTypeRules进行解析。 关注公众号获取更多内容,有问题也可在公众号提问哦: 强哥叨逼叨 叨逼叨编程、互联网的见解和新鲜事...
Android 插件化实现中遇错: PackageParser$PackageParserException: Failed to parse xxx
本文解决以下两个问题 一、在尝试使用apk本地路径获取packageInfo时,报出: 二、使用newInstance()时,报出: 解决问题 1. 第一个错误确实没找到原因,只在模拟器会出现,真机没有任何问题 在使用apk本地路径获取packageInfo时, 也就是调用这样一个api, 假设我本地apk存储的路径为: /storage/emulated/0/a.apk 返回给我的package...
