网站首页 > 技术文章 正文
1、下载镜像
$ docker pull rabbitmq:management
2、创建并运行容器
#多主机版
$ docker run -d --hostname zk-servers-01 --add-host="zk-servers-01":192.168.3.10 --add-host="dora-02":192.168.3.29 --name rabbitmq-nood1 --restart=always -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -v /home/data/rabbitmq-nood1:/var/lib/rabbitmq:z -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
$ docker run -d --hostname dora-02 --add-host="zk-servers-01":192.168.3.10 --add-host="dora-02":192.168.3.29 --name rabbitmq-nood2 --restart=always -p 15673:15672 -p 5673:5672 -v /Users/mac/rabbitmq-nood2:/var/lib/rabbitmq:z -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
#linux版 单主机版
$ docker run -d --hostname rabbitmq-01 --name rabbitmq-nood1 --restart=always -p 15672:15672 -p 5672:5672 -v /home/data/rabbitmq-nood1:/var/lib/rabbitmq:z -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
$ docker run -d --hostname rabbitmq-02 --name rabbitmq-nood2 --restart=always -p 15673:15672 -p 5673:5672 -v /home/data/rabbitmq-nood2:/var/lib/rabbitmq:z --link rabbitmq-nood1:rabbitmq-01 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
$ docker run -d --hostname rabbitmq-03 --name rabbitmq-nood3 --restart=always -p 15674:15672 -p 5674:5672 -v /home/data/rabbitmq-nood3:/var/lib/rabbitmq:z --link rabbitmq-nood1:rabbitmq-01 --link rabbitmq-nood2:rabbitmq-02 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
Rabbitmq集群安装
一、RabbitMQ集群概念
RabbitMQ 有三种模式:单机模式,普通集群模式,镜像集群模式。单机模式即单独运行一个 rabbitmq 实例,而集群模式需要创建多个 rabbitmq实例。
1、普通集群模式
概念:
默认的集群模式。需要创建多个 RabbitMQ 节点。但对于 Queue 和消息来说,只存在于其中一个节点,其他节点仅同步元数据,即队列的结构信息。
当消息进入Queue后,如果 Consumer 从创建Queue的这个节点消费消息时,可以直接取出来;但如果 consumer 连接的是其他节点,那 rabbitmq 会把 queue 中的消息从创建它的节点中取出并经过连接节点转发后再发送给consumer。
所以 consumer 应尽量连接每一个节点。并针对同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连接哪个节点,都会从创建 queue 的节点获取消息,会产生瓶颈
特点:(1)Exchange 的元数据信息在所有节点上是一致的,而 Queue(存放消息的队列)的完整数据则只会存在于创建它的那个节点上。其他节点只知道这个 queue 的 metadata 信息和一个指向 queue 的 owner node 的指针;
(2)RabbitMQ 集群会始终同步四种类型的内部元数据(类似索引): a.队列元数据:队列名称和它的属性; b.交换器元数据:交换器名称、类型和属性; c.绑定元数据:一张简单的表格展示了如何将消息路由到队列; d.vhost元数据:为 vhost 内的队列、交换器和绑定提供命名空间和安全属性; 因此,当用户访问其中任何一个 RabbitMQ 节点时,通过 rabbitmqctl 查询到的元数据信息都是相同的。
(3)无法实现高可用性,当创建 queue 的节点故障后,其他节点是无法取到消息实体的。如果做了消息持久化,那么得等创建 queue 的节点恢复后,才可以被消费。如果没有持久化的话,就会产生消息丢失的现象。
2、镜像集群模式
概念:把队列做成镜像队列,让各队列存在于多个节点中,属于 RabbitMQ 的高可用性方案。镜像模式和普通模式的不同在于,queue和 message 会在集群各节点之间同步,而不是在 consumer 获取数据时临时拉取。
特点:(1)实现了高可用性。部分节点挂掉后,不会影响 rabbitmq 的使用。(2)降低了系统性能。镜像队列数量过多,大量的消息同步也会加大网络带宽开销。(3)适合对可用性要求较高的业务场景。
二、RabbitMQ普通集群部署
1、拉镜像
$docker pull rabbitmq:management
2、运行容器
$ docker run -d --hostname rabbitmq-01 --name rabbitmq-nood1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
$ docker run -d --hostname rabbitmq-02 --name rabbitmq-nood2 -p 5673:5672 --link rabbitmq-nood1:rabbitmq-01 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
$ docker run -d --hostname rabbitmq-03 --name rabbitmq-nood3 -p 5674:5672 --link rabbitmq-nood1:rabbitmq-01 --link rabbitmq-nood2:rabbitmq-02 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
主要参数:-p 15672:15672 management 界面管理访问端口-p 5672:5672 amqp 访问端口--link 容器之间连接Erlang Cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同。因为 RabbitMQ 是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证。
3、加入节点到集群
设置节点1:
$ docker exec -it rabbitmq-nood1 bash
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl start_app
$ exit
设置节点2,加入到集群:
$ docker exec -it rabbitmq-nood2 bash
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl join_cluster --ram rabbit@rabbitmq-01
$ rabbitmqctl start_app
$ exit
设置节点3,加入到集群:
$ docker exec -it rabbitmq-nood3 bash
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl join_cluster --ram rabbit@rabbitmq-01
$ rabbitmqctl start_app
$ exit
主要参数:--ram 表示设置为内存节点,忽略次参数默认为磁盘节点。该配置启动了3个节点,1个磁盘节点和2个内存节点。
设置好之后,使用 http://ip:15672 进行访问,默认账号密码:guest/guest
可以看到,已经有多个节点了。
三、RabbitMQ镜像集群部署
1、策略policy概念
使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。
为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下表说明这些key的选项。
2、添加策略
登录rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy
name:随便取,策略名称Pattern:^ 匹配符,只有一个^代表匹配所有Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)
或者使用命令:$rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
3、查看效果
此策略会同步所在同一VHost中的交换器和队列数据。设置好policy之后,使用 http://ip:15672 再次进行访问,可以看到队列镜像同步。
四、Springboot配置RabbitMQ集群
1、配置RabbitMQ单机
spring:
rabbitmq:
host: localhost
port: 5672
username: username
password: password
或者使用addresses
spring:
rabbitmq:
addresses:ip1:port1
username: username
password: password
2、配置RabbitMQ集群
addresses节点用逗号分隔
spring:
rabbitmq:
addresses:ip1:port1,ip2:port2,ip3:port3
username: username
password: password
猜你喜欢
- 2024-09-24 RabbitMQ宕机后,消息100%不会丢失吗
- 2024-09-24 非常强悍的 RabbitMQ 总结,写得真好
- 2024-09-24 「服务器」RabbitMQ入门教程——简介及工作原理
- 2024-09-24 在 WebApi 项目中快速开始使用 RabbitMQ
- 2024-09-24 RabbitMQ使用延迟插件,代码量直接降一半?
- 2024-09-24 RabbitMQ 高可用之镜像队列
- 2024-09-24 k8s上创建高可用RabbitMQ集群
- 2024-09-24 Centos7部署RabbitMQ的镜像队列集群
- 2024-09-24 docker分布式部署rabbitmq高可用集群
- 2024-09-24 详解如何用zabbix来监控rabbitmq消息队列服务
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)