前言
rabbitMQ 集群对延迟非常敏感,应当只在本地局域网内使用。在广域网中不应该使用集群,而应该使用 Federation 或者 Shovel 来代替。
假设有三个物理机
1 | 192.168.56.201 node1 |
每个节点上都需要安装 rabbitMQ,这里不再赘述如何安装,请参考:rabbitMQ 安装
节点互相识别
在每个节点服务器上配置 ip 地址与节点名称的映射信息,编辑 /etc/hosts
文件,添加以下内容
1 | 192.168.56.201 node1 |
设置密钥令牌
编辑 rabbitMQ 的 cookie 文件,确保每个节点的 cookie 文件使用的是同一个值。可以取 node1 节点的 cookie 值,然后复制到 node2 和 node3 节点中。cookie 文件默认路径为 /var/lib/rabbitmq/.erlang.cookie
或者 $HOME/.erlang.cookie
cookie 相当于密钥令牌,集群中的 rabbitMQ 节点需要通过交换密钥令牌以获得相互认证。如果节点的密钥令牌不一致,在配置节点时会报以下错误。
1 | [joden@node3 ~]$ rabbitmqctl join_cluster rabbit@node1 |
配置集群
配置集群有三种方式:
- 通过
rabbitmqctl
工具配置 - 通过
rabbitmq.config
配置文件配置 - 通过
rabbitmq-autocluster
插件配置
这里只介绍 rabbitmqctl
工具配置,这是最常用的方式,其他两种方式在实际应有中很少使用。
启动三个节点的 RabbitMQ 服务
1 | [joden@node1 ~]$ rabbitmq-server -detached |
这3个节点目前都是以独立的节点存在的单个集群,可以通过 rabbitmqctl cluster_status
命令查看各个节点状态。
node1:
1 | [joden@node1 ~]$ rabbitmqctl cluster_status |
node2:
1 | [joden@node2 ~]$ rabbitmqctl cluster_status |
node3:
1 | [joden@node3 ~]$ rabbitmqctl cluster_status |
组成集群
以 node1 节点为基准,讲 node2 和 node3 节点加入到 node1 节点集群中。
以 node2 为例,仅需要执行以下步骤即可
停止
1
2
3[joden@node2 ~]$ rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node2 ...
[joden@node2 ~]$重置
1
2
3[joden@node2 ~]$ rabbitmqctl reset
Resetting node rabbit@node2 ...
[joden@node2 ~]$加入 node1 节点集群
1
2[joden@node2 ~]$ rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node2 with rabbit@node1启动
1
2
3[joden@node2 ~]$ rabbitmqctl start_app
Starting node rabbit@node2 ...
[joden@node2 ~]$
这时候在 node1 或者 node2 执行 rabbitmqctl cluster_status
,都可以看到以下输出
1 | [joden@node2 ~]$ rabbitmqctl cluster_status |
同样操作对 node3 执行即可。
关闭节点
如果关闭了集群中所有节点,需要确保在启动的时候最后关闭的那个节点是第一个启动的。如果第一个启动的并不是最后关闭的节点,那么这个节点会等待最后那个节点启动,等待时间为30秒,如果没有等到,这个先启动的节点也会失败。
如果最后一个关闭的节点由于某些异常无法启动,可以通过 rabbitmqctl forget_cluster_node
命令来将这个节点踢出当前集群。如果所有节点由于非正常因素关闭(比如断电),那么集群中的节点都会认为还有其他节点在它后面关闭。这时需要调用 rabbitmqctl force_boot
命令来启动一个节点,之后集群才能正常启动。