docker 安装 RabbitMQ 集群

1、集群形式

RabbiMQ 是用 Erlang 开发的,集群非常方便,因为 Erlang 天生就是一门分布式语言,但其
本身并不支持负载均衡。
RabbitMQ 集群中节点包括内存节点(RAM)、磁盘节点(Disk,消息持久化) ,集群中至少有
一个 Disk 节点。

  • 普通模式(默认)
    对于普通模式,集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节
    点。对于消费者来说,若消息进入 A 节点的 Queue 中,当从 B 节点拉取时,RabbitMQ 会
    将消息从 A 中取出,并经过 B 发送给消费者。
    应用场景:该模式各适合于消息无需持久化的场合,如日志队列。当队列非持久化,且
    创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化,
    只能等故障节点恢复。

  • 镜像模式
    与普通模式不同之处是消息实体会主动在镜像节点间同步,而不是在取数据时临时拉
    取,高可用;该模式下,mirror queue 有一套选举算法,即 1 个 master、n 个 slaver,生产
    者、消费者的请求都会转至 master。
    应用场景:可靠性要求较高场合,如下单、库存队列。
    缺点:若镜像队列过多,且消息体量大,集群内部网络带宽将会被此种同步通讯所消
    耗。
    (1)镜像集群也是基于普通集群,即只有先搭建普通集群,然后才能设置镜像队列。
    (2)若消费过程中,master 挂掉,则选举新 master,若未来得及确认,则可能会重复消费。

2、集群搭建

创建映射目录:

#创建映射目录
mkdir /mydata/rabbitmq

#进入到映射目录
cd /mydata/rabbitmq

#创建三个目录
mkdir rabbitmq01 rabbitmq02 rabbitmq03
2-1、创建并运行三个容器:

搭建RabbitMQ集群

步骤一:安装RabbitMQ;

步骤二:加入RabbitMQ节点到集群;

步骤一:安装RabbitMQ

docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.5-management
docker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.5-management
docker run -d --hostname rabbit3 --name myrabbit3 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.5-management

具体的参数含义,参见上文“启动RabbitMQ”部分。

注意点:

多个容器之间使用“–link”连接,此属性不能少;
Erlang Cookie值必须相同,也就是RABBITMQ_ERLANG_COOKIE参数的值必须相同,原因见下文“配置相同Erlang Cookie”部分;
步骤二:加入RabbitMQ节点到集群
设置节点1:

docker exec -it myrabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

设置节点2,加入到集群:

docker exec -it myrabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app
exit

参数“–ram”表示设置为内存节点,忽略次参数默认为磁盘节点。

设置节点3,加入到集群:

docker exec -it myrabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app
exit

设置好之后,使用http://物理机ip:15672 进行访问了,默认账号密码是guest/guest,效果如下图:
在这里插入图片描述

启动了3个节点,1个磁盘节点和2个内存节点。

配置相同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路径。

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

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

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

容器复制文件到物理机:docker cp 容器名称:容器目录 物理机目录
物理机复制文件到容器:docker cp 物理机目录 容器名称:容器目录
设置Erlang Cookie文件权限:“chmod 600 /var/lib/rabbitmq/.erlang.cookie”。

3、实现镜像集群

docker exec -it myrabbit1 bash
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
#可以使用  rabbitmqctl list_policies -p /;查看 vhost/下面的所有 policy
#在 cluster 中任意节点启用策略,策略会自动同步到集群节点
rabbitmqctl set_policy-p/ha-all"^"{“ha-mode”:“all”}#策略模式  all 即复制到所有节点,包含新增节点,策略正则表达式为   “^” 表示所有匹配所有队列名称。“^hello”表示只匹配名为 hello 开始的队列

4、集群测试

随便在 mq 上创建一个队列,发送一个消息,保证整个集群其他节点都有这个消息。如果
master 宕机,其他节点也能成为新的 master

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的小蜗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值