需求分析基本情况

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

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

腾讯云:

节点规格 2核4G 4核12G 8核24G 16核32G
消息 TPS(生产+消费) 600~1000 2100~3500 4200~7000 9000~15000
最大queue数量 100 200 300 800
最大连接数 500 2500 4000 8000
费用/月 2028 3537 6930 13434

自建服务:

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

需求变动:

前期功能业务体谅小基于目前的现状考虑,并且不影响未来的扩容的情况下的方案节点规格收容 4核8G内150GB硬(50G系统盘+100G数据盘)/标准型SA5,以及搭建实现和优化需求:

1、 集群建设

2、 实现高可用

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

rabbimtmq集群搭建

系统均使用CentOS7.9

节点名称 节点IP rabbitmq版本 docker/compose 规格 数据盘
pos_rabbitmq_1 172.17.80.27 3.8-manageme 18.03.1/1.29.2 4核8G50GB 100GB
pos_rabbitmq_2 172.17.80.32 3.8-manageme 18.03.1/1.29.2 4核8G50GB 100GB
pos_rabbitmq_1 172.17.80.6 3.8-manageme 18.03.1/1.29.2 4核8G50GB 100GB

腾讯云申请三台实例节点



初始化三台实例主机

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

rabbitmq高可用集群搭建的更多相关文章

  1. RabbitMQ 高可用集群搭建及电商平台使用经验总结

    面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ p ...

  2. RabbitMQ 高可用集群搭建

    面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ p ...

  3. RabbitMQ高级指南:从配置、使用到高可用集群搭建

    本文大纲: 1. RabbitMQ简介 2. RabbitMQ安装与配置 3. C# 如何使用RabbitMQ 4. 几种Exchange模式 5. RPC 远程过程调用 6. RabbitMQ高可用 ...

  4. Linux源码安装RabbitMQ高可用集群

    1.环境说明 linux版本:CentOS Linux release 7.9.2009 erlang版本:erlang-24.0 rabbitmq版本:rabbitmq_server-3.9.13 ...

  5. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  6. hadoop高可用集群搭建小结

    hadoop高可用集群搭建小结1.Zookeeper集群搭建2.格式化Zookeeper集群 (注:在Zookeeper集群建立hadoop-ha,amenode的元数据)3.开启Journalmno ...

  7. Spark高可用集群搭建

    Spark高可用集群搭建 node1    node2    node3   1.node1修改spark-env.sh,注释掉hadoop(就不用开启Hadoop集群了),添加如下语句 export ...

  8. Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.服务器环境 主机名 IP 用户名 密码 安装目录 master188 192.168.29.188 hadoop hadoop /home/ha ...

  9. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  10. MongoDB高可用集群搭建(主从、分片、路由、安全验证)

    目录 一.环境准备 1.部署图 2.模块介绍 3.服务器准备 二.环境变量 1.准备三台集群 2.安装解压 3.配置环境变量 三.集群搭建 1.新建配置目录 2.修改配置文件 3.分发其他节点 4.批 ...

随机推荐

  1. Vscode连接虚拟机报错

    Vscode 连接虚拟机报错问题解决 问题解释 Permission denied, please try again.出现这个问题通常表示身份验证失败. 可能的原因有 SSH用户密码错误 SSH端口 ...

  2. BootstrapTable 行内编辑解决方案:bootstrap-table-editor

    最近开发的一个业务平台,是一个低代码业务平台.其中用到的了bootstrap-table组件.但是bootstrap-table自身不带编辑功能. 通过搜索发现,网上大部分的解决方案都是使用x-edi ...

  3. TP3.2与TP5.0的区别

    1. 控制器输出return $this->fetch(); ----5$this->display(); ----3.2单字母函数去掉了 如:M() D() U() S() C() 3. ...

  4. Vue禁止用户复制文案 + 兼容 IE

    vue必须要加载完才可以操作dom,或者在mounted和created时使用this.$nextTick方法,使dom生成后进行相关操作. created() { this.$nextTick(() ...

  5. Web 开发技术栈

    Web 开发技术栈 Web 是什么? 简单地说,网络是一个遍布全球的网络,它连接大量设备并允许它们相互通信 Internet 上的网站托管在称为服务器的设备上,当与 Internet 上的网页交互时, ...

  6. 最佳 AI 翻译工作流:全世界最信达雅的翻译

    吴恩达老师提出了一种反思翻译的大语言模型 (LLM) AI 翻译工作流程--GitHub - andrewyng/translation-agent,具体工作流程如下: 提示一个 LLM 将文本从 s ...

  7. java中的Context

    在java编程中,上下文(Context)是指程序运行时的环境和状态的集合.包括了类对象变量方法等运行时的相关数据 在类中,我们可以通过this获取当前类的变量.方法的上下文, 例如getset方法: ...

  8. docker 部署redis 并在外部访问 docker命令

    docker search redis //搜索redis版本 docker pull redis //拉取最新版本 docker run -d --name redis -p 自定义端口:6379 ...

  9. 【Java】Map 映射接口 概述

    Map 映射接口 概述 Map是一个双列数据,存储K-V类型的数据 JDK1.2 - HashMap 是目前Map的主要实现类 JDK1.2 线程不安全的,效率高,可存储null的key和value ...

  10. 【Hibernate】Re07 关系映射处理

    一.单向多对一关系映射处理 演示案例列举了员工与部门的关系,一个部门下具有多个员工,相反的一个员工只隶属于一个部门下面 Maven依赖坐标: <dependency> <groupI ...