Docker-compose部署redis-cluster集群的完整步驟
一、核心配置解析(先理解關鍵參數(shù))
1. Redis 配置文件(redis1.conf/redis2.conf...)核心參數(shù)
| 參數(shù) | 作用 |
|---|---|
port 7001 | Redis 節(jié)點的服務端口(6 個節(jié)點對應 7001-7006) |
protected-mode no | 關閉保護模式(允許跨機器訪問,集群部署必須關閉) |
cluster-enabled yes | 開啟集群模式(Redis Cluster 核心開關) |
cluster-config-file nodes.conf | 集群節(jié)點信息文件(自動生成,無需手動修改) |
cluster-node-timeout 5000 | 集群節(jié)點超時時間(5 秒,超時則判定節(jié)點不可用) |
cluster-announce-ip 172.13.3.160 | 集群對外公告的 IP(必須是宿主機可訪問的 IP,容器內(nèi) IP 不行) |
cluster-announce-port 7001 | 集群對外公告的服務端口(和 port 一致) |
cluster-announce-bus-port 17001 | 集群節(jié)點間通信的總線端口(服務端口 + 10000) |
appendonly yes | 開啟 AOF 持久化(防止集群重啟數(shù)據(jù)丟失) |
2. docker-compose.yml 核心配置
&redis-image:YAML 錨點語法,復用redis:5.0.7鏡像,避免重復寫;volumes:掛載本地配置文件到容器內(nèi)(./redis1.conf:/home/redis/cluster/redis.conf)、掛載數(shù)據(jù)目錄(./7001/data:/data),保證配置生效和數(shù)據(jù)持久化;ports:映射端口(服務端口 + 總線端口),必須全部開放,否則集群節(jié)點無法通信。
二、完整部署步驟(適配通用 Linux 環(huán)境,如 CentOS/Ubuntu)
步驟 1:環(huán)境準備
檢查 Docker 和 Docker Compose 是否安裝:
# 檢查Docker docker -v # 檢查Docker Compose docker-compose -v # 若未安裝,先安裝(以CentOS為例) yum install -y docker docker-compose systemctl start docker && systemctl enable docker
替換配置中的宿主機 IP:將所有 redis*.conf 和集群創(chuàng)建命令中的 172.13.3.160 替換為你的宿主機實際 IP(可通過 ifconfig/ip addr 查看)。
關閉防火墻 / 開放端口(二選一,推薦開放端口更安全):
# 方式1:臨時關閉防火墻(CentOS) systemctl stop firewalld && systemctl disable firewalld # 方式2:開放所需端口(推薦,CentOS) firewall-cmd --add-port=7001-7006/tcp --permanent firewall-cmd --add-port=17001-17006/tcp --permanent firewall-cmd --reload # Ubuntu 防火墻開放端口 ufw allow 7001-7006/tcp ufw allow 17001-17006/tcp ufw reload
步驟 2:創(chuàng)建目錄和配置文件
創(chuàng)建項目目錄(統(tǒng)一管理文件):
mkdir -p redis-cluster/{7001,7002,7003,7004,7005,7006}/data
cd redis-cluster生成 6 個 Redis 配置文件(以 redis1.conf 為例,其他僅改端口):
# 創(chuàng)建redis1.conf
cat > redis1.conf << EOF
port 7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 你的宿主機IP
cluster-announce-port 7001
cluster-announce-bus-port 17001
appendonly yes
pidfile /var/run/redis_7001.pid
EOF
# 快速生成redis2-redis6.conf(替換端口)
for port in {2..6}; do
cp redis1.conf redis${port}.conf
sed -i "s/7001/700${port}/g" redis${port}.conf
sed -i "s/17001/1700${port}/g" redis${port}.conf
sed -i "s/redis_7001/redis_700${port}/g" redis${port}.conf
done創(chuàng)建 docker-compose.yml 文件:
# 注意:新版本Docker Compose可刪除version字段(避免過時警告)
x-image:
&redis-image
redis:5.0.7
services:
redis1:
image: *redis-image
container_name: redis1
command: ["redis-server", "/home/redis/cluster/redis.conf"]
volumes:
- ./redis1.conf:/home/redis/cluster/redis.conf
- ./7001/data:/data
ports:
- 7001:7001
- 17001:17001
# 可選:添加網(wǎng)絡模式,避免IP問題
network_mode: "host"
redis2:
image: *redis-image
container_name: redis2
command: ["redis-server", "/home/redis/cluster/redis.conf"]
volumes:
- ./redis2.conf:/home/redis/cluster/redis.conf
- ./7002/data:/data
ports:
- 7002:7002
- 17002:17002
network_mode: "host"
redis3:
image: *redis-image
container_name: redis3
command: ["redis-server", "/home/redis/cluster/redis.conf"]
volumes:
- ./redis3.conf:/home/redis/cluster/redis.conf
- ./7003/data:/data
ports:
- 7003:7003
- 17003:17003
network_mode: "host"
redis4:
image: *redis-image
container_name: redis4
command: ["redis-server", "/home/redis/cluster/redis.conf"]
volumes:
- ./redis4.conf:/home/redis/cluster/redis.conf
- ./7004/data:/data
ports:
- 7004:7004
- 17004:17004
network_mode: "host"
redis5:
image: *redis-image
container_name: redis5
command: ["redis-server", "/home/redis/cluster/redis.conf"]
volumes:
- ./redis5.conf:/home/redis/cluster/redis.conf
- ./7005/data:/data
ports:
- 7005:7005
- 17005:17005
network_mode: "host"
redis6:
image: *redis-image
container_name: redis6
command: ["redis-server", "/home/redis/cluster/redis.conf"]
volumes:
- ./redis6.conf:/home/redis/cluster/redis.conf
- ./7006/data:/data
ports:
- 7006:7006
- 17006:17006
network_mode: "host"? 關鍵優(yōu)化:添加 network_mode: "host",讓容器使用宿主機網(wǎng)絡,避免容器內(nèi) IP 和宿主機 IP 不一致導致集群通信失敗。
步驟 3:啟動容器
# 啟動并后臺運行容器 docker-compose up -d # 檢查容器狀態(tài)(6個容器都應是Up狀態(tài)) docker-compose ps # 或 docker ps | grep redis
步驟 4:初始化 Redis Cluster 集群
進入任意一個 Redis 容器(比如 redis1):
docker exec -it redis1 /bin/bash
執(zhí)行集群創(chuàng)建命令(替換為你的宿主機 IP):
redis-cli --cluster create 你的宿主機IP:7001 你的宿主機IP:7002 你的宿主機IP:7003 你的宿主機IP:7004 你的宿主機IP:7005 你的宿主機IP:7006 --cluster-replicas 1
--cluster-replicas 1:表示每個主節(jié)點對應 1 個從節(jié)點,最終形成 3 主 3 從的集群;
執(zhí)行后會提示集群規(guī)劃,輸入 yes 確認即可。
步驟 5:驗證集群是否正常
連接集群(-c 表示開啟集群模式,自動重定向):
redis-cli -c -p 7001
查看集群節(jié)點信息:
redis
127.0.0.1:7001> cluster nodes # 輸出會顯示6個節(jié)點,標注主(master)/從(slave)、槽位分配等信息
測試數(shù)據(jù)讀寫(驗證集群分片):
127.0.0.1:7001> set name test OK 127.0.0.1:7001> get name "test" # 切換節(jié)點測試(比如7002) 127.0.0.1:7001> exit redis-cli -c -p 7002 127.0.0.1:7002> get name # 會自動重定向到存儲該key的節(jié)點并返回結果
三、常用運維命令
# 停止集群容器 docker-compose stop # 啟動集群容器 docker-compose start # 徹底刪除集群(含數(shù)據(jù),謹慎使用) docker-compose down rm -rf 700*/data/* # 刪除持久化數(shù)據(jù) # 查看集群狀態(tài) docker exec -it redis1 redis-cli -c -p 7001 cluster info
四、常見問題及解決方法
- 集群創(chuàng)建失?。篊ould not connect to xxx:7001
- 原因:端口未開放、宿主機 IP 配置錯誤、容器網(wǎng)絡模式問題;
- 解決:檢查防火墻 / 端口、確認
cluster-announce-ip是宿主機 IP、添加network_mode: "host"。
- 容器啟動后日志報錯:Cluster state changed: fail
- 原因:節(jié)點間總線端口(17001-17006)未開放;
- 解決:開放 17001-17006 端口,重啟容器。
- 數(shù)據(jù)寫入后重啟容器丟失
- 原因:數(shù)據(jù)目錄未掛載或權限問題;
- 解決:檢查
volumes掛載路徑是否正確,給本地數(shù)據(jù)目錄賦權:
- 運行
chmod 777 -R 700*/data
總結
- 部署核心:替換宿主機 IP + 開放所有端口(7001-7006、17001-17006) + 初始化集群命令;
- 關鍵配置:
cluster-announce-ip必須是宿主機 IP,protected-mode no關閉保護模式; - 避坑點:添加
network_mode: host避免容器網(wǎng)絡隔離導致的通信失敗,開啟 AOF 持久化防止數(shù)據(jù)丟失。
到此這篇關于Docker-compose部署redis-cluster集群的文章就介紹到這了,更多相關Docker compose redis-cluster集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
docker實現(xiàn)將本地文件復制到docker容器內(nèi)
這篇文章主要介紹了docker實現(xiàn)將本地文件復制到docker容器內(nèi)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
淺談docker學習之docker數(shù)據(jù)卷(volume)
這篇文章主要介紹了淺談docker學習之docker數(shù)據(jù)卷(volume),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12

