rabbitmq高可用叢集搭建

需求分析基本情況

在進行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


相關文章