美文网首页
十一、多台机器搭建RabbitMQ集群

十一、多台机器搭建RabbitMQ集群

作者: lancelea | 来源:发表于2019-12-11 16:16 被阅读0次

相对来说,在一台机器上启动三个 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
多台物理机RabbitMQ集群

使用相同的 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命令将清空节点的状态,并将其恢复到空白状态。当重设的节点是集群的一部分时,该命令也会和集群中的磁盘节点进行通信,告诉它们该节点正在离开集群。这很重要;不然,集群会认为该节点出了故障,并期望其最终能恢复回来。当离开的节点是磁盘节点时,正式离开集群就显得格外重要。对于每次元数据变更来说,磁盘节点是必需的;但是对于节点加入或是离开集群来说,所有磁盘节点都是必需的。所以如果是非正式移除磁盘节点的话,集群会认为该节点发生故障,并等待其恢复后才允许新节点的加入。因此,简单地把磁盘节点从集群中猛拉出来而非正式移除的话,会导致集群永久性无法进行变更。所以当从集群中移除节点时,请始终小心重设节点状态。

相关文章

网友评论

      本文标题:十一、多台机器搭建RabbitMQ集群

      本文链接:https://www.haomeiwen.com/subject/nxhfuctx.html