Rabbitmq集群搭建

1、什么是Rabbitmq集群?

Rabbitmq集群的目的就是为了实现Rabbitmq的高可用,可分为两种,普通集群和镜像集群。

普通集群:主备架构,备用节点拥有跟主节点相同的元数据,但是并不会同步相应的消息数据(一个节点上能看到所有队列,当不一定有全部的队列消息)。当消息进入主节点的Queue后,consumer从备节点消费时,RabbitMQ会临时在主备节点间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。这种方式实现的只是Rabbitmq服务的高可用,并不是队列的高可用,可靠性低。

镜像集群:即在普通集群的基础上,针对所有队列或者特定队列开启了镜像的集群。其实本质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。

2、部署环境

事先准备三台机器,并配置相应的hosts解析文件,如下所示:

vim /etc/hosts
192.168.0.108 node1
192.168.0.105 node2
192.168.0.107 node3

(可选)修改rabbitmq集群的存储配置

vim /etc/rabbitmq/rabbitmq-env.conf
NODENAME=rabbit@rabbitmq-01
RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia
RABBITMQ_LOG_BASE=/data/rabbitmq/logs/rabbitmq

3、安装并启动rabbitmq

分别在三台服务器上安装并启动rabbitmq-server

yum install -y epel-release
yum install -y erlang
yum install -y rabbitmq-server
systemctl start rabbitmq-server
systemctl status rabbitmq-server

4、配置并启动集群

将node1的erlang.cookie文件同步复制到其他两台节点(该文件是rabbitmq服务启动时自动生成),因为节点之间需要通过此文件来判断是否允许交流(判断是否属于集群内部节点),如果三台机器的此文件内容不一致则集群无法启动成功。

scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/

同步完后,分别在node2和node3上执行下述命令,加入集群

#先停止服务(注:这里的参数stop_app和stop是不一样的,stop是停掉服务,stop_app是停掉这个节点,但是并没有停止rabbitmq依赖的erlang进程)
rabbitmqctl stop_app
#重置rabbitmq状态(注意这里会将该节点下的所有数据全部清除,包括队列、交换器、虚拟主机和用户等)
rabbitmqctl reset
#加入集群
rabbitmqctl join_cluster rabbit@node1
#启动服务
rabbitmqctl start_app
#查询集群状态
rabbitmqctl cluster_status

5、管理集群

重启节点

systemctl restart rabbitmq-server

重置节点

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node3
rabbitmqctl start_app

拆分/删除集群节点,在对应节点上执行

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

创建内存节点

rabbitmqctl join_cluster --ram rabbit@node3

改变节点类型

rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
# disc是磁盘节点,ram是内存节点
rabbitmqctl start_app

6、其他常用操作

#修改集群名称
rabbitmqctl set_cluster_name rabbitmq_test_cluster
#配置镜像队列同步
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
#配置镜像队列的副本数
rabbitmqctl set_policy ha-two "^" ‘{"ha-mode":"exactly","ha-params":"2","ha-sync-mode":"automatic"}’
#指定ha开头的队列开启镜像复制
rabbitmqctl set_policy ha-all "^ha." ‘{"ha-mode":"all"}’

7、备份Rabbitmq数据

RabbitMQ定义和消息存储在位于节点数据目录中的内部数据库中,要获取目录路径,请针对正在运行的RabbitMQ节点运行以下命令:
rabbitmqctl eval 'rabbit_mnesia:dir().'
输出示例:

/var/lib/rabbitmq/mnesia/rabbit@rabbitmq-server01

在从3.7.0开始的RabbitMQ版本中,所有消息数据都组合在msg_stores/vhosts目录中,并存储在每个vhost的子目录中,每个vhost目录都使用散列命名,并包含带有vhost名称的.vhost文件,因此可以单独备份特定的vhost消息集。
要做RabbitMQ定义和消息数据备份,复制或归档此目录及其内容,但先需要停止RabbitMQ服务:

sudo systemctl stop rabbitmq-server.service

以下示例将创建一个存档:

tar cvf rabbitmq-backup.tgz /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-server01

恢复RabbitMQ数据
要从备份中还原,请将文件从备份提取到数据目录。
内部节点数据库在某些记录中存储节点的名称,如果节点名称发生更改,则必须首先使用以下rabbitmqctl命令更新数据库以便更改:

rabbitmqctl rename_cluster_node <oldnode> <newnode>

当新节点以备份目录和匹配的节点名称启动时,它会根据需要执行升级步骤并继续引导。

参考:
https://blog.csdn.net/yangshihuz/article/details/114120589
https://www.cnblogs.com/knowledgesea/p/6535766.html
https://ywnz.com/linuxyffq/4005.html





posted @ 2022-05-22 12:24  酒粒  阅读(1445)  评论(0编辑  收藏  举报