栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 数据挖掘与分析

RabbitMQ集群

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改消息消失

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/278668.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号