网站首页 > 技术文章 正文
一、背景
在Centos7服务器上RabbitMQ单机安装这一篇文章中,我们学会了如何搭建一个单节点的RabbitMQ服务器,但是单节点的RabbitMQ不可靠,如果单节点挂掉,则会导致消息队列不可用。此处我们搭建一个3个节点的RabbitMQ集群,用于解决这个问题。
二、介绍RabbitMQ的集群
1、集群类型
默认情况下的RabbitMQ集群只是元数据(metadata)是同步的,队列中的消息是不同步的,这样也是不安全的,需要配置成镜像队列,让数据也冗余到别的节点中,这样才能保证一个节点挂掉,还可以对外提供服务。
元数据:指的是队列信息、交换机信息、绑定信息等。
2、节点名的重要性
在集群中,节点名必须要唯一,集群中是通过节点名来进行联系的。
3、erlang cookie 的重要性
集群节点中是通过什么来认证的,从而让集群节点可以互相通讯,靠的就是 erlang cookie,因此集群中的erlang cookie的值必须要一致。
1、erlang cookie文件的位置
不同的操作系统这个文件的位置是不一样的。
这个位置一般是在 /var/lib/rabbitmq/.erlang.cookie这个位置。
2、erlang cookie文件的权限
.erlang.cookie的文件权限一般给600就可以了,不要给太高或太低,否则集群可能无法启动。
4、集群节点类型
RabbitMQ集群分为磁盘节点和内存节点。
1、磁盘节点所有的数据都是存在磁盘上
2、内存节点的数据是存在内存中,但不是所有的数据都是存在内存中的,比如:消息只会存在索引等。
3、在一个集群中至少需要一个磁盘(disc)节点
5、集群中加入节点
新加入的集群的节点必须是一个全新的节点,不可以带有数据,如果存在则需要在加入集群的节点上执行rabbitmqctl reset。
三、搭建一个RabbitMQ集群
此处以3个Centos7服务器来搭建一个RabbitMQ集群。
主机名 | ip地址 | 节点类型 | 用户名 | 密码 | management port | amqp port |
centos01 | 192.168.56.101 | 磁盘节点(disc) | admin | admin | 15672 | 5672 |
centos02 | 192.168.56.102 | 磁盘节点(disc) | admin | admin | 15672 | 5672 |
centos03 | 192.168.56.103 | 内存节点(ram) | admin | admin | 15672 | 5672 |
1、配置3个服务器都可以访问各自的主机名
在3台服务器上都需要这样操作 vim /etc/hosts
192.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
firewall-cmd reload
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"}'
创建完镜像队列后发现,队列在所有的节点上都存在。
镜像队列的高级用法,参考官方文档 https://www.rabbitmq.com/ha.html
五、参考文档
1、RabbitMQ官方集群搭建 https://www.rabbitmq.com/clustering.html
2、镜像队列的用法 https://www.rabbitmq.com/ha.html
- 上一篇: docker分布式部署rabbitmq高可用集群
- 下一篇: k8s上创建高可用RabbitMQ集群
猜你喜欢
- 2024-09-24 RabbitMQ宕机后,消息100%不会丢失吗
- 2024-09-24 非常强悍的 RabbitMQ 总结,写得真好
- 2024-09-24 「服务器」RabbitMQ入门教程——简介及工作原理
- 2024-09-24 在 WebApi 项目中快速开始使用 RabbitMQ
- 2024-09-24 RabbitMQ使用延迟插件,代码量直接降一半?
- 2024-09-24 RabbitMQ 高可用之镜像队列
- 2024-09-24 k8s上创建高可用RabbitMQ集群
- 2024-09-24 docker分布式部署rabbitmq高可用集群
- 2024-09-24 详解如何用zabbix来监控rabbitmq消息队列服务
- 2024-09-24 rabbitMQ几种工作模式及策略分享
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)