使用docker安装rabbitMQ单机和集群环境

一、简介


  1. Rabbit模式大概分为以下三种:单一模式、普通模式、镜像模式
  • 单一模式: 最简单的情况,非集群模式
  • 普通模式: 默认的集群模式,对于队列(queue)来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。当消息进入A节点的队列(queue)中后,消费者(consumer)从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给消费者(consumer)。所以消费者(consumer)应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理队列(queue)。否则无论消费者(consumer)连A或B,出口总在A,会产生瓶颈。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
  • **镜像模式:**把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案。其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在消费者(consumer)取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用
  1. 集群中的节点只有两种类型:内存节点、磁盘节点
  • 内存节点: 就是将元数据(metadata)都放在内存里, 不包括消息,在集群中可以配置部分节点为内存节点;对于消息是否存在内存还是磁盘中和持久化相关,持久化就存磁盘,非持久化就存内存。所以内存节点只会对资源管理(如添加删除 队列,交换机,vhost等)的性能得以提升,对于生产和消费消息的速度不会有任何提升。
  • 磁盘节点: 磁盘节点就是将元数据(metadata)都放在磁盘上,如果是单节点运行,默认就是磁盘节点;在集群里,至少要有一个磁盘节点用来持久保存元数据。如果集群里只有一个磁盘节点,这个节点挂了,会发生什么?此时消息路由机制仍可正常进行(可以正常投递和消费消息),但是不能做如下事:create queues,create exchanges,create bindings,add users,change permissions,add or remove cluster nodes;所以考虑到高可用性,推荐在集群里保持2个磁盘节点,这样一个挂了,另一个还可正常工作。但往集群里增加或删除节点,要求所有磁盘节点同时在线。 如果2个节点,则建议都设为磁盘节点,如果3个节点,则可2个磁盘节点+1个内存节点。

二、单机安装


1) 安装

docker run \
--name rabbitmq \
-p 15672:15672 \
-p 5672:5672 \
--privileged=true \
--restart=always \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=123456 \
-d rabbitmq:3.8.19-management

2) 安装延迟队列插件
下载地址:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange
下载rabbitmq版本匹配的插件,文件后缀为.ez,bin上传到宿主机中

#从宿主机中拷贝到rabbitmq容器 773067241f96 中
docker cp /opt/rabbitmq_delayed_message_exchange-3.8.17.8f537ac.ez rabbitmq:/plugins
#进入容器
docker exec -it rabbitmq bash
#启用插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
#查看
rabbitmq-plugins list
#重新启动容器
docker restart 773067241f96

三、集群安装


1) 开放端口

firewall-cmd --zone=public --add-port=4369/tcp --permanent  #erlang 发现口
firewall-cmd --zone=public --add-port=5672/tcp --permanent   #client 端通信口
firewall-cmd --zone=public --add-port=15672/tcp --permanent   #管理界面 ui 端口
firewall-cmd --zone=public --add-port=25672/tcp --permanent   #server 间内部通信口

2) 安装

# 005-172.29.231.183服务器
docker run \
--name rabbitmq \
--privileged=true \
--restart=always \
--net host \
--hostname=rabbitmq005 \
--add-host=rabbitmq005:172.29.231.183 \
--add-host=rabbitmq006:172.28.166.219 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=123456 \
-e RABBITMQ_ERLANG_COOKIE='youducookie' \
-e RABBITMQ_NODENAME=rabbit@rabbitmq005 \
-d rabbitmq:3.8.19-management

# 006-172.28.166.219服务器
docker run \
--name rabbitmq \
--privileged=true \
--restart=always \
--net host \
--hostname=rabbitmq006 \
--add-host=rabbitmq005:172.29.231.183 \
--add-host=rabbitmq006:172.28.166.219 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=123456 \
-e RABBITMQ_ERLANG_COOKIE='youducookie' \
-e RABBITMQ_NODENAME=rabbit@rabbitmq006 \
-d rabbitmq:3.8.19-management

#注:如果要安装延迟队列插件,请在加入集群前安装,安装方式参考单机安装

3) rabbitmq加入集群

#此处005-172.29.231.183为主服务器,使用006-172.28.166.219服务器进入容器加入到005服务器上的rabbitmq中
rabbitmqctl stop_app   #关闭应用(关闭当前启动的节点)
rabbitmqctl reset   #移除所有数据,例如配置过的用户和虚拟宿主, 删除所有持久化的消息(这个命令要在rabbitmqctl stop_app之后使用)
rabbitmqctl join_cluster --ram rabbit@rabbitmq005  #加入到rabbitmq005节点集群中,--ram表示配置为内存节点,默认是磁盘节点。注意:如果使用了延迟队列插件则必须是磁盘类型节点
rabbitmqctl start_app   #启动应用

4) 设置镜像队列

docker exec -it rabbitmq bash  #随便进入一个容器创建镜像
rabbitmqctl set_policy -p / ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}' #设置策略匹配所有名称的队列都进行高可用配置
rabbitmqctl list_policies -p / #查看vhost下的所有的策略(policies )

5) 镜像策略设置说明

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition: 镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
    ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes
        all: 表示在集群中所有的节点上进行镜像
        exactly: 表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
        nodes: 表示在指定的节点上进行镜像,节点名称通过ha-params指定
    ha-params: ha-mode模式需要用到的参数
    ha-sync-mode: 进行队列中消息的同步方式,有效值为automatic和manual
priority: 可选参数,policy的优先级

例1:策略名称是ha-all,匹配所有队列名称
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
例2:策略名称是ha-two,匹配队列名称是two开头的,镜像到群集中的任意两个节点,并进行自动同步
rabbitmqctl set_policy ha-two "^two*" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
例3:策略名称是ha-nodes,匹配队列名称是nodes开头的,镜像到集群中的rabbit@nodeA和rabbit@nodeB节点
rabbitmqctl set_policy ha-nodes "^nodes." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值