Docker + Redis 部署集群的實現(xiàn)步驟
一、環(huán)境準備
1. 服務(wù)器規(guī)劃(3 臺服務(wù)器)
| 服務(wù)器 | IP 地址 | 角色 | 運行 Redis 節(jié)點 | 開放端口(防火墻) |
|---|---|---|---|---|
| server1 | 192.168.1.100 | 主節(jié)點 1 + 從節(jié)點 1 | redis-6379(主)、redis-6380(從) | 6379-6380(Redis 端口)、16379-16380(集群總線端口) |
| server2 | 192.168.1.101 | 主節(jié)點 2 + 從節(jié)點 2 | redis-6379(主)、redis-6380(從) | 同上 |
| server3 | 192.168.1.102 | 主節(jié)點 3 + 從節(jié)點 3 | redis-6379(主)、redis-6380(從) | 同上 |
- 端口說明:Redis 集群需開放 服務(wù)端口(如 6379)和 集群總線端口(服務(wù)端口 + 10000,如 16379),總線端口用于節(jié)點間通信。
2. 防火墻配置(三臺服務(wù)器均執(zhí)行)
# 開放 Redis 服務(wù)端口和集群總線端口 sudo firewall-cmd --permanent --add-port=6379-6380/tcp sudo firewall-cmd --permanent --add-port=16379-16380/tcp sudo firewall-cmd --reload
3. 安裝 Docker 并配置跨主機通信
三臺服務(wù)器均需安裝 Docker,并確保彼此網(wǎng)絡(luò)互通(可 ping 通對方 IP)。無需額外創(chuàng)建 Docker 網(wǎng)絡(luò),直接通過 主機 IP + 端口 實現(xiàn)跨服務(wù)器節(jié)點通信。
二、部署 Redis 節(jié)點(每臺服務(wù)器部署 2 個節(jié)點)
1. 在 server1(192.168.1.100)部署節(jié)點
# 創(chuàng)建數(shù)據(jù)目錄(持久化用)
mkdir -p /data/redis/{6379,6380} && chmod 777 -R /data/redis
# 啟動主節(jié)點(6379)
docker run -d \
--name redis-6379 \
--net host \ # 使用主機網(wǎng)絡(luò),避免端口映射問題(推薦集群模式)
-v /data/redis/6379:/data \
redis:7-alpine \
redis-server \
--port 6379 \
--cluster-enabled yes \ # 開啟集群模式
--cluster-config-file nodes-6379.conf \ # 集群配置文件
--cluster-node-timeout 5000 \ # 節(jié)點超時時間(毫秒)
--appendonly yes \ # 開啟 AOF 持久化
--requirepass "D83544E45CA39C7653BF21612FAD0FD1" \ # 密碼(所有節(jié)點必須一致)
--masterauth "D83544E45CA39C7653BF21612FAD0FD1" # 主從同步密碼(與 requirepass 一致)
# 啟動從節(jié)點(6380,后續(xù)會被分配到其他主節(jié)點)
docker run -d \
--name redis-6380 \
--net host \
-v /data/redis/6380:/data \
redis:7-alpine \
redis-server \
--port 6380 \
--cluster-enabled yes \
--cluster-config-file nodes-6380.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
--masterauth "D83544E45CA39C7653BF21612FAD0FD1"
2. 在 server2(192.168.1.101)部署節(jié)點
# 創(chuàng)建數(shù)據(jù)目錄
mkdir -p /data/redis/{6379,6380} && chmod 777 -R /data/redis
# 啟動主節(jié)點(6379)
docker run -d \
--name redis-6379 \
--net host \
-v /data/redis/6379:/data \
redis:7-alpine \
redis-server \
--port 6379 \
--cluster-enabled yes \
--cluster-config-file nodes-6379.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
--masterauth "D83544E45CA39C7653BF21612FAD0FD1"
# 啟動從節(jié)點(6380)
docker run -d \
--name redis-6380 \
--net host \
-v /data/redis/6380:/data \
redis:7-alpine \
redis-server \
--port 6380 \
--cluster-enabled yes \
--cluster-config-file nodes-6380.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
--masterauth "D83544E45CA39C7653BF21612FAD0FD1"
3. 在 server3(192.168.1.102)部署節(jié)點
# 創(chuàng)建數(shù)據(jù)目錄
mkdir -p /data/redis/{6379,6380} && chmod 777 -R /data/redis
# 啟動主節(jié)點(6379)
docker run -d \
--name redis-6379 \
--net host \
-v /data/redis/6379:/data \
redis:7-alpine \
redis-server \
--port 6379 \
--cluster-enabled yes \
--cluster-config-file nodes-6379.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
--masterauth "D83544E45CA39C7653BF21612FAD0FD1"
# 啟動從節(jié)點(6380)
docker run -d \
--name redis-6380 \
--net host \
-v /data/redis/6380:/data \
redis:7-alpine \
redis-server \
--port 6380 \
--cluster-enabled yes \
--cluster-config-file nodes-6380.conf \
--cluster-node-timeout 5000 \
--appendonly yes \
--requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
--masterauth "D83544E45CA39C7653BF21612FAD0FD1"
三、創(chuàng)建 Redis 集群(關(guān)鍵步驟)
在任意一臺服務(wù)器(如 server1)執(zhí)行集群創(chuàng)建命令,將 6 個節(jié)點(3 主 3 從)加入集群:
1. 進入 server1 的任意 Redis 容器(如 redis-6379)
bash
docker exec -it redis-6379 sh
2. 執(zhí)行集群創(chuàng)建命令
# 格式:redis-cli --cluster create 節(jié)點1:端口 節(jié)點2:端口 ... --cluster-replicas 1 --password 密碼 redis-cli -a D83544E45CA39C7653BF21612FAD0FD1 \ --cluster create \ 192.168.1.100:6379 \ 192.168.1.101:6379 \ 192.168.1.102:6379 \ 192.168.1.100:6380 \ 192.168.1.101:6380 \ 192.168.1.102:6380 \ --cluster-replicas 1 # 每個主節(jié)點對應(yīng) 1 個從節(jié)點
- 參數(shù)說明:
--cluster-replicas 1表示 “1 個主節(jié)點對應(yīng) 1 個從節(jié)點”,6 個節(jié)點將自動分配為 3 主 3 從。前 3 個節(jié)點默認作為主節(jié)點,后 3 個作為從節(jié)點(自動關(guān)聯(lián)到主節(jié)點)。
3. 確認集群配置
執(zhí)行命令后,會顯示節(jié)點分配方案,輸入 yes 確認:
>>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0-5460 Master[1] -> Slots 5461-10922 Master[2] -> Slots 10923-16383 Adding replica 192.168.1.101:6380 to 192.168.1.100:6379 Adding replica 192.168.1.102:6380 to 192.168.1.101:6379 Adding replica 192.168.1.100:6380 to 192.168.1.102:6379 >>> Trying to optimize slaves allocation for anti-affinity ... Do you want to proceed with the proposed configuration? (type 'yes' to accept): yes
四、驗證集群狀態(tài)
1. 查看集群信息
在任意節(jié)點容器內(nèi)執(zhí)行(需帶密碼):
# 連接集群(-c 表示集群模式) redis-cli -c -h 192.168.1.100 -p 6379 -a D83544E45CA39C7653BF21612FAD0FD1 # 查看集群狀態(tài) cluster info # 查看節(jié)點列表(角色、ID、 slots 等) cluster nodes
- 正常輸出中,
cluster_state:ok表示集群健康; - 節(jié)點列表中,
master標識主節(jié)點,slave標識從節(jié)點,并顯示對應(yīng)主節(jié)點的 ID。
2. 測試數(shù)據(jù)讀寫與分片
# 在集群模式下設(shè)置 key(會自動路由到對應(yīng)主節(jié)點) set test-key "hello redis cluster" # 獲取 key(自動路由) get test-key # 查看 key 所在的槽位和節(jié)點 cluster keyslot test-key
五、高可用測試(主節(jié)點故障轉(zhuǎn)移)
模擬主節(jié)點故障:在 server1 停止主節(jié)點容器(6379):
docker stop redis-6379
觀察從節(jié)點是否自動升級為主節(jié)點:在任意節(jié)點容器內(nèi)執(zhí)行 cluster nodes,查看原 server1:6380(從節(jié)點)是否變?yōu)?nbsp;master。
恢復(fù)故障節(jié)點:重啟 server1 的 6379 容器,它會自動作為從節(jié)點加入集群:
docker start redis-6379
六、關(guān)鍵配置說明
--net host的作用:使用主機網(wǎng)絡(luò)模式,避免 Docker 端口映射的復(fù)雜配置,使 Redis 節(jié)點直接通過服務(wù)器 IP + 端口通信(集群必須)。- 密碼一致性:所有節(jié)點的
requirepass(訪問密碼)和masterauth(主從同步密碼)必須相同,否則從節(jié)點無法同步主節(jié)點數(shù)據(jù)。 - 持久化:通過
-v /data/redis/6379:/data掛載數(shù)據(jù)目錄,確保 Redis 數(shù)據(jù)持久化(重啟容器不丟失數(shù)據(jù))。 - 集群總線端口:必須開放
端口 + 10000(如 6379 對應(yīng) 16379),用于節(jié)點間的心跳檢測和數(shù)據(jù)同步。
七、常見問題解決
- 集群創(chuàng)建失敗:檢查所有節(jié)點是否啟動、端口是否開放、服務(wù)器間是否互通,以及密碼是否一致。
- 從節(jié)點無法同步主節(jié)點:確認
masterauth與主節(jié)點requirepass一致,且主節(jié)點防火墻未攔截從節(jié)點的同步請求。 - 節(jié)點重啟后脫離集群:確保數(shù)據(jù)目錄掛載正確(
/data/redis/端口),集群配置文件(nodes-端口.conf)會保存在掛載目錄,重啟后自動加載。
通過以上步驟,可在三臺服務(wù)器上部署一個高可用的 Redis 集群,實現(xiàn)數(shù)據(jù)分片存儲和自動故障轉(zhuǎn)移,適合生產(chǎn)環(huán)境使用。
到此這篇關(guān)于Docker + Redis 部署集群的實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Docker Redis 部署集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis報錯:Could not create server TCP 
這篇文章主要介紹了Redis報錯:Could not create server TCP listening socket 127.0.0.1:6379: bind:解決方法,是安裝與啟動Redis過程中比較常見的問題,需要的朋友可以參考下2023-06-06
批量導(dǎo)入txt數(shù)據(jù)到的redis過程
用戶通過將Redis命令逐行寫入txt文件,利用管道模式運行客戶端,成功執(zhí)行批量刪除以"Product*"匹配的Key操作,提高了數(shù)據(jù)清理效率2025-08-08

