Skip to content

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
done

docker-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.1

redis.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 16381

2、启动集群工作

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 1

3、测试集群功能

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 key2

springboot配置示例

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: 123456

4、总结

  • 高可用
    • 主节点故障时,从节点自动接管
    • 服务零中断,业务无感知
  • 高性能
    • 数据分片到3主节点,并发处理
    • 支持读写分离(需客户端配置)
  • 高扩展
    • 在线扩容,不停机添加节点
    • 数据自动重分布,无需人工干预
  • 数据安全
    • 每个主节点都有完整副本
    • 多节点备份,数据不丢失
/src/technology/dateblog/2025/10/20251028-docker%E6%90%AD%E5%BB%BAredis%E7%9A%843%E4%B8%BB3%E4%BB%8E%E9%9B%86%E7%BE%A4%E6%B5%8B%E8%AF%95.html