rabbitmq集群
集群优点:
- 避免单节点故障, 提高服务可用性
- 提高服务性能,单机吞吐量有限,集群可以扩展节点,将流量分摊到集群中各个节点,提升rabbitmq吞吐量
rabbitmq集群,在失去一个节点时, 客户端能够重新连接到集群中的其他节点并继续生产或者消费, 提高可用性, 但是集群也不能保证消息不被丢失。
有一点需要注意的是,rabbitmq集群中的节点间的数据其实是不共享的, 因此当rabbitmq集群中的一个节点宕机时候, 该节点上的所有队列中的消息都会丢失,除非该节点做持久化,但是在该节点宕机期间,该节点的消息也不会在其他节点处理并被消费者消费
因为集群在创建队列时,只会在单个节点而不是所有节点创建对垒进程并包含队列的信息,因此只有在队列所属的节点上知道队列的所有信息,其他节点只知道对垒的元数据和指向该队列存在的那个节点的指针
但是对于交换机, 交换机创建时 rabbitmq会将绑定的列表添加到集群中的所有节点上, 这样每个节点的每个信道都可以访问到新的交换机
rabbitmq集群中所有节点都会备份所有元数据信息1. 队列 2. 交换机 3. 绑定关系元数据 4. vhost元数据
集群搭建准备:
- 节点准备
rabbitmq集群至少是需要三个节点, 因此可以参考单节点搭建方法先准备三个节点
并启动服务:
systemctl start rabbitmq-server
- 添加hosts
192.168.137.23 node3
192.168.137.22 node2
192.168.137.21 node1
-
同步erlang.cookie
读取其中一个节点的cookie, 并复制到其他节点
(cookie相当于秘钥令牌, 集群中的rabbitmq节点之间通过cookie确定相互是否可通信, 即是互信关系)
cookie存放在/var/lib/rabbitmq/.erlang.cookie或者$HOME/.erlang.cookie中
[root@node3 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 20 Jun 24 00:00 /var/lib/rabbitmq/.erlang.cookie
[root@node3 ~]# cat /var/lib/rabbitmq/.erlang.cookie
OKQPUWCBJPVLCMCKOJZZ
- 查看各节点的状态: rabbitmqctl status, rabbitmqctl cluster_status
- 重启服务
systemctl status rabbitmq-server
- 配置集群
选择一个节点作为主节点进行执行,例如这里选择node3
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
[root@node3 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node3 ...
[root@node3 ~]# rabbitmqctl reset
Resetting node rabbit@node3 ...
[root@node3 ~]# rabbitmqctl start_app
Starting node rabbit@node3 ...
completed with 0 plugins.
在第二个节点和第三个节点依次执行:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node3
rabbitmqctl start_app
- 集群查看
[root@node3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
{running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},