相对来说,在一台机器上启动三个 Erlang 节点模拟搭建 RabbitMQ 还是很简单的,对初步学习搭建 RabbitMQ 集群环境很有帮助。但是在实际生产情况下肯定会在多台物理机上搭建 RabbitMQ 集群。
将 RabbitMQ 集群运行在多台物理机器上并不比在单机上构建集群难多少。首先需要知道的是 RabbitMQ 集群对延迟非常敏感,应当只在本地局域网内使用。使用集群来提供地理可用性或者通过WAN来路由消息,都会导致超时和怪异的集群行为,因此这是不明智的。记住这些,我们将在本地局域网创建分布式集群。
准备三台物理机
我在虚拟机上模拟了三台物理主机,并按照第七章节安装配置好 RabbitMQ,它们的 IP 地址如下:
- rabbitmq_one@192.168.247.130
- rabbitmq_two@192.168.247.131
- rabbitmq_three@192.168.247.132
使用相同的 Erlang cookie
就像前面说的,Erlang节点间通过认证 Erlang cookie 的方式来允许互相通信,所以,第一步需要把其中一台机器的 Erlang cookie 拷贝到另外两台。
# 把rabbitmq_one 的 .erlang.cookie 拷贝到 rabbitmq_two
$ scp /home/rabbitmq_one/.erlang.cookie rabbitmq_two@192.168.247.131:/home/rabbitmq_two/
# 把rabbitmq_one 的 .erlang.cookie 拷贝到 rabbitmq_three
$ scp /home/rabbitmq_one/.erlang.cookie rabbitmq_two@192.168.247.131:/home/rabbitmq_two/
修改主机名
RabbitMQ 集群各主机之间通过主机名进行通信,默认主机名为:localhost.localdomain,为了容易区分三台主机,分别给三台主机进行主机重命名,主机名命名命令:
$ hostnamectl set-hostname <newhostname>
然后修改三台主机/etc/hosts
文件,在文件末尾新起一行,加入以下配置:
# 主机ip+空格+主机名
192.168.247.130 rabbitmq_one
192.168.247.131 rabbitmq_two
192.168.247.132 rabbitmq_three
关闭防火墙
然后重启三台主机,重启后为了保证三台主机之间的端口能够互相访问,先关闭防火墙,命令如下:
$ systemctl stop firewalld
配置集群
在启动 rabbit@rabbitmq_one 节点之后,将 RabbitMQ 的 rabbit@rabbitmq_two 节点加入到集群中,分别运行以下命令:
# 启动节点
$ rabbitmq-server start -detached
# 停止节点中的 RabbitMQ 应用程序
$ rabbitmqctl stop_app
# 清空节点状态
$ rabbitmqctl reset
# 将 rabbit@rabbitmq_two 加入 rabbit@rabbitmq_one 集群
$ rabbitmqctl join_cluster rabbit@rabbitmq_one
# 启动节点中的 RabbitMQ 应用程序
$ rabbitmqctl start_app
# 查看集群状态
$ rabbitmqctl cluster_status
命令执行过程如下图:
rabbit@rabbitmq_two加入集群
可以看到,集群中有两个节点,且都是磁盘节点。照这样的方法可以将 rabbit@rabbitmq_three 节点加入到集群中。
从集群中移除节点
# 停止节点中的 RabbitMQ 应用程序
$ rabbitmqctl stop_app
# 清空节点状态
$ rabbitmqctl reset
# 启动节点中的 RabbitMQ 应用程序
$ rabbitmqctl start_app
这里关键的命令是rabbitmqctl reset
。我们之前说过reset命令将清空节点的状态,并将其恢复到空白状态。当重设的节点是集群的一部分时,该命令也会和集群中的磁盘节点进行通信,告诉它们该节点正在离开集群。这很重要;不然,集群会认为该节点出了故障,并期望其最终能恢复回来。当离开的节点是磁盘节点时,正式离开集群就显得格外重要。对于每次元数据变更来说,磁盘节点是必需的;但是对于节点加入或是离开集群来说,所有磁盘节点都是必需的。所以如果是非正式移除磁盘节点的话,集群会认为该节点发生故障,并等待其恢复后才允许新节点的加入。因此,简单地把磁盘节点从集群中猛拉出来而非正式移除的话,会导致集群永久性无法进行变更。所以当从集群中移除节点时,请始终小心重设节点状态。
网友评论