Docker搭建RabbitMq的普通集群和镜像集群的详细操作
作者:我什么时候能变强啊! 发布时间:2021-05-26 03:35:27
普通集群:多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构、交换器结构、vhost等。消费者消费消息时,会从各个节点拉取消息,如果保存消息的节点故障,则无法消费消息,如果做了消息持久化,那么得等该节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
镜像集群:它是在普通模式的基础上,把需要的队列做成镜像队列,存在于多个节点来实现高可用(HA)。该模式解决了上述问题,Broker会主动地将消息实体在各镜像节点间同步,在consumer取数据时无需临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被大量消耗。通常地,对可靠性要求较高的场景建议采用镜像模式。
一、搭建RabbitMq的运行环境
我本机是window10,通过docker搭建两个rabbitmq节点。
1.通过search查询rabbitmq镜像
docker search rabbitmq
2.通过pull拉取rabbitmq的官方最新镜像
这里最好带上tag为management的版本,否则拉最新的latest,web管理页无法显示全,会提示overview:management only mode
docker pull rabbitmq:3.8.25-management
3.创建容器
docker run -d --name rabbitmq1 -p 5672:5672 -p 15672:15672 --hostname myRabbit1 -e RABBITMQ_DEFAULT_VHOST=my_vhost1 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin a4eb038c2ecb
--name:容器名称
-p:端点映射
--hostname:rabbitmq的节点名称
-e RABBITMQ_DEFAULT_VHOST:虚拟主机名称
-e RABBITMQ_DEFAULT_USER:登录账号
-e RABBITMQ_DEFAULT_PASS:登录密码
a4eb038c2ecb是镜像id,根据自己情况替换。
4.启动管理页面
我们的镜像默认没有开启web管理页面,所以我们通过exec命令进入容器启动,这个镜像的环境是ubuntu的
PS C:\> docker exec -it 639a151c5440 /bin/bash
root@myRabbit:/# rabbitmq-plugins enable rabbitmq_management
浏览器中访问http://localhost:15672/即可打开,另一个rabbitmq如法炮制,区别之处在于更换端口为5673和15673等,并且创建容器时使用--link连接第一个rabbitmq节点(也可创建桥接网络network连接),如下
docker run -d --name rabbitmq2 -p 5673:5672 -p 15673:15672 --hostname myRabbit2 -e RABBITMQ_DEFAULT_VHOST=my_vhost2 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --link rabbitmq1:myRabbit1 a4eb038c2ecb
5.设置erlang cookie
erlang cookie原本可以通过run容器时设置参数-e RABBITMQ_ERLANG_COOKIE,但是现在过期弃用了。
我们先通过docker logs命令查看容器的运行日志,寻找home dir参数如下
PS D:\> docker logs rabbitmq1
//.....这里省略
Starting broker...2021-11-17 02:19:55.859245+00:00 [info] <0.222.0>
2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> node : rabbit@myRabbit1
2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> home dir : /var/lib/rabbitmq
2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> config file(s) : /etc/rabbitmq/conf.d/10-default-guest-user.conf
2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> : /etc/rabbitmq/conf.d/management_agent.disable_metrics_collector.conf
2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> cookie hash : Aed9pjd9vYWw3hng7Gjmkg==
2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> log(s) : /var/log/rabbitmq/rabbit@myRabbit1_upgrade.log
2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> : <stdout>
2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> database dir : /var/lib/rabbitmq/mnesia/rabbit@myRabbit1
所以.erlang.cookie文件在此路径下,我们进入容器可以看到此文件
root@myRabbit1:~# ls -a /var/lib/rabbitmq
. .. .bash_history .erlang.cookie mnesia
我们再设置erlang cookie的权限,在容器内运行如下代码,如果权限不够后续操作会报错
chmod 600 /var/lib/rabbitmq/.erlang.cookie
之后我们通过docker cp命令将rabbitmq1中的.erlang.cookie文件拷到物理机上再拷贝到rabbitmq2的容器中,物理机和容器之间复制命令如下:
容器复制文件到物理机:docker cp 容器名称:容器目录
物理机目录物理机复制文件到容器:docker cp 物理机目录 容器名称:容器目录
具体代码如下:
docker cp rabbitmq1:/var/lib/rabbitmq/ d:\workspace\
docker cp d:\workspace\rabbitmq\.erlang.cookie rabbitmq2:/var/lib/rabbitmq/
复制之后需要重启rabbitmq2容器,否则执行rabbitmqctl命令报如下错误:
[error] Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only
二、普通模式
重启后进入容器将rabbitmq2的节点加入rabbitmq1中创建普通集群,分别执行如下代码即可:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@myRabbit1 //myRabbitmq1为rabbitmq1容器中rabbitmq的hostname
rabbitmqctl start_app
之后我们再web管理页可以看到两个节点了。
在任意一个节点创建一个队列,另一个节点也会生成相同的队列。而且可以发现rabbitmq2的vhost从my_vhost2变为了my_vhost1与rabbitmq相同了。
三、镜像模式
镜像模式就是在普通模式的基础上进入rabbitmq1容器输入如下命令即可:
rabbitmqctl set_policy -p my_vhost1 ha-all "^" '{"ha-mode":"all"}' --apply-to all
具体的格式为
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的优先级
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' --apply-to all
或者登录rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy
name:策略名称
Pattern:^ 匹配符,只有一个^代表匹配所有。^message指同步“message”开头的队列名称
Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)
Priority:优先级,首先根据priority
排序,值越大的优先级越高;相同priority
则根据创建时间排序,越晚创建的优先级越高。
简单说明一下 Operator Policy 和 User Policy 的区别:
Operator Policy 是给服务提供商或公司基础设施部门用来设置某些需要强制执行的通用规则
User Policy 是给业务应用用来设置的规则
Operator Policy 和 User Policy 会合并后作用于队列,并且为防止 Operator Policy 对队列某些关键属性例如死信队列交换器Dead Letter Exchange
的覆盖导致业务应用产生非预期的结果,Operator Policy 只支持expire
、message-ttl
、max-length
、max-length-bytes
4个参数。
参考学习:
https://www.cnblogs.com/knowledgesea/p/6535766.html
https://blog.csdn.net/belonghuang157405/article/details/83540148
来源:https://www.cnblogs.com/xwc1996/p/15561307.html


猜你喜欢
- 5月12日消息,近日,微软董事长比尔盖茨表示,微软将在5月底推出一个免费的可以探索夜空影像的桌面软件工具,该工具名为全球望远镜(WorldW
- 综合 * 站点,往往因为使用的社区应用较多,针对不同社区应用提供了多个后台。对于新浪、腾讯这样的大型媒体来说,各个栏目都有对应的人员分工,操
- 核心提示:搜索引擎与搜索引擎营销之间的关系,究竟什么才是未来的发展方向?我们的目的是什么?本质上都是从用户出发,可究竟未来可变的路线是什么?
- 昨天IT龙门阵又一次请到了校内的负责人许朝军,上次他来龙门阵是2007年的圣诞节,上次来龙门阵的时候,他还没有这么牛X。这次来明显感觉不一样
- 计算机的发展很快,国内大部分中小型企业都采购有服务器。在中小型企业服务器应用当中,笔者接触最多的两种应用是:企业内部文件交换与存储的文件服务
- 据官方消息,Discuz!X1.5视频发布会将于9月20日下午1点30分举行,目前已进入倒计时阶段。本次发布会将采用视频互动的方式,通过官方
- 大家今天来木木的网站有没有发觉到网站有点不一样,没错是木木在网站加了两个广告,希望没有影响到你们的浏览。如果有你们感兴趣的广告,那么就在木木
- 上个月,发布了一篇拙文《提升个人诚信度的六个小技巧》,和大家探讨了如何通过网络提升个人诚信度,今天再来和大家探讨一下,企业如何通过网站来树立
- 公司之前闲置了一台配置不错的服务器,让我用EXSI 6.0做成N多个虚拟机了,这样开发部署测
- 北京时间11月3日消息,千橡互动集团董事长兼首席执行官陈一舟今日做客腾讯科技互联网大会访谈室时表示,公司发展重心仍然保持在人人网上。持续在较
- 10月16日消息,据国外媒体报道,谷歌Android智能手机操作系统正在以很快的速度开发。与其它的操作系统相比,虽然Android推出的时间
- 准备一个CentOS6的安装盘(任意版本),或准备一张其他pnux的安装盘,此处以CentOS6为例。本文都已经经过实践,在Windows虚
- 使用Apache Camel的REST服务Apache Camel可以作为一个独立的或嵌入的库在任何地方运行,它可以帮助整合。继续阅读,了解
- 对一个电子商务网站来说,需要运用最少的带宽和服务器资源,为更多的客户提供更快捷的服务。而用户对Web站点的满意度,主要以访问速度来衡量。&n
- 3月3日消息,百度已正式成立客户端部,将统领原有的客户端软件部、客户端软件业务部、千千音乐部等三个部门。原百度客户端软件总监王啸将另有任命,
- “如果不刷信用,谁会来买你的东西?”“当然选刷。”&
- 垂直生活类搜索网站的出现,使互联网庞杂的生活类信息由粗糙变为精细。更能满足用户需求 随着互联网信息的 * 式增长,搜索到精准、有效信息的难度越
- 应用Google Adwords的营销者们现在有了一个新的定向选择。Google Adwords广告系统升级后,商业企业可以根据
- Apache Shiro的配置主要分为四部分:对象和属性的定义与配置URL的过滤器配置静态用户配置静态角色配置其中,由于用户、角色一般由后台
- 随着应用软件的开发规模及复杂程度日趋大型化,使得软件开发模式从早期的个人作坊式渐渐转变为团队协作开发方式,在这种团队协作的开发模式,为了管理