为何要搭建RabbitMQ集群?
如果只是为了学习RabbitMQ或者验证业务工程的正确性那么在本地环境或者测试环境上使用其单实例部署就可以了,但是出于MQ中间件本身的可靠性、并发性、吞吐量和消息堆积能力等问题的考虑,在生产环境上一般都会考虑使用RabbitMQ的集群方案。
集群方案原理
RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的。
设置多个RabbitMQ的节点,节点之间使用镜像队列来同步数据,并对外使用HAProxy反向代理,那么HAProxy就作为 对外访问的公共方式,不论是生产者还是消费者都访问HAProxy,再通过HAProxy访问RabbitMQ的节点,若其中的某些节点挂了也没关系,只要有一个存活就好,挂掉的节点修复好后数据又会被同步好。
单机多实例方式搭建集群
在一台虚拟机上启动2个RabbitMQ的节点,多节点之间用端口区分(实际搭建集群式用ip区分)。用云服务器的,记得去开启对应端口。
参考官方文档:https://www.rabbitmq.com/clustering.html
步骤:
1.先确保RabbitMQ运行没有问题
命令:rabbitmqctl status
2.停止rabbitmq服务
命令:service rabbitmq-server stop
3.启动第一个节点:
命令:
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit1 rabbitmq-server start
4.启动完第一个节点后,克隆会话用于启动第二条节点
web管理插件端口占用,所以还要指定其web插件占用的端口号。
命令: RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server start
再复制一个会话进行节点重置
5.rabbit1操作作为主节点:
依次执行以下命令:
rabbitmqctl -n rabbit1 stop_app
rabbitmqctl -n rabbit1 reset
rabbitmqctl -n rabbit1 start_app
6.rabbit2操作为从节点:
依次执行以下命令:
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit2 join_cluster rabbit1@‘super’ ###’'内是主机名换成自己的
rabbitmqctl -n rabbit2 start_app
7.查看集群状态
rabbitmqctl cluster_status -n rabbit1
至此,rabbit1和rabbit2组成了一个集群,但是还不完整,有许多问题(如数据不同步)
主节点:
可以看创建了的两个队列
从节点:
可以看创建了的两个队列
给从节点上的rabbit2队列发一条消息
再看主节点:
也可以看到rabbit2队列有一条消息
在正常运行的时候好像莫得什么问题,这时手动让rabbit2从节点挂掉