需求分析基本情況
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
rabbimtmq叢集搭建
節點名稱 | 節點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
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
格式化資料磁碟
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
# 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
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
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叢集
[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
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搭建叢集配置檔案
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
40%
,這裡需要修改為70%
,env中使用 RABBITMQ_VM_MEMORY_HIGH_WATERMARK
定義設定
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 #記憶體預設閥值設定
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
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
目錄結構
[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.叢集建設


2.實現高可用



3.節點只執行rabbitmq,所以記憶體閥值調製總在比的70%
