RabbitMQ集群

1、集群形式

RabbitMQ是用 Erlang开发的,集群非常方便,因为 Erlang天生就是一门分布式语言,但其本身并不支持负载均衡。

RabbitMQ集群中节点包括内存节点(RAM)、磁盘节点(Disk,消息持久化),集群中至少有一个Dsk节点。

  • 普通模式(默认)

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

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

  • 镜像模式

与普通模式不同之处是消息实体会主动在镜像节点间同步,而不是在取数据时临时拉取,高可用;该模式下, mirror queue有一套选举算法,即1个 master、n个 slaver,生产

者、消费者的请求都会转至 master

应用场景:可靠性要求较高场合如下单、库存队列。

缺点:若镜像队列过多,且消息体量大,集群内部网络带宽将会被此种同步通讯所消耗。

(1)镜像集群也是基于普通集群,即只有先搭建普通集群,然后才能设置镜像队列。

(2)若消费过程中, master挂掉,则选举新 master,若未来得及确认,则可能会重复消费

2、搭建集群

mkdir /mydata/rabbitmq
cd rabbitmq/
mkdir rabbitmq01 rabbitmq02 rabbitmq03

docker run -d --hostname rabbitmq01 --name rabbitmq01 \
-v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq \
-p 15673:15672 -p 5673:5672 \
-e RABBITMQ_ERLANG_COOKIE='diandi' rabbitmq:3.8.2-management



docker run -d --hostname rabbitmq02 --name rabbitmq02 \
-v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq \
-p 15674:15672 -p 5674:5672 \
-e RABBITMQ_ERLANG_COOKIE='diandi' --link rabbitmq01:rabbitmq01  rabbitmq:3.8.2-management




docker run -d --hostname rabbitmq03 --name rabbitmq03 \
-v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq \
-p 15675:15672 -p 5675:5672 \
-e RABBITMQ_ERLANG_COOKIE='diandi' --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02  rabbitmq:3.8.2-management

--hostname 设置容器的主机名

RABBITMQ_ERLANG_COOKIE 节点认证作用,部署集成时 需要同步该值

3、节点加入集群

docker exec -it rabbitmq01 /bin/bash

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit


#进入第二个节点
docker exec -it rabbitmq02 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

#进入第三个节点
docker exec -it rabbitmq03 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

4、实现镜像集群

docker exec -it rabbitmq01 /bin/bash
root@rabbitmq01:/# rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Setting policy "ha" for pattern "^" to "{"ha-mode":"all","ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...


可以使用 rabbitmqctl list_policies -p /; 查看vhost/下面的所有policy
root@rabbitmq01:/# rabbitmqctl list_policies -p /
Listing policies for vhost "/" ...
vhost   name    pattern apply-to        definition      priority
/       ha      ^       all     {"ha-mode":"all","ha-sync-mode":"automatic"}    0

在cluster中任意节点启用策略,策略会自动同步到集群节点

rabbitmqctl set_policy -p /ha-all"^"'{"ha-mode":"all"}'

策略模式 all 即复制到所有节点,包含新增节点,策略正则表达式为 "^" 表示所有匹配

测试rabbitmq集群

① 在rabbitmq01中建立持久化队列 hello,可以在rabbitmq02,rabbitmq03中看到hello队列

② 在rabbitmq01中发送一条持久化消息,可以在rabbitmq02,rabbitmq03,看到该消息,在rabbitmq02 以ack模式接收消息,在rabbitmq01,rabbitmq03改消息消失

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值