ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RabbitMQ Docker 单机与集群部署

2021-01-31 17:01:50  阅读:221  来源: 互联网

标签:单机 队列 rabbitmq rabbitmqctl RabbitMQ 镜像 Docker 节点


如何在 Linux 系统中安装 Docker 以及为 Docker 设置国内镜像仓库,可以参考我之前的一篇文章:

Linux 系统 Docker 安装与使用

RabbitMQ 单节点部署

1、拉取 RabbitMQ 镜像

sudo docker pull rabbitmq:management

2、启动 RabbitMQ 容器

sudo mkdir -p /mydata/rabbitmq

sudo docker run -d --name rabbitmq \
-v /mydata/rabbitmq:/var/lib/rabbitmq \
-p 5671:5671 \
-p 5672:5672 \
-p 4369:4369 \
-p 25672:25672 \
-p 15671:15671 \
-p 15672:15672 \
rabbitmq:management

3、设置开机启动 RabbitMQ

sudo docker update rabbitmq --restart=always

RabbitMQ 集群架构

先抛出结论,RabbitMQ 集群模式需要最终搭建成镜像模式,才是真正意义上实现高可用。但是需要首先搭建成普通模式,最终在普通模式基础上改造成镜像模式

RabbitMQ集群中节点包含内存节点(RAM)、磁盘节点(Disk,消息持久化)、集群中至少有一个Disk节点。集群分为两种集群模式普通模式镜像模式

  • 普通模式(默认)

    对于普通模式,集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点,对于消费者来说,若消息进入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消息从A中取出,并经过B发送给消费者。

    应用场景:该模式更适合于消息无需持久化的场景,如日志队列。当队列非持久化,且创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化,只能等故障节点恢复。缺点:无法解决单点故障问题。

  • 镜像模式

    与普通模式不同之处时消息实体会主动在镜像节点见同步,而不是在取数据时临时拉取,高可用;该模式下 镜像队列(mirror queue)有一套选举算法,即1个master、n个slaver。 生产者、消费者的请求都会转至master。

    应用场景:可靠性要求较高场合,如下单、库存队列。缺点:若镜像队列过多,且消息体量大,集群内部网络带宽将会被此种同步通讯所消耗。

RabbitMQ 集群部署 - 普通模式

1、创建三个RabbitMQ节点

#创建RabbitMQ目录
sudo mkdir /mydata/rabbitmq
sudo cd /mydata/rabbitmq
#创建三个rabbitmq 目录,存储三个节点配置信息
sudo mkdir rabbitmq01 rabbitmq02 rabbitmq03

#创建rabbitmq01节点容器
sudo docker run -d --hostname rabbitmq01 --name rabbitmq01 \
-v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq \
-p 15672:15672 -p 5672:5672 \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

#创建rabbitmq02节点容器
docker run -d --hostname rabbitmq02 --name rabbitmq02 \
-v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq \
-p 15673:15672 -p 5673:5672 \
--link rabbitmq01:rabbitmq01 \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

#创建rabbitmq03节点容器
docker run -d --hostname rabbitmq03 --name rabbitmq03 \
-v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq \
-p 15674:15672 -p 5674:5672 \
--link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

##注意:--hostname 设置容器主机名,RABBITMQ_ERLANG_COOKIE 节点认证作用,集群部署需要同步该值,且值必须相同。
##多个容器之间使用“--link”连接,此属性不能少;

安装好后访问测试,使用http://192.168.56.10:15672 进行访问了,默认账号密码是guest/guest,其中192.168.56.10 是我的宿主机IP。显示还未加入任何集群信息,只能看到我访问的该一个节点信息。

image-20201226140931524

2、创建三个RabbitMQ节点

#进入rabbitmq01容器,重新初始化一下,如果是新安装则reset可以忽略重置。
docker exec -it rabbitmq01 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

#进入rabbitmq02容器,重新初始化一下,将02节点加入到集群中
docker exec -it rabbitmq02 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #参数“--ram”表示设置为内存节点,忽略该参数默认为磁盘节点。
rabbitmqctl start_app
exit

#进入rabbitmq03容器,重新初始化一下,将03节点加入到集群中
docker exec -it rabbitmq03 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

3、集群测试访问

设置好之后,使用http://192.168.56.10:15672 进行访问了,默认账号密码是guest/guest,其中192.168.56.10 是我的宿主机IP。启动了3个节点,到此为止,我们已经完成了RabbitMQ普通模式集群的建立,启动了3个节点,1个磁盘节点和2个内存节点。但是如果磁盘节点挂掉后,数据就丢失了。所以我们这个集群方案需要进一步改造为镜像模式集群

RabbitMQ普通集群模式

RabbitMQ 集群部署 - 镜像模式

镜像队列是Rabbit2.6.0版本带来的一个新功能,允许内建双活冗余选项,与普通队列不同,镜像节点在集群中的其他节点拥有从队列拷贝,一旦主节点不可用,最老的从队列将被选举为新的主队列。

镜像队列的工作原理:在某种程度上你可以将镜像队列视为,拥有一个隐藏的fanout交换器,它指示者信道将消息分发到从队列上。

设置镜像队列

设置镜像队列命令:“rabbitmqctl set_policy 名称 匹配模式(正则) 镜像定义”, 例如,设置名称为ha的镜像队列,匹配所有名称是amp开头的队列都存储在2个节点上的命令如下:

#随便进入一个容器
docker exec -it rabbitmq01 bash
#设置策略匹配所有名称是amp开头的队列都存储在2个节点上的命令如下
rabbitmqctl set_policy -p / ha "^amp*" '{"ha-mode":"exactly","ha-params":2}'
#或者
#设置策略匹配所有名称的队列都进行高可用配置
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

#查询策略
rabbitmqctl list_policies -p / #查看vhost下的所有的策略(policies )

可以看出设置镜像队列,一共有四个参数,每个参数用空格分割

  1. 参数一:策略名称,可以随便填,此外我们命名为ha(高可用);
  2. 参考二:-p / 设置哪个虚拟主机,可以使用rabbitmqctl list_policies -p / 查看vhost 下所有的策略(policies )。
  3. 参数三:队列名称的匹配规则,使用正则表达式表示;
  4. 参数四:为镜像队列的主体规则,是json字符串,分为三个属性:ha-mode | ha-params | ha-sync-mode,分别的解释如下:
  • ha-mode:镜像模式,分类:all/exactly/nodes,all存储在所有节点;exactly存储x个节点,节点的个数由ha-params指定;nodes指定存储的节点上名称,通过ha-params指定;
  • ha-params:作为参数,为ha-mode的补充;
  • ha-sync-mode:镜像消息同步方式:automatic(自动),manually(手动);

至此rabbitmq集群算是搭建完毕,可以在web界面上看到设置的Policies!

RabbitMQ镜像集群模式

查看镜像队列

rabbitmqctl list_policies

删除镜像队列

rabbitmqctl clear_policy

其他问题

如出现改过期警告:RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.

配置相同Erlang Cookie

有些特殊的情况,比如已经运行了一段时间的几个单个物理机,我们在之前没有设置过相同的Erlang Cookie值,现在我们要把单个的物理机部署成集群,实现我们需要同步Erlang的Cookie值。

1.为什么要配置相同的erlang cookie?

因为RabbitMQ是用Erlang实现的,Erlang Cookie相当于不同节点之间相互通讯的秘钥,Erlang节点通过交换Erlang Cookie获得认证。

2.Erlang Cookie的位置

要想知道Erlang Cookie位置,首先要取得RabbitMQ启动日志里面的home dir路径,作为根路径。使用:“docker logs 容器名称”查看,如下图:

配置相同Erlang Cookie

所以Erlang Cookie的全部路径就是“/var/lib/rabbitmq/.erlang.cookie”。

注意:每个人的erlang cookie位置可能不同,一定要查看自己的home dir路径。

3.复制Erlang Cookie到其他RabbitMQ节点

获取到第一个RabbitMQ的Erlang Cookie之后,只需要把这个文件复制到其他RabbitMQ节点即可。

物理机和容器之间复制命令如下:

  • 容器复制文件到物理机:docker cp 容器名称:容器目录 物理机目录
  • 物理机复制文件到容器:docker cp 物理机目录 容器名称:容器目录

设置Erlang Cookie文件权限:“chmod 600 /var/lib/rabbitmq/.erlang.cookie”。

标签:单机,队列,rabbitmq,rabbitmqctl,RabbitMQ,镜像,Docker,节点
来源: https://www.cnblogs.com/dtdx/p/14353055.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有