集群
官方参考文档:https://www.rabbitmq.com/clustering.html
RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的。
在实际使用过程中多采取多机多实例部署方式,为了便于同学们练习搭建,有时候你不得不在一台机器上去搭建一个rabbitmq集群,本章主要针对单机多实例这种方式来进行开展。
集群搭建
配置的前提是你的rabbitmq可以运行起来,比如”ps aux|grep rabbitmq”你能看到相关进程
ps aux|grep rabbitmq
或者
systemctl status rabbitmq-server
注意:确保RabbitMQ可以运行的,确保完成之后,把单机版的RabbitMQ服务停止,后台看不到RabbitMQ的进程为止
systemctl stop rabbitmq-server
单机多实例搭建
-
启动第一个节点
sudo RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit-1 rabbitmq-server start &
-
启动第二个节点
sudo RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit-2 rabbitmq-server start &
-
验证启动
ps aux|grep rabbitmq
-
rabbit-1作为主节点
#停止应用 > sudo rabbitmqctl -n rabbit-1 stop_app #目的是清除节点上的历史数据(如果不清除,无法将节点加入到集群) > sudo rabbitmqctl -n rabbit-1 reset #启动应用 > sudo rabbitmqctl -n rabbit-1 start_app
-
rabbit-2作为从节点
# 停止应用 > sudo rabbitmqctl -n rabbit-2 stop_app # 目的是清除节点上的历史数据(如果不清除,无法将节点加入到集群) > sudo rabbitmqctl -n rabbit-2 reset # 将rabbit2节点加入到rabbit1(主节点)集群当中【Server-node服务器的主机名】 > sudo rabbitmqctl -n rabbit-2 join_cluster rabbit-1@'Server-node' # 启动应用 > sudo rabbitmqctl -n rabbit-2 start_app
-
验证集群状态
sudo rabbitmqctl cluster_status -n rabbit-1
Web监控
-
安装命令
rabbitmq-plugins enable rabbitmq_management
-
添加用户并赋予权限
rabbitmqctl -n rabbit-1 add_user admin admin rabbitmqctl -n rabbit-1 set_user_tags admin administrator rabbitmqctl -n rabbit-1 set_permissions -p / admin ".*" ".*" ".*" rabbitmqctl -n rabbit-2 add_user admin admin rabbitmqctl -n rabbit-2 set_user_tags admin administrator rabbitmqctl -n rabbit-2 set_permissions -p / admin ".*" ".*" ".*"
-
一定记得在服务器上安全组开放5672,15672,5673,15673端口,否则无法访问
-
测试访问http://ip地址:15672/#/ 和http://ip地址:15673/#/
测试
-
假设我们现在将rabbit-2停掉
[root@hecs-66166 ~]# rabbitmqctl -n rabbit-2 stop_app Stopping rabbit application on node rabbit-2@hecs-66166 ...
并且rabbit-2的图形化管理页面也不能访问
-
现在我们在rabbit-1新建一个队列,然后将rabbit-2启动,rabbit-1停掉
[root@hecs-66166 ~]# rabbitmqctl -n rabbit-1 stop_app Stopping rabbit application on node rabbit-1@hecs-66166 ...
rabbit-1的图形化管理页面也不能访问,rabbit-2的图形化管理页面发现队列无法使用了