搭建集群


        RabbitMQ的集群是平等的,首先搭建好两个以上的rabbitmq单机节点,这里演示三台。将第二三个节点加入到第一个节点中。

1、配置主机名,并能够使用主机名互相ping通。

192.168.1.116    rabbitmq01
192.168.1.117    rabbitmq02
192.168.1.118    rabbitmq03

2、编辑RabbitMQ的cookie文件,各个节点的cookie文件中的值要相同。文件位置在 /var/lib/rabbitmq/.erlang.cookie 可以将这个文件使用 scp传到各个节点的相同位置,也可以修改其中的值。

scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq02:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq03:/var/lib/rabbitmq/

如果这个值并不相同会报错。

3、分别启动三个节点。

systemctl start rabbitmq-server

查看各个节点的状态,此时应该只有一个节点。

rabbitmqctl cluster_status

然后到第二个节点rabbitmq02执行如下命令:

[root@rabbitmq02 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl reset
Resetting node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl join_cluster rabbit@rabbitmq01
Clustering node rabbit@rabbitmq02 with rabbit@rabbitmq01 ...
[root@rabbitmq02 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq02 ...
[{nodes,[{disc,[rabbit@rabbitmq01,rabbit@rabbitmq02]}]},
...

        可以看到这时的集群状态已经有两个节点了,在第一个节点rabbitmq01上可以看到同样的输出。然后在rabbitmq03节点上也执行同样的操作。

4、三个节点都加入到集群之后载查看集群状态:

rabbitmqctl cluster_status

如果三个节点都存在说明集群搭建完成。可以在页面客户端的overview栏看到。

image.png


集群管理


停止某个节点:只要执行如下命令就可以停止某个集群的节点。

rabbitmqctl stop_app

停止后可以在其他节点上看到集群状态:已近没有停掉的那个节点了。

[root@rabbitmq01 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq01 ...
[{nodes,[{disc,[rabbit@rabbitmq01,rabbit@rabbitmq02,rabbit@rabbitmq03]}]},
 {running_nodes,[rabbit@rabbitmq03,rabbit@rabbitmq01]},  #已近没有rabbitmq02节点了
 {cluster_name,<<"rabbit@rabbitmq01">>},
 {partitions,[]},
 {alarms,[{rabbit@rabbitmq03,[]},{rabbit@rabbitmq01,[]}]}]

再次启动rabbitmq02就会自动加入到集群中:

rabbitmqctl start_app


关闭集群:

        最后关闭的节点必须要第一个启动。如果第一个启动的不是最后关闭的其他节点会等待30秒,并在此时间内重试10次。如果不成功当前节点也会启动失败而关闭应用。

[root@rabbitmq01 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq01 ...   #在等待最后关闭的节点启动

如果没等最后关闭的节点启动则报如下错误:

BOOT FAILED
===========

Timeout contacting cluster nodes: [rabbit@rabbitmq02,rabbit@rabbitmq01].

BACKGROUND
==========

This cluster node was shut down while other nodes were still running.
...

如果最后关闭的节点无法启动这是用如下命令来讲此节点提出当前集群。

rabbitmqctl force_cluster_node rabbit@rabbitmq01 --offline

        --offline    表示当前节点在非运行状态

意外情况下关闭集群处理:

        意外情况下关闭集群,这时需要启动集群时所有节点都会以为最后一个关闭的节点没有启动,这时需要先执行如下命令,然后才能启动节点。

rabbitmqctl force_boot

剔除单个节点:

一般情况下使用如下命令:如要剔除rabbitmq02节点,可以在rabbitmq02节点上执行。

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

这时查看集群状态就没有rabbitmq02了。


节点类型:

查看节点类型:

rabbitmqctl cluster_status
[{nodes,[{disc,[rabbit@rabbitmq01,rabbit@rabbitmq02,rabbit@rabbitmq03]}]},

其中disc表示为磁盘节点。

rabbitmq的节点类型分为磁盘内存两种类型,可以在加入集群时指定节点类型:

rabbitmqctl join_cluster rabbit@rabbitmq02 --ram

        --ram    指定为内存节点

不指定类型默认为磁盘节点。

转变已有的节点的类型:

[root@rabbitmq02 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl change_cluster_node_type ram   #改变节点类型为内存节点
Turning rabbit@rabbitmq02 into a ram node ...
[root@rabbitmq02 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq02 ...
[{nodes,[{disc,[rabbit@rabbitmq03,rabbit@rabbitmq01]},
         {ram,[rabbit@rabbitmq02]}]},
 {running_nodes,[rabbit@rabbitmq01,rabbit@rabbitmq03,rabbit@rabbitmq02]},
 {cluster_name,<<"rabbit@rabbitmq01">>},
 {partitions,[]},
 {alarms,[{rabbit@rabbitmq01,[]},
          {rabbit@rabbitmq03,[]},
          {rabbit@rabbitmq02,[]}]}]

        先停掉服务再改变类型,最后开启服务,rabbitmqctl change_cluster_node_type ram 其中ram表示内存节点,disc 表示磁盘节点。

日志位置:

/var/log/rabbitmq/

        rabbit@rabbitmq02.log            RabbitMQ应用服务日志

        rabbit@rabbitmq02-sasl.log     Erlang日志