RabbitMQ简介 RabbitMQ是一个开源的消息中间件,它实现了高级消息队列协议(AMQP),支持多种语言,如Java、Python、Ruby、PHP、C#、JavaScript等。
RabbitMQ部署模式大概分为以下三种:
单一模式。
普通模式(默认的集群模式)。
镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于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,填写对应的镜像策略。
1 2 3 4 5 6 7 Policy参数含义 pattern: 队列名字的通配符 或者 ^ 匹配符,只有一个^代表匹配所有 ha-mode:镜像队列提供了三种模式: all:全部的节点队列都做镜像; exactly:指定镜像队列的节点最高镜像数量; nodes:只为指定具体节点配置镜像队列; ha-sync-mode :节点之前的同步模式。有自动和手动两种,默认是手动,这里设置为自动。
设置完成并添加了这个策略后,新建的和已存在的队列默认会支持此策略。
出现如下图所示,表示配置完成到此,镜像集群部署工作完成。
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