阅读 174

Centos7部署RabbitMQ的镜像队列集群(rabbitmq镜像集群原理)

一、背景

在上一章节中,我们学会了如何搭建一个单节点的RabbitMQ服务器,但是单节点的RabbitMQ不可靠,如果单节点挂掉,则会导致消息队列不可用。此处我们搭建一个3个节点的RabbitMQ集群,用于解决这个问题。

二、介绍RabbitMQ的集群

1、集群类型

默认情况下的RabbitMQ集群只是元数据(metadata)是同步的,队列中的消息是不同步的,这样也是不安全的,需要配置成镜像队列,让数据也冗余到别的节点中,这样才能保证一个节点挂掉,还可以对外提供服务。

元数据:指的是队列信息、交换机信息、绑定信息等。

2、节点名的重要性

在集群中,节点名必须要唯一,集群中是通过节点名来进行联系的。 节点名的解释

3、erlang cookie 的重要性

集群节点中是通过什么来认证的,从而让集群节点可以互相通讯,靠的就是 erlang cookie,因此集群中的erlang cookie的值必须要一致。

1、erlang cookie文件的位置

不同的操作系统这个文件的位置是不一样的。 erlang cookie文件的位置 这个位置一般是在 /var/lib/rabbitmq/.erlang.cookie这个位置。

2、erlang cookie文件的权限

.erlang.cookie的文件权限一般给600就可以了,不要给太高或太低,否则集群可能无法启动。 erlang cookie文件的权限

4、集群节点类型

RabbitMQ集群分为磁盘节点内存节点。 1、磁盘节点所有的数据都是存在磁盘上 2、内存节点的数据是存在内存中,但不是所有的数据都是存在内存中的,比如:消息只会存在索引等。 3、在一个集群中至少需要一个磁盘(disc)节点

5、集群中加入节点

新加入的集群的节点必须是一个全新的节点,不可以带有数据,如果存在则需要在加入集群的节点上执行rabbitmqctl reset

三、搭建一个RabbitMQ集群

此处以3个Centos7服务器来搭建一个RabbitMQ集群。

主机名ip地址节点类型用户名密码management portamqp port
centos01192.168.56.101磁盘节点(disc)adminadmin156725672
centos02192.168.56.102磁盘节点(disc)adminadmin156725672
centos03192.168.56.103内存节点(ram)adminadmin156725672







## 1、配置3个服务器都可以访问各自的主机名





在3台服务器上都需要这样操作





vim /etc/hosts





 bash192.168.56.101 centos01 192.168.56.102 centos02 192.168.56.103 centos03 复制代码

2、同步各个节点的erlang cookie

如果cookie文件不存在,则可以启动一个RabbitMQ节点,然后在复制过去,在复制的过程中,需要保证 RabbitMQ节点最好都不要启动。

在centos01服务器上操作

scp /var/lib/rabbitmq/.erlang.cookie root@192.168.56.102:/var/lib/rabbitmq/.erlang.cookie scp /var/lib/rabbitmq/.erlang.cookie root@192.168.56.103:/var/lib/rabbitmq/.erlang.cookie 复制代码

3、创建集群

1、centos01服务器上操作

rabbitmq-server -detached 复制代码

可以查看/var/log/rabbitmq/rabbit\@centos01.log这个日志文件看是否启动成功。

2、放行集群通讯端口等

firewall-cmd --zone=public --add-port=5672/tcp --permanent firewall-cmd --zone=public --add-port=15672/tcp --permanent firewall-cmd --zone=public --add-port=4369/tcp --permanent firewall-cmd --zone=public --add-port=25672/tcp --permanent 复制代码

3、centos02加入centos01

rabbitmq-server -detached rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@centos01 rabbitmqctl start_app 复制代码

4、centos03加入centos02

rabbitmq-server -detached rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@centos02 --ram rabbitmqctl start_app 复制代码

5、查看集群是否构建完成

查看集群状态

6、将centos03集群移除

1、将需要被移除的节点停止

rabbitmqctl stop 复制代码

2、在另外启动的节点上执行

rabbitmqctl forget_cluster_node rabbit@centos03 复制代码

3、重新加入集群中

在启动的时候可能报如下错误"Node rabbit@centos03 thinks it's clustered with node rabbit@centos02, but rabbit@centos02 disagrees" 再次加入启动时报错 这个时候我们需要删除rm -rvf /var/lib/rabbitmq/mnesia/这个目录,然后在次执行加入集群的命令即可。

rabbitmq-server -detached rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@centos02 --ram rabbitmqctl start_app 复制代码

四、配置镜像集群

1、普通集群

经过上方步骤构成的集群是一个普通的集群,只是队列中的元数据共享,而队列中的数据是具体保存到某个节点上的。 可以看到队列是在具体的某个节点上 这样够不成高可用,如果这个节点挂掉的话,则这个队列的数据还是不可以消费的,也无法往这个队列中发送数据。那么如果解决这个问题呢,答案是使用镜像队列集群。

2、镜像队列集群

在默认的虚拟主机(/)所有的队列都配置成镜像队列。(ha-all只是取的名字)

rabbitmqctl set_policy --vhost / ha-all "^" '{"ha-mode":"all"}' 复制代码

创建完镜像队列后的结果 创建完镜像队列后发现,队列在所有的节点上都存在。

镜像队列的高级用法,参考官方文档 www.rabbitmq.com/ha.html

五、参考文档

1、RabbitMQ官方集群搭建 2、镜像队列的用法


作者:huan1993
链接:https://juejin.cn/post/7039202722985443342


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐