在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
普通集群:多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构、交换器结构、vhost等。消费者消费消息时,会从各个节点拉取消息,如果保存消息的节点故障,则无法消费消息,如果做了消息持久化,那么得等该节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。 镜像集群:它是在普通模式的基础上,把需要的队列做成镜像队列,存在于多个节点来实现高可用(HA)。该模式解决了上述问题,Broker会主动地将消息实体在各镜像节点间同步,在consumer取数据时无需临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被大量消耗。通常地,对可靠性要求较高的场景建议采用镜像模式。 一、搭建RabbitMq的运行环境我本机是window10,通过docker搭建两个rabbitmq节点。 1.通过search查询rabbitmq镜像
2.通过pull拉取rabbitmq的官方最新镜像这里最好带上tag为management的版本,否则拉最新的latest,web管理页无法显示全,会提示overview:management only mode
3.创建容器
--name:容器名称 -p:端点映射 --hostname:rabbitmq的节点名称 -e RABBITMQ_DEFAULT_VHOST:虚拟主机名称 -e RABBITMQ_DEFAULT_USER:登录账号 -e RABBITMQ_DEFAULT_PASS:登录密码 a4eb038c2ecb是镜像id,根据自己情况替换。 4.启动管理页面我们的镜像默认没有开启web管理页面,所以我们通过exec命令进入容器启动,这个镜像的环境是ubuntu的
浏览器中访问http://localhost:15672/即可打开,另一个rabbitmq如法炮制,区别之处在于更换端口为5673和15673等,并且创建容器时使用--link连接第一个rabbitmq节点(也可创建桥接网络network连接),如下
5.设置erlang cookieerlang 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文件在此路径下,我们进入容器可以看到此文件
我们再设置erlang cookie的权限,在容器内运行如下代码,如果权限不够后续操作会报错
之后我们通过docker cp命令将rabbitmq1中的.erlang.cookie文件拷到物理机上再拷贝到rabbitmq2的容器中,物理机和容器之间复制命令如下:
具体代码如下:
复制之后需要重启rabbitmq2容器,否则执行rabbitmqctl命令报如下错误:
二、普通模式重启后进入容器将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 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:优先级,首先根据 简单说明一下 Operator Policy 和 User Policy 的区别:
Operator Policy 和 User Policy 会合并后作用于队列,并且为防止 Operator Policy 对队列某些关键属性例如死信队列交换器 参考学习: https://www.cnblogs.com/knowledgesea/p/6535766.html https://blog.csdn.net/belonghuang157405/article/details/83540148 到此这篇关于Docker搭建RabbitMq的普通集群和镜像集群的文章就介绍到这了,更多相关Docker搭建RabbitMq集群内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论