搭建集群
rabbitmq集群允许消费者和生产者在RabbitMQ单个节点崩溃的情况下继续运行,它可以通过添加更多的节点来线性的扩展消息通信的吞吐量。当失去一个rabbitMQ节点时,客户端能够重新连接到集群中的任何其他节点并继续生产或者消费
注意:集群也不能保证消息的万无一失。集群会备份节点的所有元数据信息(队列元数据:名称及属性;交换器:名称及属性;绑定关系元数据:交换器与队列或者交换器与交换器之间的绑定关系;vhost元数据:vhost内的队列、交换器和绑定提供命名空间及安全属性),但并不会备份节点中的消息(可以通过特殊配置镜像队列来备份)。即当节点崩溃时,该节点中的消息也会丢失。
多机多节点
rabbitmq对延迟非常敏感,应当只在本地局域网内使用。
- 配置host,保证各个主机都可以使用主机名称正确的访问到其他主机
例如:三台机器主机名称分别为node1、node2、node3,需配置host如下:
192.168.0.2 | node1 |
192.168.0.3 | node2 |
192.168.0.4 | node3 |
- 编辑rabbitMQ的cookie文件,确保各个结点的cookie文件使用的是同一个值
cookie相当于密钥令牌,集群中的rabbitmq节点需要通过交换密钥令牌以获得相互认证。
其他操作参考单机多节点,启动命令去掉节点参数即可。
单机多节点
- 启动命令
rabbitmq_node_port=5672 rabbitmq_nodename=rabbit1 rabbitmq-server -detached
rabbitmq_node_port=5673 rabbitmq_nodename=rabbit2 rabbitmq-server -detached
rabbitmq_node_port=5674 rabbitmq_nodename=rabbit3 rabbitmq-server -detached
注意:当第一个启动成功后,第二个第三个启动失败大多数是因为配置端口冲突造成的。除了rabbitmq的端口需要修改之外,mq的插件例如rabbitmq managment的端口也需要修改
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" rabbitmq-server -detached
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit2 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 RABBITMQ_NODENAME=rabbit3 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" rabbitmq-server -detached
- 停止第二个结点应用,并将第二个节点加入第一个节点中
rabbitmqctl -n rabbit2@iZbp1han4z0731tnhucpyyZ stop_app
rabbitmqctl -n rabbit2@iZbp1han4z0731tnhucpyyZ reset
rabbitmqctl -n rabbit2@iZbp1han4z0731tnhucpyyZ join_cluster rabbit1@iZbp1han4z0731tnhucpyyZ
rabbitmqctl -n rabbit2@iZbp1han4z0731tnhucpyyZ start_app
以内存节点的方式加入集群
rabbitmqctl -n rabbit2@iZbp1han4z0731tnhucpyyZ join_cluster rabbit1@iZbp1han4z0731tnhucpyyZ --ram
如果已加入集群,可以停止应用后执行如下命令重新启动
rabbitmqctl -n rabbit2@iZbp1han4z0731tnhucpyyZ change_cluster_node_type ram
其他节点同理
- 最终效果
剔除节点
方式一
首先停止需要剔除的节点,之后在集群中的其他节点上窒息以下命令(以节点1为例)
rabbitmqctl forget_cluster_node rabbit1@iZbp1han4z0731tnhucpyyZ {-offline}
-offline:在非运行状态下执行
方式二
停止剔除节点的应用,然后执行以下操作,重新启动后就退出集群了
rabbitmqctl -n rabbit1@iZbp1han4z0731tnhucpyyZ reset
集群升级
- 关闭所有节点的服务,使用rabbitmqctl stop命令
- 保存各个节点的Mnesia数据
- 解压新版本到指定目录
- 指定新版本的Mnesia数据为步骤2保存的Mnesia数据路径
- 按照顺序启动新版本
注意事项
如果关闭了集群中的所有节点,则需要确保在启动的时候最后关闭的节点是第一个启动的。否则,启动的节点会等待最后关闭节点的启动。如果最后一个节点未启动,那么该节点也启动失败。如果最后一个节点发生异常,则需要剔除该节点。
在集群中,创建队列、绑定关系等时,所有的节点都成功后才会返回成功,因为磁盘节点写入的时间、速度等较慢,因此系统绝大多数节点都为内存节点。如果当系统中只有一个磁盘节点,当该节点崩溃时,系统可以正常的接收发送消息,但是无法创建用户、队列、绑定关系、更改权限等操作,因此建立集群的时候需要保证有两个或者更多的磁盘节点存在。
mq创建队列及绑定关系的操作较少,大多数都是生产和消费消息时,为了确保集群的可靠性或者不确定应该选内存节点还是磁盘节点时,建立使用磁盘节点。