好文档 - 专业文书写作范文服务资料分享网站

【集群搭建】使用docker快速搭建RabbitMQ服务集群

天下 分享 时间: 加入收藏 我要投稿 点赞

使?用docker 搭建RabbitMQ集群RabbitMQ集群中节点包含内存节点(RAM)、磁盘节点(Disk,消息持久化)、集群中?至少有?一个Disk节点。集群分为两种集群模式普通模式 和 镜像模式。普通模式(默认)对于普通模式,集群中各节点有相同的队列列结构,但消息只会存在于集群中的?一个节点,对于消费者来说,若消息进?入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消息从A中取出,并经过B发送给消费者。应?用场景:该模式更更适合于消息?无需持久化的场景,如?日志队列列。当队列列?非持久化,且创建该队列列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列列。若为持久化,只能等故障节点恢复。缺点:?无法解决单点故障问题。镜像模式与普通模式不不同之处时消息实体会主动在镜像节点?见同步,?而不不是在取数据时临时拉取,?高可?用;该模式下 镜像队列列(mirror queue)有?一套选举算法,即1个master、n个slaver。 ?生产者、消费者的请求都会转?至master。应?用场景:可靠性要求较?高场合,如下单、库存队列列。缺点:若镜像队列列过多,且消息体量量?大,集群内部?网络带宽将会被此种同步通讯所消耗。 环境搭建创建三个RabbitMQ节点#创建RabbitMQ?目录mkdir ~/mydata/rabbitmqcd ~/mydata/rabbitmq#创建三个rabbitmq ?目录,存储三个节点配置信息mkdir rabbitmq01 rabbitmq02 rabbitmq03 #创建rabbitmq01节点容器?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.0.100:15672 进?行行访问了了,默认账号密码是guest/guest,其中192.168.0.100 是我的宿主机IP。显示还未加?入任何集群信息,只能看到我访问的该?一个节点信息。

将RabbitMQ节点加?入到集群

#进?入rabbitmq01容器?,重新初始化?一下,如果是新安装则reset可以忽略略重置。docker exec -it rabbitmq01 bashrabbitmqctl stop_apprabbitmqctl resetrabbitmqctl start_appexit

#进?入rabbitmq02容器?,重新初始化?一下,将02节点加?入到集群中docker exec -it rabbitmq02 bashrabbitmqctl stop_apprabbitmqctl reset

rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #参数“--ram”表示设置为内存节点,忽略略该参数默认为磁盘节点。rabbitmqctl start_appexit

#进?入rabbitmq03容器?,重新初始化?一下,将03节点加?入到集群中docker exec -it rabbitmq03 bashrabbitmqctl stop_apprabbitmqctl reset

rabbitmqctl join_cluster --ram rabbit@rabbitmq01rabbitmqctl start_appexit

集群测试访问

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

镜像模式集群改造

镜像队列列是Rabbit2.6.0版本带来的?一个新功能,允许内建双活冗余选项,与普通队列列不不同,镜像节点在集群中的其他节点拥有从队列列拷?贝,?一旦主节点不不可?用,最?老老的从队列列将被选举为新的主队列列。镜像队列列的?工作原理理:在某种程度上你可以将镜像队列列视为,拥有?一个隐藏的fanout交换器?,它指示者信道将消息分发到从队列列上。

设置镜像队列列

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

#随便便进?入?一个容器?docker exec -it rabbitmq01 bash#设置策略略匹配所有名称是amp开头的队列列都存储在2个节点上的命令如下rabbitmqctl set_policy -p / ha \ '{\#或者#设置策略略匹配所有名称的队列列都进?行行?高可?用配置rabbitmqctl set_policy -p / ha \ '{\mode\ #查询策略略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集群算是搭建完毕,访问创建?一个队列列测试?一下!如图所示! 查看镜像队列列rabbitmqctl list_policies 删除镜像队列列rabbitmqctl clear_policy 总结各位可以?自?己在docker容器?搭建试试。最后?大家在?生产环境下使?用也不不?用?自?己搭建,?目前市?面上阿?里里云、腾讯云 也提?高?比较优秀成熟的开箱即?用 消息中间件 供?大家选择使?用,如RocketMQ、Kafka、RabbitMQ;阿?里里云 · 消息队列列 MQ 消息队列列(Message Queue,简称 MQ)是构建分布式互联?网应?用的基础设施,通过 MQ 实现的松耦合架构设计可以提?高系统可?用性以及可扩展性,是适?用于现代应?用的最佳设计?方案。如有消息队列列 RocketMQ 版 阿?里里巴巴官?方指定消息产品,成熟、稳定、先进的技术体系打造?金金融级消息服务,感受双?十?一产品的完美体验。 腾讯云消息队列列 TDMQ(Tencent Distributed Message Queue,下?文中简称TDMQ)是?一款基于 Apache 顶级开源项?目 Pulsar ?自研的?金金融级分布式消息中间件。其计算与存储分离的架构设计,使得它具备极好的云原?生和 Serverless 特性,?用户按量量使?用,?无需关?心底层资源。它拥有原?生 Java 、 C++、Python、GO 等多种 API,同时?支持 kafka 协议以及 HTTP 协议?方式接?入,可为分布式应?用系统提供异步解耦和削峰填?谷的能?力力,具备互联?网应?用所需的海?量量消息堆积、?高吞吐、可靠重试等特性。TDMQ ?目前已应?用在腾讯计费绝?大部分场景,包括?支付主路路径、实时对账、实时监控、?大数据实时分析等?方?面。 其他问题如出现改过期警告: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的全部路路径就是“/var/lib/rabbitmq/.erlang.cookie”。注意:每个?人的erlang cookie位置可能不不同,?一定要查看?自?己的home dir路路径。

【集群搭建】使用docker快速搭建RabbitMQ服务集群

使?用docker搭建RabbitMQ集群RabbitMQ集群中节点包含内存节点(RAM)、磁盘节点(Disk,消息持久化)、集群中?至少有?一个Disk节点。集群分为两种集群模式普通模式和镜像模式。普通模式(默认)对于普通模式,集群中各节点有相同的队列列结构,但消息只会存在于集群中的?一个节点,对于消费者来说,若消息进?入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消
推荐度:
点击下载文档文档为doc格式
2uhmu9xk0p371qz5d0ci05ej21u0yu00k0s
领取福利

微信扫码领取福利

微信扫码分享