Docker + Redis 部署集群的實(shí)現(xiàn)步驟
一、環(huán)境準(zhǔn)備
1. 服務(wù)器規(guī)劃(3 臺(tái)服務(wù)器)
| 服務(wù)器 | IP 地址 | 角色 | 運(yùn)行 Redis 節(jié)點(diǎn) | 開(kāi)放端口(防火墻) |
|---|---|---|---|---|
| server1 | 192.168.1.100 | 主節(jié)點(diǎn) 1 + 從節(jié)點(diǎn) 1 | redis-6379(主)、redis-6380(從) | 6379-6380(Redis 端口)、16379-16380(集群總線端口) |
| server2 | 192.168.1.101 | 主節(jié)點(diǎn) 2 + 從節(jié)點(diǎn) 2 | redis-6379(主)、redis-6380(從) | 同上 |
| server3 | 192.168.1.102 | 主節(jié)點(diǎn) 3 + 從節(jié)點(diǎn) 3 | redis-6379(主)、redis-6380(從) | 同上 |
- 端口說(shuō)明:Redis 集群需開(kāi)放 服務(wù)端口(如 6379)和 集群總線端口(服務(wù)端口 + 10000,如 16379),總線端口用于節(jié)點(diǎn)間通信。
2. 防火墻配置(三臺(tái)服務(wù)器均執(zhí)行)
# 開(kāi)放 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 并配置跨主機(jī)通信
三臺(tái)服務(wù)器均需安裝 Docker,并確保彼此網(wǎng)絡(luò)互通(可 ping 通對(duì)方 IP)。無(wú)需額外創(chuàng)建 Docker 網(wǎng)絡(luò),直接通過(guò) 主機(jī) IP + 端口 實(shí)現(xiàn)跨服務(wù)器節(jié)點(diǎn)通信。
二、部署 Redis 節(jié)點(diǎn)(每臺(tái)服務(wù)器部署 2 個(gè)節(jié)點(diǎn))
1. 在 server1(192.168.1.100)部署節(jié)點(diǎn)
# 創(chuàng)建數(shù)據(jù)目錄(持久化用)
mkdir -p /data/redis/{6379,6380} && chmod 777 -R /data/redis
# 啟動(dòng)主節(jié)點(diǎn)(6379)
docker run -d \
--name redis-6379 \
--net host \ # 使用主機(jī)網(wǎng)絡(luò),避免端口映射問(wèn)題(推薦集群模式)
-v /data/redis/6379:/data \
redis:7-alpine \
redis-server \
--port 6379 \
--cluster-enabled yes \ # 開(kāi)啟集群模式
--cluster-config-file nodes-6379.conf \ # 集群配置文件
--cluster-node-timeout 5000 \ # 節(jié)點(diǎn)超時(shí)時(shí)間(毫秒)
--appendonly yes \ # 開(kāi)啟 AOF 持久化
--requirepass "D83544E45CA39C7653BF21612FAD0FD1" \ # 密碼(所有節(jié)點(diǎn)必須一致)
--masterauth "D83544E45CA39C7653BF21612FAD0FD1" # 主從同步密碼(與 requirepass 一致)
# 啟動(dòng)從節(jié)點(diǎn)(6380,后續(xù)會(huì)被分配到其他主節(jié)點(diǎn))
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é)點(diǎn)
# 創(chuàng)建數(shù)據(jù)目錄
mkdir -p /data/redis/{6379,6380} && chmod 777 -R /data/redis
# 啟動(dòng)主節(jié)點(diǎn)(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"
# 啟動(dòng)從節(jié)點(diǎn)(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é)點(diǎn)
# 創(chuàng)建數(shù)據(jù)目錄
mkdir -p /data/redis/{6379,6380} && chmod 777 -R /data/redis
# 啟動(dòng)主節(jié)點(diǎn)(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"
# 啟動(dòng)從節(jié)點(diǎn)(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)鍵步驟)
在任意一臺(tái)服務(wù)器(如 server1)執(zhí)行集群創(chuàng)建命令,將 6 個(gè)節(jié)點(diǎn)(3 主 3 從)加入集群:
1. 進(jìn)入 server1 的任意 Redis 容器(如 redis-6379)
bash
docker exec -it redis-6379 sh
2. 執(zhí)行集群創(chuàng)建命令
# 格式:redis-cli --cluster create 節(jié)點(diǎn)1:端口 節(jié)點(diǎn)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 # 每個(gè)主節(jié)點(diǎn)對(duì)應(yīng) 1 個(gè)從節(jié)點(diǎn)
- 參數(shù)說(shuō)明:
--cluster-replicas 1表示 “1 個(gè)主節(jié)點(diǎn)對(duì)應(yīng) 1 個(gè)從節(jié)點(diǎn)”,6 個(gè)節(jié)點(diǎn)將自動(dòng)分配為 3 主 3 從。前 3 個(gè)節(jié)點(diǎn)默認(rèn)作為主節(jié)點(diǎn),后 3 個(gè)作為從節(jié)點(diǎn)(自動(dòng)關(guān)聯(lián)到主節(jié)點(diǎn))。
3. 確認(rèn)集群配置
執(zhí)行命令后,會(huì)顯示節(jié)點(diǎn)分配方案,輸入 yes 確認(rèn):
>>> 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
四、驗(yàn)證集群狀態(tài)
1. 查看集群信息
在任意節(jié)點(diǎn)容器內(nèi)執(zhí)行(需帶密碼):
# 連接集群(-c 表示集群模式) redis-cli -c -h 192.168.1.100 -p 6379 -a D83544E45CA39C7653BF21612FAD0FD1 # 查看集群狀態(tài) cluster info # 查看節(jié)點(diǎn)列表(角色、ID、 slots 等) cluster nodes
- 正常輸出中,
cluster_state:ok表示集群健康; - 節(jié)點(diǎn)列表中,
master標(biāo)識(shí)主節(jié)點(diǎn),slave標(biāo)識(shí)從節(jié)點(diǎn),并顯示對(duì)應(yīng)主節(jié)點(diǎn)的 ID。
2. 測(cè)試數(shù)據(jù)讀寫(xiě)與分片
# 在集群模式下設(shè)置 key(會(huì)自動(dòng)路由到對(duì)應(yīng)主節(jié)點(diǎn)) set test-key "hello redis cluster" # 獲取 key(自動(dòng)路由) get test-key # 查看 key 所在的槽位和節(jié)點(diǎn) cluster keyslot test-key
五、高可用測(cè)試(主節(jié)點(diǎn)故障轉(zhuǎn)移)
模擬主節(jié)點(diǎn)故障:在 server1 停止主節(jié)點(diǎn)容器(6379):
docker stop redis-6379
觀察從節(jié)點(diǎn)是否自動(dòng)升級(jí)為主節(jié)點(diǎn):在任意節(jié)點(diǎn)容器內(nèi)執(zhí)行 cluster nodes,查看原 server1:6380(從節(jié)點(diǎn))是否變?yōu)?nbsp;master。
恢復(fù)故障節(jié)點(diǎn):重啟 server1 的 6379 容器,它會(huì)自動(dòng)作為從節(jié)點(diǎn)加入集群:
docker start redis-6379
六、關(guān)鍵配置說(shuō)明
--net host的作用:使用主機(jī)網(wǎng)絡(luò)模式,避免 Docker 端口映射的復(fù)雜配置,使 Redis 節(jié)點(diǎn)直接通過(guò)服務(wù)器 IP + 端口通信(集群必須)。- 密碼一致性:所有節(jié)點(diǎn)的
requirepass(訪問(wèn)密碼)和masterauth(主從同步密碼)必須相同,否則從節(jié)點(diǎn)無(wú)法同步主節(jié)點(diǎn)數(shù)據(jù)。 - 持久化:通過(guò)
-v /data/redis/6379:/data掛載數(shù)據(jù)目錄,確保 Redis 數(shù)據(jù)持久化(重啟容器不丟失數(shù)據(jù))。 - 集群總線端口:必須開(kāi)放
端口 + 10000(如 6379 對(duì)應(yīng) 16379),用于節(jié)點(diǎn)間的心跳檢測(cè)和數(shù)據(jù)同步。
七、常見(jiàn)問(wèn)題解決
- 集群創(chuàng)建失敗:檢查所有節(jié)點(diǎn)是否啟動(dòng)、端口是否開(kāi)放、服務(wù)器間是否互通,以及密碼是否一致。
- 從節(jié)點(diǎn)無(wú)法同步主節(jié)點(diǎn):確認(rèn)
masterauth與主節(jié)點(diǎn)requirepass一致,且主節(jié)點(diǎn)防火墻未攔截從節(jié)點(diǎn)的同步請(qǐng)求。 - 節(jié)點(diǎn)重啟后脫離集群:確保數(shù)據(jù)目錄掛載正確(
/data/redis/端口),集群配置文件(nodes-端口.conf)會(huì)保存在掛載目錄,重啟后自動(dòng)加載。
通過(guò)以上步驟,可在三臺(tái)服務(wù)器上部署一個(gè)高可用的 Redis 集群,實(shí)現(xiàn)數(shù)據(jù)分片存儲(chǔ)和自動(dòng)故障轉(zhuǎn)移,適合生產(chǎn)環(huán)境使用。
到此這篇關(guān)于Docker + Redis 部署集群的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Docker Redis 部署集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過(guò)Redisson監(jiān)聽(tīng)Redis集群的Key過(guò)期事件的實(shí)現(xiàn)指南
在分布式系統(tǒng)中,監(jiān)聽(tīng) Redis 鍵過(guò)期事件是實(shí)現(xiàn)緩存失效、訂單超時(shí)取消等功能的常用方案,本文將詳細(xì)介紹如何通過(guò) Redisson 高效監(jiān)聽(tīng) Redis 集群的 Key 過(guò)期事件,需要的朋友可以參考下2025-11-11
Redis過(guò)期監(jiān)聽(tīng)機(jī)制,訂單超時(shí)自動(dòng)取消方式
這篇文章主要介紹了Redis過(guò)期監(jiān)聽(tīng)機(jī)制,訂單超時(shí)自動(dòng)取消方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Caffeine結(jié)合Redis空值緩存實(shí)現(xiàn)多級(jí)緩存
本文介紹了SpringBoot整合Caffeine本地緩存+Redis分布式緩存+空值緩存的三級(jí)緩存方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-01-01
Redis超詳細(xì)講解高可用主從復(fù)制基礎(chǔ)與哨兵模式方案
Redis因?yàn)槠涓咝阅芎鸵子眯栽谖覀兒蠖说姆?wù)中發(fā)揮了巨大的作用,并且很多重要功能的實(shí)現(xiàn)都會(huì)依賴redis,本篇我們來(lái)了解Redis高可用主從復(fù)制與哨兵模式2022-04-04
Redis遍歷海量數(shù)據(jù)集的幾種實(shí)現(xiàn)方法
Redis作為一個(gè)高性能的鍵值存儲(chǔ)數(shù)據(jù)庫(kù),廣泛應(yīng)用于各種場(chǎng)景,包括緩存、消息隊(duì)列、排行榜,本文主要介紹了Redis遍歷海量數(shù)據(jù)集的幾種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
基于Redis的ZSET實(shí)現(xiàn)用戶邀請(qǐng)排行榜
本文主要介紹了在項(xiàng)目中實(shí)現(xiàn)用戶邀請(qǐng)功能并基于積分進(jìn)行排名的解決方案,使用了Redis的ZSET數(shù)據(jù)結(jié)構(gòu)和Redisson的RLock進(jìn)行加鎖以避免并發(fā)問(wèn)題,感興趣的可以了解一下2025-11-11

