一、背景

上一章节中,我们学会了如何搭建一个单节点的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


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"}'



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

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

五、参考文档

1、RabbitMQ官方集群搭建

2、镜像队列的用法

Centos7部署RabbitMQ的镜像队列集群的更多相关文章

  1. RabbitMQ镜像队列集群搭建、与SpringBoot整合

    镜像模式 集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失,在实际工作中也是用的最多的,并且实现集群比较的简单. Mirror镜像队列,目的是为了保证 RabbitMQ 数据的高可靠 ...

  2. 详细说明-CentOS7部署FastDFS+nginx模块(包含集群方式)

    软件下载 # 已经事先把所需软件下载好并上传到/usr/local/src目录了 https://github.com/happyfish100/libfastcommon/archive/V1.0. ...

  3. RabbitMQ 3.9.7 镜像模式集群的搭建

    1. 概述 老话说的好:做人脚踏实地,一步一个脚印,便定能战胜一切困难,最终取得成功!!! 言归正传,之前我们聊了 RabbitMQ 单点服务的安装,今天我们来聊聊 RabbitMQ 3.9.7 镜像 ...

  4. (转)CentOs7.3 搭建 RabbitMQ 3.6 Cluster 集群服务与使用

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionScript.XMPP.STO ...

  5. RabbitMQ的高可用集群部署

    RabbitMQ的高可用集群部署 标签(空格分隔): 消息队列 部署 1. RabbitMQ部署的三种模式 1.1 单一模式 单机情况下不做集群, 仅仅运行一个RabbitMQ. # docker-c ...

  6. RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列

    系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...

  7. RabbitMQ 3.9.7 镜像模式集群与Springboot 2.5.5 整合

    1. 概述 老话说的好:做人要懂得变通,善于思考,有时稍微转个弯,也许问题就解决了. 言归正传,之前我们聊了 RabbitMQ 3.9.7 镜像模式集群的搭建,今天我们来聊聊 RabbitMQ 3.9 ...

  8. RabbitMQ 3.7.X集群:从入门到精通,这一篇就够了

    RabbitMQ是流行的开源消息队列系统,本身已经具备了较强的并发处理速度及运行稳定性,然而在大规模的实际应用中,往往还需要使用集群配置来保证系统中消息通信部分的高可用性,并发处理性能及异常恢复能力. ...

  9. 搭建 RabbitMQ Server 高可用集群

    阅读目录: 准备工作 搭建 RabbitMQ Server 单机版 RabbitMQ Server 高可用集群相关概念 搭建 RabbitMQ Server 高可用集群 搭建 HAProxy 负载均衡 ...

随机推荐

  1. 内核驱动编译之Makefile shell pwd路径问题

    一般我们在写Makefile的时候为了获取到当前Makefile所在的文件夹路径,会使用TopDIR ?= $(shell pwd)来定义,后续的文件路径都是基于此TopDIR基础上使用. 今天在移植 ...

  2. cf Two Sets (我用二分最大匹配做的)

    题意: n个数p1,p2....pn     两个数a,b 把它们分成A,B两个集合. 若x属于A,a-x一定属于A. 若x属于B,b-x一定属于B. 问是否可能将这n个数分成两个集合.若可以,输出每 ...

  3. 【mysql2】下载安装mysql5.7版|不再更新系列

    一.下载MySQL 5.7 版 MySQL 5.7 版:官网下载地址 https://dev.mysql.com/downloads/windows/installer/5.7.html 下载的是50 ...

  4. k8s入坑之路(5)kube-apiserver详解

    API Server kube-apiserver 是 Kubernetes 最重要的核心组件之一,主要提供以下的功能 提供集群管理的 REST API 接口,包括认证授权.数据校验以及集群状态变更等 ...

  5. Java的基本数据类型和数据类型转换

    首先java属于强类型语言,要求变量的使用要严格遵守规范,所有变量都必须先定义后才能使用. Java的数据类型分为以下两种: 1 基础数据类型(primtive type) 和 2 引用数据类型(re ...

  6. css 按钮悬停效霓虹灯特效

    css 按钮悬停效霓虹灯特效 <!DOCTYPE html> <html lang="en"> <head> <meta charset=

  7. Python 数据类型常用的内置方法(二)

    目录 Python 数据类型常用的内置方法(二) 1.字符串类型常用内置方法 1.upper.lower.isupper.islower 2.startswith.endswith 3.format ...

  8. [loj2506]tree

    2018年论文题,以下是论文前3章主要内容,与原题解相关部分为第4章中的启发式合并,也可快速跳至原题解 1.复杂度分析 Treap 定理1:$n$个节点的Treap的期望深度为$o(\log n)$ ...

  9. [loj3046]语言

    定义$S_{i}$表示第$i$条链所包含的点的集合,$(x,y)$合法当且仅当$x\ne y$且$\exists i,\{x,y\}\subseteq S_{i}$(答案即$\frac{合法点对数}{ ...

  10. 设计模式学习-使用go实现访问者模式

    访问者模式 定义 优点 缺点 适用范围 代码实现 什么是 Double Dispatch 参考 访问者模式 定义 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作.它使你可以在不 ...