Redis Cluster(3主3从)完整部署文档
一、环境说明
-
服务器A:192.168.0.4(部署节点1、2、3)
-
服务器B:192.168.0.7(部署节点4、5、6)
-
节点规划:
服务器 节点ID 角色 服务端口 总线端口 容器名 192.168.0.4 node1 主节点 6379 16379 redis-node1-4 192.168.0.4 node2 主节点 6380 16380 redis-node2-4 192.168.0.4 node3 从节点 6381 16381 redis-node3-4 192.168.0.7 node4 主节点 6379 16379 redis-node4-7 192.168.0.7 node5 从节点 6380 16380 redis-node5-7 192.168.0.7 node6 从节点 6381 16381 redis-node6-7
二、服务器A(192.168.0.4)配置
1. 创建目录结构
bash
mkdir -p /data/redis-cluster/{node1,node2,node3}
cd /data/redis-cluster
2. 编写Redis配置文件
node1/redis.conf(主节点):
conf
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"
# Cluster配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.4
cluster-announce-port 6379
cluster-announce-bus-port 16379
# 持久化
appendonly yes
appendfsync everysec
node2/redis.conf(主节点):
conf
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.4
cluster-announce-port 6380
cluster-announce-bus-port 16380
appendonly yes
appendfsync everysec
node3/redis.conf(从节点):
conf
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.4
cluster-announce-port 6381
cluster-announce-bus-port 16381
appendonly yes
appendfsync everysec
3. 编写docker-compose.yml
yaml
version: '3.8'
services:
# 节点1(主)
redis-node1:
image: redis:7.2-alpine
container_name: redis-node1-4
restart: always
ports:
- "6379:6379"
- "16379:16379"
volumes:
- ./node1/data:/data
- ./node1/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
- redis-net
sysctls:
- net.core.somaxconn=1024
# 节点2(主)
redis-node2:
image: redis:7.2-alpine
container_name: redis-node2-4
restart: always
ports:
- "6380:6379"
- "16380:16379"
volumes:
- ./node2/data:/data
- ./node2/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
- redis-net
depends_on:
- redis-node1
# 节点3(从)
redis-node3:
image: redis:7.2-alpine
container_name: redis-node3-4
restart: always
ports:
- "6381:6379"
- "16381:16379"
volumes:
- ./node3/data:/data
- ./node3/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
- redis-net
depends_on:
- redis-node2
networks:
redis-net:
driver: bridge
4. 启动节点
bash
docker-compose up -d
三、服务器B(192.168.0.7)配置
1. 创建目录结构
bash
mkdir -p /data/redis-cluster/{node4,node5,node6}
cd /data/redis-cluster
2. 编写Redis配置文件
node4/redis.conf(主节点):
conf
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.7
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
appendfsync everysec
node5/redis.conf(从节点):
conf
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.7
cluster-announce-port 6380
cluster-announce-bus-port 16380
appendonly yes
appendfsync everysec
node6/redis.conf(从节点):
conf
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.7
cluster-announce-port 6381
cluster-announce-bus-port 16381
appendonly yes
appendfsync everysec
3. 编写docker-compose.yml
yaml
version: '3.8'
services:
# 节点4(主)
redis-node4:
image: redis:7.2-alpine
container_name: redis-node4-7
restart: always
ports:
- "6379:6379"
- "16379:16379"
volumes:
- ./node4/data:/data
- ./node4/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
- redis-net
sysctls:
- net.core.somaxconn=1024
# 节点5(从)
redis-node5:
image: redis:7.2-alpine
container_name: redis-node5-7
restart: always
ports:
- "6380:6379"
- "16380:16379"
volumes:
- ./node5/data:/data
- ./node5/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
- redis-net
depends_on:
- redis-node4
# 节点6(从)
redis-node6:
image: redis:7.2-alpine
container_name: redis-node6-7
restart: always
ports:
- "6381:6379"
- "16381:16379"
volumes:
- ./node6/data:/data
- ./node6/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
- redis-net
depends_on:
- redis-node5
networks:
redis-net:
driver: bridge
4. 启动节点
bash
docker-compose up -d
四、初始化3主3从集群
1. 执行集群创建命令(任意服务器执行)
bash
docker exec -it redis-node1-4 redis-cli -a ZkhwRS321 --cluster create \
192.168.0.4:6379 \
192.168.0.4:6380 \
192.168.0.4:6381 \
192.168.0.7:6379 \
192.168.0.7:6380 \
192.168.0.7:6381 \
--cluster-replicas 1 \
--cluster-yes
2. 命令说明
--cluster-replicas 1:自动为每个主节点分配1个从节点;--cluster-yes:自动确认集群配置;- 执行后Redis会自动分配哈希槽(3主节点各持5461/5461/5462个槽位),并将3个从节点关联到主节点。
五、验证集群状态
1. 检查集群健康
bash
docker exec -it redis-node1-4 redis-cli -a ZkhwRS321 cluster info
输出cluster_state:ok表示集群正常。
2. 查看节点角色
bash
docker exec -it redis-node1-4 redis-cli -a ZkhwRS321 cluster nodes
输出中会显示:
- 3个节点标记为
master(主节点),各持有哈希槽; - 3个节点标记为
slave(从节点),并关联到对应主节点。

当你看到这一步,那么恭喜你,成功建立集群
六、配置Nginx统一入口(8015端口)
1. 服务器A创建Nginx配置
bash
mkdir -p /data/redis-cluster/nginx
nginx/nginx.conf:
nginx
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
# Redis TCP协议代理(移除错误的keepalive指令)
stream {
upstream redis-cluster {
server 192.168.0.4:6379; # 主节点1
server 192.168.0.7:6379; # 主节点2
server 192.168.0.4:6380; # 主节点3
}
server {
listen 18888;
proxy_pass redis-cluster;
proxy_timeout 30s;
proxy_connect_timeout 5s;
}
}
# 关闭HTTP服务
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
return 403 "Forbidden";
}
}
2. 修改docker-compose.yml添加Nginx服务
yaml
services:
# 新增Nginx服务
nginx-proxy:
image: nginx:latest
container_name: redis-nginx-4
restart: always
ports:
- "8115:18888"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
networks:
- redis-net
3. 启动Nginx
bash
docker-compose up -d

七、故障测试
1. 模拟主节点故障
bash
docker stop redis-node1-4 # 停止服务器A的主节点
2. 验证自动切换
bash
docker exec -it redis-node2-4 redis-cli -a ZkhwRS321 cluster nodes
查看原从节点是否晋升为主节点。

八、客户端访问示例(Python)
python
from rediscluster import RedisCluster
startup_nodes = [{"host": "192.168.0.4", "port": 8015}]
rc = RedisCluster(
startup_nodes=startup_nodes,
password="ZkhwRS321",
decode_responses=True,
skip_full_coverage_check=True
)
rc.set("test_key", "hello_redis_cluster")
print(rc.get("test_key"))
注意事项
- 所有节点密码必须一致(
requirepass/masterauth); - 开放端口:6379-6381、16379-16381、8015;
- 生产环境建议增加节点内存限制(
maxmemory 4g)和垃圾回收策略(maxmemory-policy allkeys-lru)。
此文档涵盖从节点配置、集群初始化、高可用验证到业务接入的全流程,可直接落地部署!