【部署篇】RabbitMq-03集群模式部署

一、准备主机 

准备3台主机用于rabbitmq部署,文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署,只需下载对应的版本进行相同的操作。

主机IP角色说明
192.168.128.31种子节点
192.168.128.32普通节点
192.168.128.33普通节点

二、部署rabbitmq

在每台主机上都进行相同的操作部署erlang和rabbitmq,版本对应信息及单机部署详情可以参观前一篇文章【部署篇】RabbitMq-02单机模式部署,无法下载部署包时可通过文章附件进行下载。

2.1安装Erlang

直接到rabbitmq仓库中下载,安装包下载地址:Releases · rabbitmq/erlang-rpm · GitHub,这里要注意下载的版本名称与操作系统版本的对应关系,如el7,el8,el9分别对应的是centos7、centos8、centos9版本。

备注:文章关联了安装部署使用的资源包,可以直接下载

# 下载erlang
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.18/erlang-23.3.4.18-1.el7.x86_64.rpm# 安装erlang
yum install erlang-23.3.4.18-1.el7.x86_64.rpm -y# 查看erlang
erl -v

2.2安装 RabbitMQ 

1.进入rabbitmq仓库中下载,安装包下载地址:Releases · rabbitmq/rabbitmq-server · GitHub

2.选择名称中包含 noarch的rpm包,表示该软件包是“无架构”(no architecture)特定的。这意味着该软件包不依赖于特定的硬件架构或操作系统架构,可以在任何架构上运行。

3.由于rabbitmq后期版本已经不在支持centos7,这里我选择3.8.30进行下载安装。

4.rabbitmq默认端口号:5672

备注:文章关联了安装部署使用的资源包,可以直接下载

# 下载安装包
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.30/rabbitmq-server-3.8.30-1.el7.noarch.rpm# rabbitmq的安装依赖socat
yum install socat -y# 安装Rabbitmq
yum install rabbitmq-server-3.8.30-1.el7.noarch.rpm -y

2.3检测服务

# 启动服务
systemctl start rabbitmq-server# 查看状态
systemctl status rabbitmq-server

 2.4关闭防火樯

#关闭防火樯
systemctl stop firewalld

三、集群准备

  • 同步其中一台的erlan.cookie到其他服务器
# 复制31至32
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.128.32:/var/lib/rabbitmq/.erlang.cookie# 复制31至33
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.128.33:/var/lib/rabbitmq/.erlang.cookie

备注:这步必须确保文件复制并被替换否则会影响加入集群。 

  • 修改主机名分别为node1,node2,node3
# 在31上执行
echo 'node1' > /etc/hostname
# 使用 hostname 命令使更改立即生效
sudo hostname -F /etc/hostname# 在32上执行
echo 'node2' > /etc/hostname
# 使用 hostname 命令使更改立即生效
sudo hostname -F /etc/hostname# 在33上执行
echo 'node3' > /etc/hostname
# 使用 hostname 命令使更改立即生效
sudo hostname -F /etc/hostname
  • 配置host文件,并确保通过名称相互能ping通,这里的node1,2,3名称是可以自定义的。
# 编辑hosts文件
vi /etc/hosts# 输入对应内容
192.168.128.31 node1
192.168.128.32 node2
192.168.128.33 node3

修改/etc/rabbitmq/rabbitmq-env.conf指定节点名称

# 设置31节点名称
echo 'RABBITMQ_NODENAME=rabbit@node1'>/etc/rabbitmq/rabbitmq-env.conf# 设置31节点名称
echo 'RABBITMQ_NODENAME=rabbit@node2'>/etc/rabbitmq/rabbitmq-env.conf# 设置31节点名称
echo 'RABBITMQ_NODENAME=rabbit@node3'>/etc/rabbitmq/rabbitmq-env.conf

四、加入集群

  • 选择第一个节点作为种子节点
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
  • 在其他节点上,使用rabbitmqctl命令加入集群 
# 加入集群
rabbitmqctl stop_app
rabbitmqctl reset
#rabbitmqctl join_cluster {cluster_node}@{node_name}
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app# 如果.erlang.cookie无权限,可以设置
sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie

其中 {cluster_name}@{node_name} 是种子节点的名称及/etc/rabbitmq/rabbitmq-env.conf中配置的名称相对应

  • 启用集群高可用,在任意节点执行
rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
  • 设置管理员帐号

备注:由于前边调用了reset导致配置清空,需要重新设置管理员

# 配置管理员及权限
rabbitmqctl add_user  admin 123456
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmqctl set_user_tags admin administrator
  • 访问管理页面

        登录管理页面地址:http://192.168.128.31:15672输入帐号:admin,密码:123456登录。

五、运维命令

1.查看节点状态
rabbitmqctl cluster_status2.停止服务
rabbitmqctl stop_app3.重置配置和数据
rabbitmqctl reset4.加入集群
rabbitmqctl join_cluster [cluser_node]@[node_name] 5.启动服务
rabbitmqctl start_app

六、自动处理网络分区【可选】

RabbitMQ 提供了三种方法自动地处理网络分区pause-minority 模式、pause-if-all-down 模式和autoheal 模式。默认是 ignore 模式,即不自动处理网络分区,所以在这种模式下,当网络分区的时候需要人工介入。在 rabbitmq.config 配置文件中配置cluster_partition_handling 参数即可实现相应的功能。默认的 ignore 模式的配置如下,注意最后有个点号:

[{rabbit, [{cluster_partition_handling, ignore}]}
]

pause-minority 模式

在pause-minority 模式下,当发生网络分区时,集群中的节点在观察到某些节点"down"的时候,会自动检测其自身是否处于"少数派"(分区中的节点小于或者等于集群中一半的节点数),RabbitMQ 会自动关闭这些节点的运作。根据 CAP 原理,这里保障了P,即分区耐受性。这样确保了在发生网络分区的情况下,大多数节点(当然这些节点得在同一个分区中)可以继续运行。"少数派"中的节点在分区开始时会关闭,当分区结束时又会启动。这里关闭是指RabbitMQ 应用的关闭,而Erlang 虚拟机并不关闭,类似于执行了 rabbitmqctl stop_app 命令。处于关闭的节点会每秒检测一次是否可连通到剩余集群中,如果可以则启动自身的应用。相当于执行 rabbitmqctl start_app 命令。

pause-minority 模式相应的配置如下:

[{rabbit, [{cluster_partition_handling, pause-minority}]}
]

需要注意的是RabbitMQ 会关闭不是严格意义上的大多数,比如在一个集群中只有两个节点的时候并不适合采用pause-minority 的模式,因为其中任何一个节点失败而发生网络分区时,两个节点都会关闭。当网络恢复时有可能两个节点会自动启动恢复网络分区,也有可能仍保持关闭状态,然而如果集群中的节点数远大于2 个时,pause-minority 模式比 ignore 模式更加可靠,特别是网络分区通常是由单节点网络故障而脱离原有分区引起的。

当对等分区出现时,会关闭这些分区内的所有节点,对于前面的[node1,node2] [node3,node4] 的例子而言,这四个节点上的RabbitMQ 应用都会被关闭,只有等待网络恢复之后,才会自动启动所有的节点以求从网络分区中恢复。

pause-if-all-down 模式

在pause-if-all-down 模式下,RabbitMQ 集群中的节点在和所配置的列表中的任何节点不能交互时才会关闭 语法为 {pause_if_all_down, [nodes], ignore|autoheal},其中[nodes]为受信节点,参考配置如下:

[{rabbit, [{cluster_partition_handling, {pause_if_all_down, ['rabbit@node1'], ignore}}]}
]

如果一个节点与 rabbit@node1 节点无法通信时,则会关闭自身的 RabbitMQ 应用。如果是rabbit@node1 本身发生了故障造成网络不可用,而其他节点都是正常的情况下,这种规则会让所有的节点中 RabbitMQ 应用都关闭,待rabbit@node1 中的网络恢复之后,各个节点再启动自身应用以从网络分区中恢复。

pause-if-all-down 模式下有ignore 和autoheal 两种不同的配置。考虑前面pause-minority 模式中提及的一种情形,node1、node2 部署在机架A 上,而node3、node4 部署在机架B,此时配置{cluster_partition_handling,{pause_if_all_down,['rabbit@node1' ,'rabbit@node3'], ignore}},那么当机架A 和机架B 通信出现异常时,由于node1、node2 保持着通信,node3、node4 保持着通信,这4 个节点都不会自行关闭,但是会形成两个分区,所以这样不能实现自动处理的功能。所以如果将配置中的ignore 替换成autoheal 就可以处理此种情形。

autoheal 模式

在autoheal 模式下,当认为发生网络分区时,RabbitMQ 会自动决定一个获胜(winning)的分区,然后重启不在这个分区中的节点来从网络分区中恢复。一个获胜的分区是指客户端连接最多的分区,如果产生一个平局,即有两个或者多个分区的客户端连接数一样多,那么节点数最多的一个分区就是获胜分区,如果此时节点数也一样多,将以节点名称的字典序来挑选获胜分区。

autoheal 模式参考配置如下:

[{rabbit, [{cluster_partition_handling, autoheal}]}
]

注意:在autoheal 模式下,如果集群中有节点处于非运行状态,那么当发生网络分区的时候,将不会有任何自动处理的动作。


 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 分装webSocket

背景 AI 实时对话 需要流式数据 React Hooks 写法。新建WebSocket.tsx 放在根目录components import { useCallback, useRef, useState } from react;type MessageHandler (message: MessageEvent) > void; type ErrorHandler (event: Event) > void;export functi…

技术成神之路:设计模式(二十二)命令模式

介绍 命令模式(Command Pattern)是一种行为设计模式,允许将请求(命令)封装为对象,从而使您可以使用不同的请求、队列或记录请求日志,以及支持可撤销操作。 1. 定义 命令模式将一个请求封装为一个…

S32DS for ARM GPIO实践

S32DS操作: 一、新建项目 打开S32DS,FIle–>NEW–> S32DS Application Project选择对应芯片,写入项目名然后下一步 选择对应的SDK,Debugger选带有PE字眼的,点击完成 配置GPIO,双击Components界面下的…

【MySQL】详解MySQL数据类型

一、数据类型 各类型的数值范围: 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。 可以通过UNSIGNED来说明某个字段是无符号的。对于int类型可能存放不下的数据,尽量不使用unsigned,unsigned int 同样可…

pytorch dataloader学习

import torch from torch.utils.data import Dataset, DataLoader import numpy as np torch.manual_seed(1) # 自定义数据集 class CustomDataset(Dataset):def __init__(self):# 创建一些示例数据(100个样本,每个样本包含10个特征)self.dat…

推荐一个开源非线性视频编辑器:Kdenlive

Kdenlive是一个开源的视频编辑软件,项目始于约2003年。它基于Qt和KDE框架库构建,大部分视频处理由MLT框架完成,同时依赖其他开源项目如FFmpeg、frei0r、movit、ladspa、sox等。 软件特点: - 多轨视频编辑:支持多个音频…

MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询

一、生成学生信息脚本 利用该脚本可以生成任意个学生信息,包括学号、姓名、班级、年级、专业、课程名称、课程成绩等信息,此处生成2万名学生,学生所有信息都是给定范围后随机生成。 生成学生信息后,再来对学生信息进行简单查询。…

论文阅读:Guided Linear Upsampling

今天介绍一篇有趣的文章,Guided Linear Upsampling,基于引导的线性上采样,这是发表在 ACM transaction on Graphic 的一篇工作。 Abstract 引导上采样是加速高分辨率图像处理的一种有效方法。在本文中,文章作者提出了一种简单而…

【2024】【字节青训营】:字节青训营入营测试题——Java版本(已提交通过)

目录 简单题目 计算x到y的最小步数 环状 DNA 序列的最小表示法 Base32 解码和编码 打点计时器 兔群繁殖之谜 完美整数 找出整数数组中占比超过 一半 的数 找出最长的神奇数列 找单独的数 字符串最短循环字串 二进制反码转换问题 中等题目 简单四则运算 数字翻译…

【图解版】力扣第146题:LRU缓存

力扣第146题:LRU缓存 一、LRU算法1. 基本概念2. LRU 和 LFU 的区别:3. 为什么 LRU 不需要记录使用频率? 二、Golang代码实现三、代码图解1. LRUCache、DLinkedNode两个结构体2. 初始化结构体对象3. addToHead函数4. removeNode函数5. moveToH…

rust grpc demo

文章目录 1. 创建项目2. 配置proto2.1 配置Cargo.toml, 内容如下:2.2 创建文件proto/hello.proto, 内容如下:2.3 添加build.rs文件, 内容如下:2.4 项目结构如下:2.5 编译proto文件 3.0 处理服务3.1 项目引入3.2 添加sr…

多模态大语言模型(MLLM)-Deepseek Janus

论文链接:https://arxiv.org/abs/2410.13848 代码链接:https://github.com/deepseek-ai/Janus 本次解读Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation 前言 Deepseek出品,必属精品。 创新点 传…

docker容器无法连接宿主机mysql排查

1、docker无法访问宿主机 在docker容器内,需要访问当前docker容器的网关,例如172.xx.0.1,即可访问宿主机,因此需要保证docker的网络配置正确 查看当前docker容器的网关: docker inspect 你的容器名或者容器id 显示…

【纯前端excel导出】vue2纯前端导出excel,使用xlsx插件,修改样式、合并单元格

官网: 1、xlsx-js-style xlsx-js-style | xlsx-js-style homepage 2、xlsx SheetJS 中文网 一、使用第三方插件 1、安装 npm install xlsx-js-style 2、引入 import xlsx from xlsx-js-style xlsx插件是基础的导出,不可以修改样式,直接xlsx-s…

文通车牌识别相机在工地称重应用中的卓越表现

在现代工地管理中,高效、准确的称重系统是确保工程顺利进行的关键之一。而文通车牌识别相机的出现,为工地称重应用带来了全新的解决方案。 一、工地称重面临的挑战 传统的工地称重方式往往存在着一些问题。人工记录车牌和重量信息容易出现错误&#xff0…

python-----函数详解(一)

一、概念及作用: 概念:由若干条语句组成语句块,其中包括函数名称、参数列表,它是组织代码的最小单元,完成一定的功能 作用:把一个代码封装成一个函数,一般按功能组织一段代码 目的就是为了重…

基于单片机的智能小区门禁系统设计(论文+源码)

1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心,STM32单片机作为主控单元,通过WiFi模块实现与手机APP的连接,构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…

百度搜索推广和信息流推广的区别,分别适用于什么场景!

信息流推广和搜索广告,不仅仅是百度,是很多平台的两个核心推广方式。 1、搜索广告: 就是基于用户的搜索习惯,更多是用户有疑问、还有用户当下就要做出行动的广告。 比如上门服务、线上咨询服务、招商加盟、了解产品各种型号和信…

STM32G4系列MCU的低功耗模式介绍

目录 概述 1 认识低功耗模式 1.1 低功耗模式的应用 1.2 低功耗模式介绍 2 低功耗模式的状态关系 2.1 低功耗模式可能的转换状态图 2.2 低功耗模式总结 3 运行模式 3.1 减慢系统时钟 3.2 外围时钟门控 3.3 低功耗运行模式(LP运行) 概述 本文主…

react 基础学习笔记

1.react 语法 ①数据渲染 函数组件将HTML结构直接写在函数的返回值中 JSX只能有一个根元素 JSX插值写法 插值可以使用的位置 1.标签内容; 2.标签属性 JSX 条件渲染:三目运算符; JSX根据数据进行列表渲染:map()方法&#x…