一、背景

上一章节中,我们学会了如何搭建一个单节点的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. https的加密解密过程

    前置知识 SSL是90年代Netscape弄出来的一套东西,为的是解决HTTP协议明文传输数据的问题.后来SSL慢慢成了事实上的标准,于是IETF就把SSL标准化了,名字叫做TLS,TLS 1.0其实 ...

  2. 『学了就忘』Linux基础命令 — 19、目录操作的相关命令

    目录 1.ls命令 2.cd命令 (1)绝对路径和相对路径 (2)cd命令的简化用法 3.pwd命令 4.mkdir命令 5.rmdir命令 常用目录操作的相关命令: ls命令 cd命令 pwd命令 ...

  3. 如何选择普通索引和唯一索引《死磕MySQL系列 五》

    系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...

  4. k8s入坑之路(13)kubernetes重要资源(namespace隔离 resources资源管理 label)

    Namespace --- 集群的共享与隔离 语言中namespace概念 namespace核心作用隔离 以上是隔离的代码.namespace隔离的是: 1.资源对象的隔离:Service.Depl ...

  5. JDK源码阅读(5):HashTable类阅读笔记

    HashTable public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, ...

  6. Swift-Framework(一)访问资源文件

    摘要 Framework 就是在 APP 应用中的一种封装功能的表现形式,虽然不能独立运行,但是也可以在它里面存放和访问图片.语音等资源文件,可算是麻雀虽小,五脏俱全. 毕竟不是 APP 工程,所以 ...

  7. Merge into用法总结

    简单的说就是,判断表中有没有符合on()条件中的数据,有了就更新数据,没有就插入数据. 有一个表T,有两个字段a.b,我们想在表T中做Insert/Update,如果条件满足,则更新T中b的值,否则在 ...

  8. MyScript 开发文档

    一.IInk SDK runtime 1.1 引擎创建 1.2 对象释放 1.3 获取并设置配置 配置 访问配置 配置识别 二.文件存储 2.1 支持的内容的类型 2.2 模型结构 2.3 Conte ...

  9. m3u8 ts 视频流爬取思路,合成

    .... 先开调试,输入查找一下有没有 m3u8 文件 然后下下来用Notepad++ 打开一下 (以下的样子) 这里就是整个视频的视频流,  .ts 的都是文件,都下下来, ------------ ...

  10. [hdu6145]Arithmetic of Bomb II

    对于题中的"normal expression"(仅含加减乘和无前导0的非负整数,无括号)的计算,实际上并不需要通常的表达式求值,而可以用下述方式计算-- 维护三元组$(a,b,c ...