1.集群形式
RabbitMQ是用Erlag开发的,集群非常方便,因为Erlag天生就是一门分布式语言,但期本身就是分布式语言,但并不支持负载均衡(需要负载均衡的话弄一个nginx在实现)
RabbitMQ集群中节点包括内存节点(RAM)、磁盘节点(Disk,消息持久化),集群中至少有一个Disk节点
-
普通模式
对于普通模式,集群中各个节点有相同的队列结构,但消息只会存在于集群中的一个几点,对于消费者来说,若消息进入A节点的Queue中当从B节点拉取是,RabbitMQ会将消息从A中取出,并经过B发送给消费者。
应用场景:该模式适合于消息无需持久化的场合,如日志消息,当队列非持久化,且创建队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列,若持久化,只能等故障节点回复。 -
镜像模式
与普通模式不同之处的是消息实体会主动在镜像节点间同步,而不是在取数据时零时拉取,高可用,该模式下,mirror queue有一台选举算法,即一个master、n个slaver,生产者、消费者的请求都会转至master。
应用场景:可靠性要求较高场合,如下单,库存队列。
缺点:若镜像队列过多,且消息体量大,集群内部网络带宽会将此种同步通讯所消耗
1.镜像集群也是基于普通集群,即只有先搭建普通集群,然后才能设置镜像队列
2.若消费过程中,master挂掉,则选举新master,若未来得及确认,则可能重复消费。
2.集群搭建
1.启动RabbitMQ容器
主节点
docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /home/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='test' rabbitmq:management
从节点
docker run -d --hostname rabbitmq02 --name rabbitmq02 -v /home/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='test' --link rabbitmq01:rabbitmq01 rabbitmq:management
docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /home/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672 -e RABBITMQ_ERLANG_COOKIE='test' --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:management
2.进入容器修改配置
主节点
如果都是新创建的就不用下面的操作
停止当前RabbitMQ
rabbitmqctl stop_app
重置rabbitmq
rabbitmqctl reset
重启rabbitMQ
rabbitmqctl start_app
从节点
如果都是新创建的就不用下面的操作,这里两个从节点都执行
停止当前RabbitMQ
rabbitmqctl stop_app
重置rabbitmq
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
重启rabbitMQ
rabbitmqctl start_app
3.查看效果
目前集群处于普通集群状态,普通集群容易出现单点故障,而且这里持久化数据只有rabbitmq01才有,只有它的info标识为dise
4.升级为镜像集群
进入任意集群容器内部
docker exec -it rabbitmq03 /bin/bash
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
ha-mode:策略模式,all即复制到所有节点,包含新增节点
ha :策略名字
-p / 代表虚拟主机
“^": 策略正则表达式为“^"表示所有匹配所,表示匹配所有的队列,所有的队列都使用高可用策略
ha-sync-mode:同步模式automatic,rabbitmq自动同步
查看集群中虚拟主机为/的策略
rabbitmqctl list_policies -p /;
5.验证镜像模式
rabbitmq01创建hello队列
切换到rabbitmq02、rabbitmq03队列中查看
队列都是同步存在的!
在任意rabbitmq中发送一条消息
其他rabbitmq同步接收
任意rabbitmq接收消息,并ACK
其他rabbitmq中的消息也会被同时ACK签收