rabbitmq高可用集群搭建

news2024/9/21 17:43:36

需求分析基本情况

在进行RabbitMQ搭建时,我们基于现有的连接数据和业务需求进行了深入分析。目前的统计数据显示,连接数为631,队列数为80418。为了确保业务需求的顺利满足,我们需要在云产品和自建RabbitMQ消息队列服务之间做出选择。

经过比较发现,即使选择腾讯云的最高规格配置,其Queue数也难以满足我们的需求,并且成本相对较高。因此,我们决定搭建自建服务。为此,计划使用三台配置为8核 16GB 100GB 5Mbps / 标准型SA5的服务器节点,构建一个高可靠性集群,以确保系统的稳定性和可靠性。
腾讯云:

节点规格2核4G4核12G8核24G16核32G
消息 TPS(生产+消费)600~10002100~35004200~70009000~15000
最大queue数量100200300800
最大连接数500250040008000
费用/月20283537693013434

自建服务:

序号节点1节点2节点3费用/月
业务新选型8核 16GB 100GB 5Mbps /标准型SA58核 16GB 100GB 5Mbps /标准型SA58核 16GB 100GB 5Mbps /标准型SA52485.2

需求变动:
前期功能业务体谅小基于目前的现状考虑,并且不影响未来的扩容的情况下的方案节点规格收容 4核8G内150GB硬(50G系统盘+100G数据盘)/标准型SA5,以及搭建实现和优化需求:
1、 集群建设
2、 实现高可用
3、 节点只运行rabbitmq,所以内存阀值调制总在比的70%

rabbimtmq集群搭建

系统均使用CentOS7.9

节点名称节点IPrabbitmq版本docker/compose规格数据盘
pos_rabbitmq_1172.17.80.273.8-manageme18.03.1/1.29.24核8G50GB100GB
pos_rabbitmq_2172.17.80.323.8-manageme18.03.1/1.29.24核8G50GB100GB
pos_rabbitmq_1172.17.80.63.8-manageme18.03.1/1.29.24核8G50GB100GB
腾讯云申请三台实例节点

在这里插入图片描述

在这里插入图片描述

初始化三台实例主机
hostnamectl set-hostname POS_Rabbitmq_1
bash init.sh

init.sh 脚步内容,腾讯云内置了自己的yum源,可以不需要替换

yum clean all && yum makecache
yum install  telnet curl wget lrzsz net-tools vim unzip zip  htop tree -y 

echo "=====系统环境初始化脚本====="
echo "1.关闭防火墙与SELinux"
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/SELINUX/{s/enforcing/disabled/}' /etc/selinux/config

echo "2.设置系统最大打开文件数"
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535   #软限制
* hard nofile 65535   #硬限制
EOF
fi

echo "3.系统内核优化"
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1             #防范SYN洪水攻击,0为关闭
net.ipv4.tcp_max_tw_buckets = 20480     #此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死
net.ipv4.tcp_max_syn_backlog = 20480    #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数
net.core.netdev_max_backlog = 262144    #每个网络接口 接受数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目
net.ipv4.tcp_fin_timeout = 20           #FIN-WAIT-2状态的超时时间,避免内核崩溃
EOF

echo "4.减少SWAP使用"
echo "0" > /proc/sys/vm/swappiness

echo "5.安装系统性能分析工具及其他"
yum install -y gcc make autoconf vim sysstat net-tools iostat  lrzsz
格式化数据磁盘

数据盘默认给的是一个空盘需要直接格式化在挂载,在对安全数据要求比较严苛的环境中可以组RAID,这里直接格式化挂载

mkfs.ext4 /dev/vdb 
mount /dev/vdb /data
echo "/dev/vdb /data ext4 defaults 0 0" >> /etc/fstab
mount -a

mkdir -p   /data/{apd,logs,prog,setup,backup,www}
tee  /data/README.md << EOF
/data/
|-- apd         数据目录入口
|-- backup      数据缓存目录
|-- logs        日志目录
|-- prog        应用程序目录
|-- setup       程序下载目录
|-- www         网站的存放目录
EOF
安装docker,compose

三台实例主机安装docker、docker-compose 版本18.03.1、1.29.2

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 git htop

# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
yum -y install docker-ce-18.03.1.ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

# Step 5: 设置开机自启并且启动docker服务
systemctl enable --now docker

配置docker镜像加速器

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://rbmo5xql.mirror.aliyuncs.com"],
  "log-driver":"json-file",
  "bip": "192.168.1.5/24",
  "log-opts": { "max-size": "50m", "max-file": "1" }
}
EOF
 
systemctl daemon-reload && systemctl restart docker

下载docker-compose

cd /data/setup

wget -O  https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64

mv docker-compose-Linux-x86_64  docker-compose

chmod +x docker-compose 

cp /data/setup/docker-compose /usr/local/bin/

ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose -v
# docker-compose version 1.29.2, build 5becea4c
部署rabbitmq集群

使用rabbitmq:3.8-management镜像,rabbitmq:3.8-management-apline包有高危漏洞[hub.docker.com官网查询](https://hub.docker.com/_/rabbitmq/tags?page=&page_size=&ordering=&name=3.8-managemen)
在这里插入图片描述

Step1 三台主机拉取rabbitmq镜像
[root@pos_rabbitmq_1 /data/setup/public/rabbitmq/mq_1] eth0 = 172.17.80.27
# docker pull rabbitmq:3.8-management

[root@pos_rabbitmq_2 /data/setup/public/rabbitmq/mq_2] eth0 = 172.17.80.32
# docker pull rabbitmq:3.8-management

[root@pos_rabbitmq_3 /data/setup/public/rabbitmq/mq_3] eth0 = 172.17.80.6
# docker pull rabbitmq:3.8-management
Step2 获取cookie

之前cookie可以在获取后写入docker-comose_env中定义,但是被该方法以被弃用,所以使用挂载的方式

# Step 2: 获取cookie
[root@pos_rabbitmq_3 /data/setup/public/rabbitmq/mq_3] eth0 = 172.17.80.6
# cat > rabbitmq-cookie.sh << eof
docker run -d --name mq rabbitmq:3.8-management
sleep 10
docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie > .erlang.cookie
chmod 600 .erlang.cookie
docker rm -f mq
docker volume prune
eof

[root@pos_rabbitmq_3 /data/setup/public/rabbitmq/mq_3] eth0 = 172.17.80.6
# sh rabbitmq-cookie.sh
Step3 rabbitmq搭建集群配置文件

不适用guest用户,使用节点模式加入集群,rabbit@pos_rabbitmq_1,在docker- compose中必须定义pos_rabbitmq_1映射IP,否则无法解析找不到节点

[root@pos_rabbitmq_3 /data/setup/public/rabbitmq/mq_3] eth0 = 172.17.80.6
# cat > rabbitmq.conf << eof
loopback_users.guest = false
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@pos_rabbitmq_1
cluster_formation.classic_config.nodes.2 = rabbit@pos_rabbitmq_2
cluster_formation.classic_config.nodes.3 = rabbit@pos_rabbitmq_3
eof
Step4 docker-compose

rabbitmq内存使用率默认占比总内存的40%,这里需要修改为70%,env中使用 RABBITMQ_VM_MEMORY_HIGH_WATERMARK定义设置

pos_rabbitmq_1 中docker-compose.yaml文件

version: "3.6"
services:
 pos_rabbitmq_1:
    image: rabbitmq:3.8-management
    restart: always
    container_name: pos_rabbitmq_1  #每个节点名称修改即可
    network_mode: host
    extra_hosts:
      - "pos_rabbitmq_1:172.17.80.27"
      - "pos_rabbitmq_2:172.17.80.32"
      - "pos_rabbitmq_3:172.17.80.6"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /data/apd/rabbitmq:/var/lib/rabbitmq
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
      - .erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ../enabled_plugins:/etc/rabbitmq/enabled_plugins 
      - /data/logs/rabbitmq:/var/log/rabbitmq
    environment:
      - LANG=C.UTF-8
      - RABBITMQ_DEFAULT_USER=root
      - RABBITMQ_DEFAULT_PASS=xxxxxx
      - RABBITMQ_VM_MEMORY_HIGH_WATERMARK=0.7 #内存默认阀值设置

pos_rabbitmq_2 中docker-compose.yaml文件

version: "3.6"
services:
 pos_rabbitmq_1:
    image: rabbitmq:3.8-management
    restart: always
    container_name: pos_rabbitmq_2  #每个节点名称修改即可
    network_mode: host
    extra_hosts:
      - "pos_rabbitmq_1:172.17.80.27"
      - "pos_rabbitmq_2:172.17.80.32"
      - "pos_rabbitmq_3:172.17.80.6"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /data/apd/rabbitmq:/var/lib/rabbitmq
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
      - .erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ../enabled_plugins:/etc/rabbitmq/enabled_plugins 
      - /data/logs/rabbitmq:/var/log/rabbitmq
    environment:
      - LANG=C.UTF-8
      - RABBITMQ_DEFAULT_USER=root
      - RABBITMQ_DEFAULT_PASS=xxxxxx
      - RABBITMQ_VM_MEMORY_HIGH_WATERMARK=0.7

pos_rabbitmq_3 中docker-compose.yaml文件

version: "3.6"
services:
 pos_rabbitmq_1:
    image: rabbitmq:3.8-management
    restart: always
    container_name: pos_rabbitmq_3  #每个节点名称修改即可
    network_mode: host
    extra_hosts:
      - "pos_rabbitmq_1:172.17.80.27"
      - "pos_rabbitmq_2:172.17.80.32"
      - "pos_rabbitmq_3:172.17.80.6"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /data/apd/rabbitmq:/var/lib/rabbitmq
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
      - .erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ../enabled_plugins:/etc/rabbitmq/enabled_plugins 
      - /data/logs/rabbitmq:/var/log/rabbitmq
    environment:
      - LANG=C.UTF-8
      - RABBITMQ_DEFAULT_USER=root
      - RABBITMQ_DEFAULT_PASS=xxxxxx
      - RABBITMQ_VM_MEMORY_HIGH_WATERMARK=0.7
Step5 启动集群,启动完成后逐步启动过mq2,mq3
# Step 4: 启动集群,启动完成后逐步启动过mq2,mq3
[root@pos_rabbitmq_1 /data/setup/public/rabbitmq/mq_1] eth0 = 172.17.80.27
# docker-compose up -d
Creating pos_rabbitmq_1 ... done


[root@pos_rabbitmq_1 /data/setup/public/rabbitmq/mq_1] eth0 = 172.17.80.27
# docker logs pos_rabbitmq_1 -f
2024-07-30 10:57:54.440 [info] <0.596.0> Server startup complete; 9 plugins started.
 * rabbitmq_federation_management
 * rabbitmq_federation
 * rabbitmq_web_stomp
 * rabbitmq_stomp
 * rabbitmq_web_mqtt
 * rabbitmq_mqtt
 * rabbitmq_management
 * rabbitmq_web_dispatch
 * rabbitmq_management_agent
 completed with 9 plugins.
2024-07-30 10:57:54.440 [info] <0.596.0> Resetting node maintenance status
Step6 集群高可用镜像ha,任意节点执行
[root@pos_rabbitmq_1 /data/setup/public/rabbitmq/mq_1] eth0 = 172.17.80.27
# docker exec -it pos_rabbitmq_1 /bin/bash
root@pos_rabbitmq_1:/# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
root@pos_rabbitmq_1:/# exit
exit

每个节点目录结构及其enabled_plugins安装插件情况如下:

目录结构
[root@pos_rabbitmq_1 /data/setup/public/rabbitmq] eth0 = 172.17.80.27
# tree -a
.
|-- enabled_plugins
|-- mq_1
|   |-- docker-compose.yml
|   |-- .erlang.cookie
|   |-- .rabbitmq.conf
|   `-- rabbitmq.conf
|-- mq_2
|   |-- docker-compose.yml
|   |-- .erlang.cookie
|   `-- rabbitmq.conf
|-- mq_3
|   |-- docker-compose.yml
|   |-- .erlang.cookie
|   `-- rabbitmq.conf
`-- README.md

# cat enabled_plugins
[rabbitmq_federation_management,rabbitmq_management,rabbitmq_mqtt,rabbitmq_web_mqtt,rabbitmq_stomp,rabbitmq_web_stomp].

测试

1. 集群建设

pos_rabbitmq_1、pos_rabbitmq_2、pos_rabbitmq_3以组成集群
在这里插入图片描述
在这里插入图片描述

2. 实现高可用

集群实现ha镜像高可用,创建队列,镜像备份mq2,mq3
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 节点只运行rabbitmq,所以内存阀值调制总在比的70%

总运行内存8G,占比70% 可用5.2GB
在这里插入图片描述

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

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

相关文章

最新软件测试面试题,常见面试题及答案汇总,不怕拿不到offer

面试题包括以下十六个模块&#xff1a;软件测试基础&#xff0c;liunx基础&#xff0c;MySQL基础&#xff0c;web测试&#xff0c;APP测试&#xff0c;性能测试&#xff0c;selenium&#xff0c;Python基础&#xff0c;接口测试&#xff0c;lordrunner&#xff0c;计算机网络&a…

chapter11-枚举和注解——(注解)——day14

目录 433-override注解 434-Deprecated注解 435-SupressWarnings注解 436-JDK的元注解 433-override注解 434-Deprecated注解 435-SupressWarnings注解 436-JDK的元注解

华为云征文 | 华为云Flexus云服务器X实例之Docker环境下部署JmalCloud个人网盘

华为云征文 | 华为云Flexus云服务器X实例之Docker环境下部署JmalCloud个人网盘 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、JmalCloud介绍2.1 JmalCloud简介2.2 JmalCloud优点2.3 JmalCloud使…

Android Camera系列(一):SurfaceView+Camera

心行慈善&#xff0c;何需努力看经—《西游记》 本系列主要讲述Android开发中Camera的相关操作、预览方式、视频录制等&#xff0c;项目结构代码耦合性低&#xff0c;旨在帮助大家能从中有所收获&#xff08;方便copy :&#xff09; &#xff09;&#xff0c;对于个人来说也是一…

【Next】2. 项目构建

打开 Next.js 的官方文档&#xff1a;https://nextjs.org/docs/getting-started/installation&#xff08;国内文档不够新&#xff09; Next.js 版本 14.2 &#xff0c; Node.js 的版本要求必须 > 18.18。 Next 有两种开发模式&#xff0c;下面讲新的 APP Router。 创建项…

VS2022 C++ 控制台中文乱码解决方案

最近写读文件的代码时&#xff0c;遇到了VS控制台读取中文时出现乱码&#xff0c;看了网上主要有两种方法 &#xff1a; 1、在VS菜单栏里点击"文件"选项&#xff0c;然后选择"高级保存选项"来设置文件格式&#xff0c;但是我的文件选项里没有"高级保存…

COT报告:美国期货市场持仓情况分析

市场情绪的晴雨表 COT报告揭示了美国期货市场中不同参与者的持仓情况&#xff0c;尤其是净多头和净空头头寸。这份报告发布时会有约三天的滞后&#xff0c;因此提供的是过往数据。通常&#xff0c;该报告在星期五发布&#xff0c;反映的是截至前一星期二的数据&#xff0c;因此…

蓝牙地址BD Addr烧录

关于蓝牙地址,有很多文章有介绍,主要要知道下面一个图: 蓝牙设备地址(或BD_ADDR)是制造商分配给每个蓝牙设备的唯一48位标识符。蓝牙地址通常显示为以十六进制书写的6个字节,用冒号分隔(例如-00:11:22:FF:EE)。蓝牙地址的上半部分(最重要的24位)被称为组织唯一标识符…

MASM32+ HTML JavaScript,好搭档

哪个编程工具让你的工作效率翻倍&#xff1f; 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。那么&#xff0c;哪款编程工具让你…

「Python数据分析」Pandas进阶,使用merge()函数合并数据

在使用python语言进行数据分析的过程中&#xff0c;我们的数据&#xff0c;有很大一部分是结构化数据&#xff0c;也就是比较整齐的数据。 这里&#xff0c;我不展开讲什么是结构化数据&#xff0c;因为这个范围太过于庞大。但是&#xff0c;有一个知识点&#xff0c;必须要讲…

前端代码注释风格 - CSS篇

本文基于《阿里巴巴CSS编程规约》、stylelint rules进行编写&#xff0c;涉及预编译语言&#xff08;Sass、Less&#xff09;的编码风格和最佳实践。 1.1 编码风格 空格的使用 选择器和{之间保留一个空格。.selector-disabled { 在使用逗号分隔的属性中&#xff0c;逗号后保…

Python检测和识别车牌-python经典练手项目

车牌检测与识别技术用途广泛&#xff0c;可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。 本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理&#xff0c;检测和识别车牌&#xff0c;最后显示车牌字符&#xff0c;作为…

专利复现_基于ngboost和SHAP值可解释预测方法

大家好&#xff0c;我是重庆未来之智的Toby老师&#xff0c;最近看到一篇专利&#xff0c;名称是《基于NGBoost和SHAP值的可解释地震动参数概率密度分布预测方法》。该专利申请工日是2021年3月2日。 专利复现 我看了这专利申请文案后&#xff0c;文章整体布局和文字内容结构不错…

c++修炼之路之C++11

目录 一&#xff1a;使用列表初始化 二&#xff1a;decltype和nullptr 三&#xff1a;右值引用和移动语义 四&#xff1a;新的类功能 五&#xff1a;可变参数模板 六&#xff1a;lambda表达式 七&#xff1a;包装器 1.function包装器 2.bind包装器 接下来的日子会顺…

《深度学习》OpenCV 图像轮廓检测、轮廓处理及代码演示

目录 一、图像轮廓检测 1、边缘检测和轮廓检测 2、常用的图像轮廓检测方法包括&#xff1a; 1&#xff09;基于梯度的方法 2&#xff09;基于边缘检测器的方法 3&#xff09;基于阈值的方法 3、查找轮廓的函数 4、轮廓的绘制 5、轮廓特征 1&#xff09;轮廓面积 2&a…

呵,老板不过如此,SQL还是得看我

2018年7月&#xff0c;大三暑假进行时&#xff0c;时间过得飞快&#xff0c;我到这边实习都已经一个月了。 我在没工作之前&#xff0c;我老是觉得生产项目的代码跟我平时自学练的会有很大的区别。 以为生产项目代码啥的都会规范很多&#xff0c;比如在接口上会做很多安全性的…

自己开发完整项目一、登录功能-05(动态权限控制)

一、上节回顾 在上一节中&#xff0c;我们介绍了如何通过数据库查询用户的权限&#xff0c;并对方法级别的接口使用注解的方式进行权限控制&#xff0c;之后通过用户携带的tocken进行解析权限&#xff0c;判断是否可以访问。 具体步骤&#xff1a; 1.在查询用户信息的时候将用户…

神经网络中激活函数介绍、优缺点分析

本文主要介绍神经网络中的常用的激活函数 激活函数是神经网络中用于引入非线性模型&#xff0c;提升模型泛化能力的函数 非线性激活函数至关重要&#xff0c;它可以让神经网络学习复杂特征、提供模型复杂度 1、激活函数定义 激活函数是神经网络模型中的一种非线性函数&#xf…

教学能力知识

第一章课程理论知识 一、课程理念 二、课程目标 1.核心素养 2.课程总目标 三、教学建议 四、教学环节 第二章教学实施 第一节导入新课类 二.导入方法 第二节教学方法类 教学方法的选择依据 第三节教法实施原则类 设计意图 第四节设计意图类 1.教学目标 2.教学重难点 3.教学…

【安当产品应用案例100集】014-使用安当TDE实现达梦数据库实例文件的透明加密存储

随着数据安全重要性的不断提升&#xff0c;数据库文件的落盘加密已成为数据保护的一项基本要求。达梦数据库作为一款高性能的国产数据库管理系统&#xff0c;为用户提供了一种高效、安全的数据存储解决方案。本文将详细介绍如何利用安当KSP密钥管理平台及TDE透明加密组件来实现…