0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

rabbitmq高可用集群搭建

馬哥Linux運維 ? 來源:CSDN技術(shù)社區(qū) ? 2025-03-12 14:29 ? 次閱讀

需求分析基本情況

在進行RabbitMQ搭建時,我們基于現(xiàn)有的連接數(shù)據(jù)和業(yè)務(wù)需求進行了深入分析。目前的統(tǒng)計數(shù)據(jù)顯示,連接數(shù)為631,隊列數(shù)為80418。為了確保業(yè)務(wù)需求的順利滿足,我們需要在云產(chǎn)品和自建RabbitMQ消息隊列服務(wù)之間做出選擇。

經(jīng)過比較發(fā)現(xiàn),即使選擇騰訊云的最高規(guī)格配置,其Queue數(shù)也難以滿足我們的需求,并且成本相對較高。因此,我們決定搭建自建服務(wù)。為此,計劃使用三臺配置為8核 16GB 100GB 5Mbps / 標準型SA5的服務(wù)器節(jié)點,構(gòu)建一個高可靠性集群,以確保系統(tǒng)的穩(wěn)定性和可靠性。
騰訊云:

節(jié)點規(guī)格 2核4G 4核12G 8核24G 16核32G
消息 TPS(生產(chǎn)+消費) 600~1000 2100~3500 4200~7000 9000~15000
最大queue數(shù)量 100 200 300 800
最大連接數(shù) 500 2500 4000 8000
費用/月 2028 3537 6930 13434

自建服務(wù):

序號 節(jié)點1 節(jié)點2 節(jié)點3 費用/月
業(yè)務(wù)新選型 8核 16GB 100GB 5Mbps /標準型SA5 8核 16GB 100GB 5Mbps /標準型SA5 8核 16GB 100GB 5Mbps /標準型SA5 2485.2

需求變動:
前期功能業(yè)務(wù)體諒小基于目前的現(xiàn)狀考慮,并且不影響未來的擴容的情況下的方案節(jié)點規(guī)格收容4核8G內(nèi)150GB硬(50G系統(tǒng)盤+100G數(shù)據(jù)盤)/標準型SA5,以及搭建實現(xiàn)和優(yōu)化需求:
1、 集群建設(shè)
2、 實現(xiàn)高可用
3、 節(jié)點只運行rabbitmq,所以內(nèi)存閥值調(diào)制總在比的70%

rabbimtmq集群搭建

系統(tǒng)均使用CentOS7.9

節(jié)點名稱 節(jié)點IP rabbitmq版本 docker/compose 規(guī)格 數(shù)據(jù)盤
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

騰訊云申請三臺實例節(jié)點

0b31e982-fc28-11ef-9310-92fbcf53809c.png
0bc3094e-fc28-11ef-9310-92fbcf53809c.png

初始化三臺實例主機

hostnamectl set-hostname POS_Rabbitmq_1
bash init.sh

init.sh腳步內(nèi)容,騰訊云內(nèi)置了自己的yum源,可以不需要替換

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

echo "=====系統(tǒng)環(huán)境初始化腳本====="
echo "1.關(guān)閉防火墻與SELinux"
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/SELINUX/{s/enforcing/disabled/}' /etc/selinux/config

echo "2.設(shè)置系統(tǒng)最大打開文件數(shù)"
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.系統(tǒng)內(nèi)核優(yōu)化"
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1             #防范SYN洪水攻擊,0為關(guān)閉
net.ipv4.tcp_max_tw_buckets = 20480     #此項參數(shù)可以控制TIME_WAIT套接字的最大數(shù)量,避免Squid服務(wù)器被大量的TIME_WAIT套接字拖死
net.ipv4.tcp_max_syn_backlog = 20480    #表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)
net.core.netdev_max_backlog = 262144    #每個網(wǎng)絡(luò)接口 接受數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時,允許發(fā)送到隊列的數(shù)據(jù)包的最大數(shù)目
net.ipv4.tcp_fin_timeout = 20           #FIN-WAIT-2狀態(tài)的超時時間,避免內(nèi)核崩潰
EOF

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

echo "5.安裝系統(tǒng)性能分析工具及其他"
yum install -y gcc make autoconf vim sysstat net-tools iostat  lrzsz

格式化數(shù)據(jù)磁盤

數(shù)據(jù)盤默認給的是一個空盤需要直接格式化在掛載,在對安全數(shù)據(jù)要求比較嚴苛的環(huán)境中可以組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         數(shù)據(jù)目錄入口
|-- backup      數(shù)據(jù)緩存目錄
|-- logs        日志目錄
|-- prog        應(yīng)用程序目錄
|-- setup       程序下載目錄
|-- www         網(wǎng)站的存放目錄
EOF

安裝docker,compose

三臺實例主機安裝docker、docker-compose 版本18.03.1、1.29.2

# step 1: 安裝必要的一些系統(tǒng)工具
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: 設(shè)置開機自啟并且啟動docker服務(wù)
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官網(wǎng)查詢](https://hub.docker.com/_/rabbitmq/tags?page=&page_size=&ordering=&name=3.8-managemen)
0bdb25c4-fc28-11ef-9310-92fbcf53809c.png

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用戶,使用節(jié)點模式加入集群,rabbit@pos_rabbitmq_1,在docker- compose中必須定義pos_rabbitmq_1映射IP,否則無法解析找不到節(jié)點

[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內(nèi)存使用率默認占比總內(nèi)存的40%,這里需要修改為70%,env中使用RABBITMQ_VM_MEMORY_HIGH_WATERMARK定義設(shè)置

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  #每個節(jié)點名稱修改即可
    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 #內(nèi)存默認閥值設(shè)置

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  #每個節(jié)點名稱修改即可
    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  #每個節(jié)點名稱修改即可
    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 1054.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 1054.440 [info] <0.596.0> Resetting node maintenance status

Step6 集群高可用鏡像ha,任意節(jié)點執(zhí)行

[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

每個節(jié)點目錄結(jié)構(gòu)及其enabled_plugins安裝插件情況如下:

目錄結(jié)構(gòu)
[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.集群建設(shè)

pos_rabbitmq_1、pos_rabbitmq_2、pos_rabbitmq_3以組成集群
0c1092d6-fc28-11ef-9310-92fbcf53809c.png
0cc7bd1c-fc28-11ef-9310-92fbcf53809c.png

2.實現(xiàn)高可用

集群實現(xiàn)ha鏡像高可用,創(chuàng)建隊列,鏡像備份mq2,mq3
0cf4fc1e-fc28-11ef-9310-92fbcf53809c.png
0d0def44-fc28-11ef-9310-92fbcf53809c.png
0d308860-fc28-11ef-9310-92fbcf53809c.png

3.節(jié)點只運行rabbitmq,所以內(nèi)存閥值調(diào)制總在比的70%

總運行內(nèi)存8G,占比70% 可用5.2GB
0d494742-fc28-11ef-9310-92fbcf53809c.png

來源:https://blog.csdn.net/qq_40189664/article/details/141823785

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9717

    瀏覽量

    87388
  • 集群
    +關(guān)注

    關(guān)注

    0

    文章

    101

    瀏覽量

    17378
  • rabbitmq
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    1135

原文標題:rabbitmq高可用集群搭建

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦
    熱點推薦

    MYSQL集群可用和數(shù)據(jù)監(jiān)控平臺實現(xiàn)方案

    該項目共分為2個子項目,由MYSQL集群可用和數(shù)據(jù)監(jiān)控平臺兩部分組成。
    的頭像 發(fā)表于 05-28 10:10 ?391次閱讀
    MYSQL<b class='flag-5'>集群</b><b class='flag-5'>高</b><b class='flag-5'>可用</b>和數(shù)據(jù)監(jiān)控平臺實現(xiàn)方案

    基于kafka和zookeeper可用集群的shell腳本使用步驟

    kafka+zookeeper可用集群搭建shell腳本使用教程
    發(fā)表于 03-11 16:50

    kafka架構(gòu)與集群搭建

    kafka入門+集群搭建
    發(fā)表于 04-29 17:06

    基于KeepAlive的可用配置

    KeepAlived集群可用搭建
    發(fā)表于 06-11 16:36

    kubernetes集群配置

    基于v1104版本手動搭建可用kubernetes 集群
    發(fā)表于 08-19 08:07

    搭建Zookeeper集群筆記

    Zookeeper集群搭建
    發(fā)表于 09-19 09:01

    hadoop集群搭建的準備

    hadoop集群搭建系列(step01:集群搭建準備)
    發(fā)表于 03-31 09:47

    Mesos可用集群解決方案

    )設(shè)計方案的了解以及在Mesos社區(qū)貢獻的經(jīng)驗,深度剖析了Mesos集群可用的解決方案,以及對未來的展望。 Mesos可用架構(gòu)概述 首先
    發(fā)表于 10-10 09:48 ?0次下載
    Mesos<b class='flag-5'>高</b><b class='flag-5'>可用</b><b class='flag-5'>集群</b>解決方案

    淺談Kubernetes集群可用方案

    Kubernetes作為容器應(yīng)用的管理中心,通過對Pod的數(shù)量進行監(jiān)控,并且根據(jù)主機或容器失效的狀態(tài)將新的Pod調(diào)度到其他Node上,實現(xiàn)了應(yīng)用層的可用性。針對Kubernetes集群,
    發(fā)表于 10-11 10:04 ?1次下載
    淺談Kubernetes<b class='flag-5'>集群</b>的<b class='flag-5'>高</b><b class='flag-5'>可用</b>方案

    Eureka的集群搭建方法-保證可用

    在微服務(wù)架構(gòu)中,注冊中心是一個必不可少的組件 前面我們搭建的注冊中心只適合本地開發(fā)使用,在生產(chǎn)環(huán)境必須搭建一個集群來保證可用 Eureka
    發(fā)表于 11-29 10:41 ?7642次閱讀
    Eureka的<b class='flag-5'>集群</b><b class='flag-5'>搭建</b>方法-保證<b class='flag-5'>高</b><b class='flag-5'>可用</b>

    簡單分析Java可用集群和微服務(wù)架構(gòu)

    可能大部分讀者都在想,為什么在這以 dubbo、spring cloud 為代表的微服務(wù)時代,我要還要整理這種已經(jīng)“過時”可用集群架構(gòu)?
    的頭像 發(fā)表于 05-03 18:17 ?2271次閱讀
    簡單分析Java<b class='flag-5'>高</b><b class='flag-5'>可用</b><b class='flag-5'>集群</b>和微服務(wù)架構(gòu)

    如何搭建可用集群

    、Kubernetes 6、總結(jié) 1、可用 2、關(guān)于CP還是AP的選擇 3、技術(shù)體系 4、產(chǎn)品的活躍度 1、前言 微服務(wù)的注冊中心目前主流的有以下五種: Zookeeper Eureka Consul
    的頭像 發(fā)表于 05-25 11:03 ?802次閱讀
    如何<b class='flag-5'>搭建</b><b class='flag-5'>高</b><b class='flag-5'>可用</b><b class='flag-5'>集群</b>

    搭建Keepalived+Lvs+Nginx可用集群負載均衡

    Server)實現(xiàn)可用負載均衡 附:LVS的負載均衡算法 八、搭建Keepalived+Lvs+Nginx可用
    的頭像 發(fā)表于 06-25 15:39 ?3573次閱讀
    <b class='flag-5'>搭建</b>Keepalived+Lvs+Nginx<b class='flag-5'>高</b><b class='flag-5'>可用</b><b class='flag-5'>集群</b>負載均衡

    rabbitmq是什么?rabbitmq安裝、原理、部署

    本身是基于Erlang編寫的,Erlang語言自然具有分布式特性(Magic通過同步Erlang集群每個節(jié)點 實現(xiàn)cookie)。 RabbitMQ部署,RabbitMQ安裝 (1)Erlang與
    的頭像 發(fā)表于 07-19 13:50 ?1260次閱讀

    RocketMQ和RabbitMQ的區(qū)別

    :RocketMQ主要使用Java開發(fā),而RabbitMQ則使用Erlang語言開發(fā)。 性能:RocketMQ在性能方面更強,具備吞吐量和低延遲的優(yōu)勢;RabbitMQ則提供了更豐富的功能和更高的靈活性。 數(shù)據(jù)持久
    的頭像 發(fā)表于 07-24 13:39 ?1.5w次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品