docker搭建redis的3主3从集群测试
1、准备工作
使用脚本创建目录结构
shell
#!/bin/bash
# 集群节点通告 IP(客户端连接时使用的 IP)
# 重要:必须设置为节点真实公网 IP 或内网 IP
# 注意:如果使用 Docker,需设置为宿主机 IP 或容器网络 IP
cluster_announce_ip=10.1.62.102
for port in $(seq 6381 6386);
do
conf_dir=./${port}/conf
conf_file=${conf_dir}/redis.conf
log_dir=./${port}/logs
if [ ! -d ${conf_dir} ]; then
mkdir -p ${conf_dir}
fi
if [ ! -d ${log_dir} ]; then
mkdir -p ${log_dir}
fi
if [ -f ${conf_file} ]; then
rm -f ${conf_file}
fi
touch ${conf_file}
cat << EOF > ${conf_file}
bind 0.0.0.0
port ${port}
requirepass 123456
masterauth 123456
dir /data
logfile /logs/nodes-${port}.log
appendonly yes
cluster-enabled yes
cluster-config-file nodes-${port}.conf
cluster-node-timeout 5000
cluster-announce-ip ${cluster_announce_ip}
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
EOF
donedocker-compose.yml
yaml
services:
redis-6381:
image: redis:6.2
container_name: redis-6381
ports:
- 6381:6381
- 16381:16381
volumes:
- ./6381/conf/redis.conf:/etc/redis.conf
- ./6381/data:/data
- ./6381/logs:/logs
command: ["redis-server", "/etc/redis.conf"]
environment:
- TZ=Asia/Shanghai
networks:
redis-cluster:
aliases:
- redis-6381
ipv4_address: 172.19.0.101
redis-6382:
image: redis:6.2
container_name: redis-6382
ports:
- 6382:6382
- 16382:16382
volumes:
- ./6382/conf/redis.conf:/etc/redis.conf
- ./6382/data:/data
- ./6382/logs:/logs
command: ["redis-server", "/etc/redis.conf"]
environment:
- TZ=Asia/Shanghai
networks:
redis-cluster:
aliases:
- redis-6382
ipv4_address: 172.19.0.102
redis-6383:
image: redis:6.2
container_name: redis-6383
ports:
- 6383:6383
- 16383:16383
volumes:
- ./6383/conf/redis.conf:/etc/redis.conf
- ./6383/data:/data
- ./6383/logs:/logs
command: ["redis-server", "/etc/redis.conf"]
environment:
- TZ=Asia/Shanghai
networks:
redis-cluster:
aliases:
- redis-6383
ipv4_address: 172.19.0.103
redis-6384:
image: redis:6.2
container_name: redis-6384
ports:
- 6384:6384
- 16384:16384
volumes:
- ./6384/conf/redis.conf:/etc/redis.conf
- ./6384/data:/data
- ./6384/logs:/logs
command: ["redis-server", "/etc/redis.conf"]
environment:
- TZ=Asia/Shanghai
networks:
redis-cluster:
aliases:
- redis-6384
ipv4_address: 172.19.0.104
redis-6385:
image: redis:6.2
container_name: redis-6385
ports:
- 6385:6385
- 16385:16385
volumes:
- ./6385/conf/redis.conf:/etc/redis.conf
- ./6385/data:/data
- ./6385/logs:/logs
command: ["redis-server", "/etc/redis.conf"]
environment:
- TZ=Asia/Shanghai
networks:
redis-cluster:
aliases:
- redis-6385
ipv4_address: 172.19.0.105
redis-6386:
image: redis:6.2
container_name: redis-6386
ports:
- 6386:6386
- 16386:16386
volumes:
- ./6386/conf/redis.conf:/etc/redis.conf
- ./6386/data:/data
- ./6386/logs:/logs
command: ["redis-server", "/etc/redis.conf"]
environment:
- TZ=Asia/Shanghai
networks:
redis-cluster:
aliases:
- redis-6386
ipv4_address: 172.19.0.106
networks:
redis-cluster:
name: redis-cluster
driver: bridge
ipam:
config:
- subnet: 172.19.0.0/16
gateway: 172.19.0.1redis.conf
# 监听所有网络接口(0.0.0.0 表示接受来自任何 IP 的连接)
# 重要:生产环境建议绑定特定 IP 或使用防火墙限制访问
bind 0.0.0.0
# Redis 服务端口(默认 6379,这里设置为 6381)
port 6381
# 设置 Redis 访问密码(客户端必须提供此密码才能连接)
# 重要:生产环境必须设置强密码,避免使用简单密码
requirepass 123456
# 当主从复制时,从节点连接主节点所需的密码(必须与 requirepass 一致)
# 用于集群中节点间通信的认证
masterauth 123456
# 数据库工作目录(存储持久化文件如 RDB/AOF)
# 重要:确保该目录存在且 Redis 进程有写入权限
dir /data
# 日志文件路径(记录 Redis 运行日志)
# 重要:建议使用绝对路径,确保日志目录存在
logfile /logs/nodes-6381.log
# 启用 AOF 持久化(Append Only File)
# 优点:数据安全性高,可恢复到几乎最新的状态
# 缺点:性能略低于 RDB,文件较大
appendonly yes
# 集群配置文件(自动创建/更新,用于保存集群拓扑信息)
# 重要:必须与 cluster-node-timeout 配合使用
cluster-enabled yes
# 集群节点配置文件(存储集群节点信息)
# 重要:文件名需与当前节点端口匹配(如 6381.conf)
cluster-config-file nodes-6381.conf
# 集群节点超时时间(毫秒)
# 说明:超过此时间未收到节点心跳,视为失效
# 建议值:5000-10000(根据网络环境调整)
cluster-node-timeout 5000
# 集群节点通告 IP(客户端连接时使用的 IP)
# 重要:必须设置为节点真实公网 IP 或内网 IP
# 注意:如果使用 Docker,需设置为宿主机 IP 或容器网络 IP
cluster-announce-ip 10.1.62.102
# 集群节点通告端口(客户端连接时使用的端口)
# 重要:必须与实际服务端口一致(6381)
cluster-announce-port 6381
# 集群节点通告集群总线端口(节点间通信端口)
# 说明:通常为主端口 + 10000(6381 + 10000 = 16381)
# 重要:必须开放此端口(防火墙/安全组)
cluster-announce-bus-port 163812、启动集群工作
shell
# 创建网络
docker network create redis-cluster
# 赋予目录权限
chmod -R 777 挂载目录
# 启动redis
docker-compose up -d
# 进入任意redis容器
docker exec redis-6381 /bin/bash
# 清空所有redis数据
redis-cli -h 172.19.0.101 -p 6381 -a 123456 FLUSHALL && redis-cli -h 172.19.0.101 -p 6381 -a 123456 CLUSTER RESET
redis-cli -h 172.19.0.102 -p 6382 -a 123456 FLUSHALL && redis-cli -h 172.19.0.102 -p 6382 -a 123456 CLUSTER RESET
redis-cli -h 172.19.0.103 -p 6383 -a 123456 FLUSHALL && redis-cli -h 172.19.0.103 -p 6383 -a 123456 CLUSTER RESET
redis-cli -h 172.19.0.104 -p 6384 -a 123456 FLUSHALL && redis-cli -h 172.19.0.104 -p 6384 -a 123456 CLUSTER RESET
redis-cli -h 172.19.0.105 -p 6385 -a 123456 FLUSHALL && redis-cli -h 172.19.0.105 -p 6385 -a 123456 CLUSTER RESET
redis-cli -h 172.19.0.106 -p 6386 -a 123456 FLUSHALL && redis-cli -h 172.19.0.106 -p 6386 -a 123456 CLUSTER RESET
# 创建集群
redis-cli -p 6381 -a 123456 --cluster create 172.19.0.101:6381 172.19.0.102:6382 172.19.0.103:6383 172.19.0.104:6384 172.19.0.105:6385 172.19.0.106:6386 --cluster-replicas 13、测试集群功能
shell
docker exec -it redis-1 redis-cli -c set key1 "key1"
docker exec -it redis-1 redis-cli -c set key2 "key2"
docker exec -it redis-2 redis-cli -c get key1
docker exec -it redis-3 redis-cli -c get key2springboot配置示例
yaml
spring:
redis:
cluster:
nodes:
- 10.1.62.102:6381
- 10.1.62.102:6382
- 10.1.62.102:6383
- 10.1.62.102:6384
- 10.1.62.102:6385
- 10.1.62.102:6386
max-redirects: 3 # 最大重定向次数,在集群中执行命令遇到重定向错误时,最大重试次数
timeout: 5000ms
lettuce:
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
password: 1234564、总结
- 高可用
- 主节点故障时,从节点自动接管
- 服务零中断,业务无感知
- 高性能
- 数据分片到3主节点,并发处理
- 支持读写分离(需客户端配置)
- 高扩展
- 在线扩容,不停机添加节点
- 数据自动重分布,无需人工干预
- 数据安全
- 每个主节点都有完整副本
- 多节点备份,数据不丢失