RabbitMQ集群搭建与高可用实现(未完待续)

news2024/11/24 17:58:02

文章目录

  • 一、RabbitMQ集群概述
    • 1、为什么要使用RabbitMQ集群
    • 2、RabbitMQ如何支持集群
    • 3、RabbitMQ的节点类型
  • 二、普通集群
    • 1、什么是普通集群
    • 2、Docker搭建普通集群模式
      • (1)安装docker
      • (2)安装RabbitMQ
      • (3)检验集群
      • (4)设置用户
      • (5)删除集群节点(node2 和 node3 机器分别执行,这里不需要操作)
      • (6)访问控制台
  • 三、镜像队列
  • 四、Haproxy+Keepalive 实现高可用集群
  • 五、Federation的使用
  • 六、Shovel的使用
  • 参考资料

一、RabbitMQ集群概述

1、为什么要使用RabbitMQ集群

集群主要用于实现高可用与负载均衡。

高可用:如果集群中的某些MQ服务器不可用,客户端还可以连接到其他MQ服务器,不至于影响业务。

负载均衡:在高并发的场景下,单台MQ服务器能处理的消息有限,可以分发给多台MQ服务器,减少消息延迟。

2、RabbitMQ如何支持集群

应用做集群,需要面对数据同步和通信的问题。因为Erlang天生具备分布式的特性,所以RabbitMQ天然支持集群,不需要通过引入ZK来实现数据同步。

RabbitMQ通过.erlang.cookie(默认路径:/var/lib/rabbitmq/)来验证身份,需要在所有节点上保持一致。

服务的端口是5672,UI的端口是15672,集群的端口是25672。
集群通过25672端口两两通信,需要开放防火墙的端口。
需要注意的事,RabbitMQ集群无法搭建在广域网上,除非使用federation或者shovel等插件(没有必要这么做)。

3、RabbitMQ的节点类型

RabbitMQ的集群有两种节点类型,一种是磁盘节点(Disc Node),一种是内存节点(RAM Mode)。

磁盘节点:将元数据(包括队列名字属性、交换机的类型名字属性、绑定、vhost)放在磁盘中。未指定类型的情况下,默认为磁盘节点。
在这里插入图片描述
集群中至少需要一个磁盘节点用来持久化元数据,否则全部内存节点崩溃时,就无从同步元数据。

内存节点:将元数据存储在内存中。内存节点会将磁盘节点的地址存放在磁盘(不然重启后就没办法同步数据了)。如果是持久化的消息,会同时存放在内存和磁盘。

我们一般把应用连接到内存节点(读写快),磁盘节点用来备份。

二、普通集群

1、什么是普通集群

普通集群模式下,不同的节点之间只会相互同步元数据(交换机、队列、绑定关系、vhost的定义),而不会同步消息。
在这里插入图片描述
比如,队列1的消息只存储在节点1上。节点2和节点3同步了队列1的定义,但是没有同步消息。

假如生产者连接的是节点3,要将消息通过交换机A路由到队列1,最终消息还是会转发到节点1上存储,因为队列1的内容只在节点1上。
同理,如果消费者连接的是节点2,要从队列1上拉取消息,消息会从节点1转发到节点2,其他节点起到一个路由的作用,类似于指针。

普通集群模式就会有一个问题,如果节点1挂了,队列1的所有数据全部就丢失了。为什么不直接把消息在所有节点上复制一份?主要是出于存储和同步数据的网络开销的考虑,如果所有节点都存储相同的数据,就无法达到线性地增加性能和存储容量的目的(堆机器)。

这也是一个分片存储的思想。当然,如果需要保证队列的高可用,就不能用普通集群模式了,因为节点失效将导致相关队列不可用,这就需要镜像队列模式了。

2、Docker搭建普通集群模式

(1)安装docker

centos7安装与卸载docker-简单而详细无坑

(2)安装RabbitMQ

# 1)拉取RabbitMQ镜像(带managment)
docker pull rabbitmq:3.7.17-management

# 2)创建docker网络(让容器可以和主机通信)
docker network create rabbitmqnet

# 3)创建三个容器,端口分别是 5673 5674 5675 ,管理端口是 15673 15674 15675
docker run -d \
 --name=rabbitmq1 \
 -p 5673:5672 \
 -p 15673:15672 \
 -e RABBITMQ_NODENAME=rabbitmq1 \
 -e RABBITMQ_ERLANG_COOKIE='GUPAOEDUFORBETTERYOU' \
 -h rabbitmq1 \
 --net=rabbitmqnet \
 rabbitmq:3.7.17-management

docker run -d \
 --name=rabbitmq2 \
 -p 5674:5672 \
 -p 15674:15672 \
 -e RABBITMQ_NODENAME=rabbitmq1 \
 -e RABBITMQ_ERLANG_COOKIE='GUPAOEDUFORBETTERYOU' \
 -h rabbitmq2 \
 --net=rabbitmqnet \
 rabbitmq:3.7.17-management

docker run -d \
 --name=rabbitmq3 \
 -p 5675:5672 \
 -p 15675:15672 \
 -e RABBITMQ_NODENAME=rabbitmq1 \
 -e RABBITMQ_ERLANG_COOKIE='GUPAOEDUFORBETTERYOU' \
 -h rabbitmq3 \
 --net=rabbitmqnet \
 rabbitmq:3.7.17-management

# 4)后两个节点作为内存节点加入集群
docker exec -it rabbitmq2 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbitmq1@rabbitmq1
rabbitmqctl start_app

docker exec -it rabbitmq3 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbitmq1@rabbitmq1
rabbitmqctl start_app

(3)检验集群

# 集群状态
root@rabbitmq3:/# rabbitmqctl cluster_status
Cluster status of node rabbitmq1@rabbitmq3 ...
[{nodes,[{disc,[rabbitmq1@rabbitmq1]},
         {ram,[rabbitmq1@rabbitmq3,rabbitmq1@rabbitmq2]}]},
 {running_nodes,[rabbitmq1@rabbitmq2,rabbitmq1@rabbitmq1,rabbitmq1@rabbitmq3]},
 {cluster_name,<<"rabbitmq1@rabbitmq3">>},
 {partitions,[]},
 {alarms,[{rabbitmq1@rabbitmq2,[]},
          {rabbitmq1@rabbitmq1,[]},
          {rabbitmq1@rabbitmq3,[]}]}]

(4)设置用户

# 创建账号
rabbitmqctl add_user admin admin
# 设置用户角色
rabbitmqctl set_user_tags admin administrator
# 设置用户权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

(5)删除集群节点(node2 和 node3 机器分别执行,这里不需要操作)

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
rabbitmqctl forget_cluster_node rabbit@rabbitmq2 #(node1 机器上执行)

(6)访问控制台

http://192.168.8.146:15673/
admin/admin
在这里插入图片描述
我们在1节点新建交换机和队列,发现2节点和3节点会将交换机和队列同步过去。

往1节点发送一条消息,消费任意节点也能消费掉。

三、镜像队列

镜像队列模式下,消息内容会在镜像节点间同步,可用性更高。不过也有一定的副作用,系统性能会降低,节点过多的情况下同步的代价比较大。

集群模式可以通过UI或CLI或者HTTP操作。

命令方式:

rabbitmqctl set_policy ha-all "^ha." "{""ha-mode"":""all""}"

HTTP方式:

PUT /api/policies/%2f/ha-all {"pattern":"^ha.","definition":{"ha-mode":"all"}}

UI方式:
在这里插入图片描述
在这里插入图片描述

四、Haproxy+Keepalive 实现高可用集群

未完待续

五、Federation的使用

未完待续

六、Shovel的使用

未完待续

参考资料

https://gper.club/articles/7e7e7f7ff3g5bgc5g6c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程任务异步回调

1、需要掌握概念 //同步&#xff0c;异步&#xff0c;异步回调 //MQ消息中间件 例子&#xff1a;工作邮件、微信、QQ 原理&#xff1a; 同步、异步、异步回调 2、代码 public static void main(String[] args) throws Exception {//同步&#xff0c;异步&#xff0c;异步…

X2000 Linux 测试VL53L4CD

在X2000 Linux 调试VL53L4CD驱动章节中已从官方下载了驱动文件&#xff0c;文件如下&#xff1a; 一、 拷贝测试代码 将user拷贝到sdk\demo下&#xff0c;如下所示&#xff1a; 2、修改Makefile 修改\user\test\Makefile指令CC为mips-linux-gnu-gcc CC : mips-linux-gnu-gcc…

北约峰会遭遇RomCom黑客组织攻击

昨天&#xff08;7月11日&#xff09;&#xff0c;微软正式披露了一个未修补的零日安全漏洞&#xff0c;该漏洞存在于多个Windows和Office产品中&#xff0c;可以通过恶意Office文档远程执行代码。 未经身份验证的攻击者可在无用户交互的情况下利用该漏洞(跟踪为CVE-2023-3688…

IMU背包对动物行为影响测试

动物行为是一种可观察和可测量的指标&#xff0c;轻量化和低成本的传感器技术的先进发展为研究人员提供了以最小干预来跨越空间和时间跟踪动物的机会。特别是对于家禽业来说&#xff0c;已经从传统的笼养系统转变为无笼养系统。许多技术可用于检测大群鸡的行为、活动和位置。为…

哈希的应用->布隆过滤器

为什么用布隆过滤器 这个是基于位图的一个超级牛皮的一个数据结构。举个例子&#xff0c;假设我们创建Steam账号&#xff0c;我们的账户名字是不允许重复的&#xff0c;所以我们需要找到一个没有人使用过的名字&#xff0c;但是我们得知道现在这个名字是否有人用过&#xff0c…

VMware ESXi 7.0 U3n macOS Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 7.0 U3n macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品&#x…

利用Docker部署程序

目录 一、安装Docker程序 二、安装MySQL 三、安装MongoDB 四、安装Redis 五、安装RabbitMQ 六、部署人脸识别程序 一、部署工作流项目 二、打包Java项目 三、部署Java项目 一、安装Docker程序 这节课我们要利用Docker环境部署很多东西&#xff0c;有数据库、人脸识别程…

冯诺依曼结构和操作系统的理解

在正式讲解进程之前&#xff0c;需要先铺垫一些基本知识. 目录 冯诺依曼结构 操作系统 冯诺依曼结构 这个名词相信大家非常熟悉&#xff0c;我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 这张图…

Tomcat工作原理

一、Tomcat架构 ### 说明&#xff1a; Server&#xff1a;表示整个 Tomcat Catalina servlet 容器&#xff0c;Server 中可以有多个 Service。&#xff08;可以通过telenet 8005后连接后输入“SHUTDOWN” 注意这里是大写&#xff0c;来关闭服务&#xff09;Service&#xff1…

宠物用品小程序怎么做

宠物用品小程序功能介绍&#xff1a; 1. 商品管理&#xff1a; 宠物用品小程序提供了商品管理功能&#xff0c;商家可以方便地添加、编辑和删除商品信息。用户可以浏览并选择合适的宠物用品&#xff0c;如食品、玩具、服饰等。 2. 订单管理&#xff1a; 用户可以在宠物用品…

区块链服务网络BSN季度版本迭代说明【2023年Q2】

根据区块链服务网络发展联盟计划安排&#xff0c;BSN将每周进行一个小的版本迭代&#xff0c;每季度进行一个大的版本迭代&#xff0c;目前区块链服务网络&#xff08;BSN&#xff09;已完成最新季度版本迭代。 我们将按照BSN官方专网&#xff08;国内版和国际版&#xff09;、…

手把手教你从零开始集成声网音视频功能(iOS版)

说明 1.环信音视频和声网音视频 是两个不同的系统&#xff0c;所以如果要切换的话&#xff0c;需要集成声网的sdk&#xff0c;环信音视频的sdk可以直接废弃 2.文章会介绍如何用声网的音视频跑通demo&#xff0c;可以了解整个音视频通话的流程&#xff0c; 3.文章会介绍已经集…

小心 MybatisPlus 的一个坑

小心 MybatisPlus 的一个坑 昨天测试说有个 xx 功能用不了&#xff0c;扔给我一个截图&#xff0c;说有报错&#xff1a; 报错信息就是&#xff1a;Transaction rolled back because it has been marked as rollback-only&#xff0c;很好理解&#xff1a;事务被回滚了&#x…

【Qt QML入门】Text

Text组件在场景中添加格式化文本, 提供的是只读文本。文本项可以显示纯文本和富文本。Text {id: txttext: "Hello World!"font.family: "Helvetica"font.pointSize: 24color: "red" } 也可以支持部分Html格式标签 Text {id: txt1font.pointSize…

python_day6_异常与包机制

异常 try:可能出现异常的代码 except:若出现异常执行的代码 try:f open("D:/linux.txt", "r", encoding"utf-8")f.readlines() except:print("出现异常了&#xff0c;文件不存在&#xff0c;更换模式w")# f open("D:/linux.txt…

欧姆龙以太网口怎么和电脑连接

捷米特JM-ETH-CP以太网通讯处理器用于欧姆龙 CP1L/ CP1E/ CP1H 系列 PLC 的以太网数据采集&#xff0c;捷米特JM-ETH-CP以太网模块不占用 PLC 通讯口&#xff0c;即编程软件/上位机软件通过以太网对 PLC 数据监控的同时&#xff0c;触摸屏可以通过复用接口与 PLC 进行通讯。支持…

【国密】SM3密码杂凑算法(附源码分析)

一、前言 SM3 算法是中国国家密码管理局于 2010 年发布的一种密码杂凑算法&#xff0c;广泛地应用于数据的完整性校验、数字签名、消息认证码、密钥交换和数据加密等。密码杂凑算法需要满足三种基本属性&#xff1a;抗原像攻击、抗第二原像攻击、抗碰撞攻击&#xff0c;这三种…

【动手学习深度学习--逐行代码解析合集】14多输入多输出通道

【动手学习深度学习】逐行代码解析合集 14多输入多输出通道 视频链接&#xff1a;动手学习深度学习–多输入多输出通道 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、多输入通道 import torch from d2l import torch as d2l …

[C语言][小游戏][猜拳游戏]

C语言的奇妙旅行 一、模块化编程二、游戏基本设计2.1 确定计算机要出的手势2.2 显示“石头剪刀布”&#xff0c;然后玩家输入自己要出的手势2.3进行输赢判断&#xff0c;显示结果2.4询问是否继续2.5 基本程序 三、游戏实现的过程3.1将玩家的手势和电脑的手势显示出来 三、总代码…

复习java基础

复习一天有点忘了的知识&#xff1a; 结构化编程 结构化程式设计(英语:Structured programming)是1960年代开始发展起来的一种编程典范。它采用子程序、程式码区块、for循环以及while循环等结构来取代传统的goto。 指导思想 自顶向下、逐步求精、模块化 编程过程 流程图是…