Docker-compose部署redis-cluster集群

一、核心配置解析(先理解关键参数)

1. Redis 配置文件(redis1.conf/redis2.conf...)核心参数
参数 作用
port 7001 Redis 节点的服务端口(6 个节点对应 7001-7006)
protected-mode no 关闭保护模式(允许跨机器访问,集群部署必须关闭)
cluster-enabled yes 开启集群模式(Redis Cluster 核心开关)
cluster-config-file nodes.conf 集群节点信息文件(自动生成,无需手动修改)
cluster-node-timeout 5000 集群节点超时时间(5 秒,超时则判定节点不可用)
cluster-announce-ip 172.13.3.160 集群对外公告的 IP(必须是宿主机可访问的 IP,容器内 IP 不行)
cluster-announce-port 7001 集群对外公告的服务端口(和 port 一致)
cluster-announce-bus-port 17001 集群节点间通信的总线端口(服务端口 + 10000)
appendonly yes 开启 AOF 持久化(防止集群重启数据丢失)
2. docker-compose.yml 核心配置
  • &redis-image:YAML 锚点语法,复用 redis:5.0.7 镜像,避免重复写;
  • volumes:挂载本地配置文件到容器内(./redis1.conf:/home/redis/cluster/redis.conf)、挂载数据目录(./7001/data:/data),保证配置生效和数据持久化;
  • ports:映射端口(服务端口 + 总线端口),必须全部开放,否则集群节点无法通信。

二、完整部署步骤(适配通用 Linux 环境,如 CentOS/Ubuntu)

步骤 1:环境准备
  1. 检查 Docker 和 Docker Compose 是否安装: bash

    运行

    复制代码
    # 检查Docker
    docker -v
    # 检查Docker Compose
    docker-compose -v
    # 若未安装,先安装(以CentOS为例)
    yum install -y docker docker-compose
    systemctl start docker && systemctl enable docker
  2. 替换配置中的宿主机 IP:将所有 redis*.conf 和集群创建命令中的 172.13.3.160 替换为你的宿主机实际 IP (可通过 ifconfig/ip addr 查看)。

  3. 关闭防火墙 / 开放端口(二选一,推荐开放端口更安全): bash

    运行

    复制代码
    # 方式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:创建目录和配置文件
  1. 创建项目目录(统一管理文件): bash

    运行

    复制代码
    mkdir -p redis-cluster/{7001,7002,7003,7004,7005,7006}/data
    cd redis-cluster
  2. 生成 6 个 Redis 配置文件(以 redis1.conf 为例,其他仅改端口): bash

    运行

    复制代码
    # 创建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
  3. 创建 docker-compose.yml 文件: yaml

    复制代码
    # 注意:新版本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
        # 可选:添加网络模式,避免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"

    ✨ 关键优化:添加 network_mode: "host",让容器使用宿主机网络,避免容器内 IP 和宿主机 IP 不一致导致集群通信失败。

步骤 3:启动容器

bash

运行

复制代码
# 启动并后台运行容器
docker-compose up -d

# 检查容器状态(6个容器都应是Up状态)
docker-compose ps
# 或
docker ps | grep redis
步骤 4:初始化 Redis Cluster 集群
  1. 进入任意一个 Redis 容器(比如 redis1): bash

    运行

    复制代码
    docker exec -it redis1 /bin/bash
  2. 执行集群创建命令(替换为你的宿主机 IP): bash

    运行

    复制代码
    redis-cli --cluster create 你的宿主机IP:7001 你的宿主机IP:7002 你的宿主机IP:7003 你的宿主机IP:7004 你的宿主机IP:7005 你的宿主机IP:7006 --cluster-replicas 1
    • --cluster-replicas 1:表示每个主节点对应 1 个从节点,最终形成 3 主 3 从的集群;
    • 执行后会提示集群规划,输入 yes 确认即可。
步骤 5:验证集群是否正常
  1. 连接集群(-c 表示开启集群模式,自动重定向): bash

    运行

    复制代码
    redis-cli -c -p 7001
  2. 查看集群节点信息: redis

    复制代码
    127.0.0.1:7001> cluster nodes
    # 输出会显示6个节点,标注主(master)/从(slave)、槽位分配等信息
  3. 测试数据读写(验证集群分片): redis

    复制代码
    127.0.0.1:7001> set name test
    OK
    127.0.0.1:7001> get name
    "test"
    # 切换节点测试(比如7002)
    127.0.0.1:7001> exit
    redis-cli -c -p 7002
    127.0.0.1:7002> get name
    # 会自动重定向到存储该key的节点并返回结果

三、常用运维命令

bash

运行

复制代码
# 停止集群容器
docker-compose stop

# 启动集群容器
docker-compose start

# 彻底删除集群(含数据,谨慎使用)
docker-compose down
rm -rf 700*/data/*  # 删除持久化数据

# 查看集群状态
docker exec -it redis1 redis-cli -c -p 7001 cluster info

四、常见问题及解决方法

  1. 集群创建失败:Could not connect to xxx:7001

    • 原因:端口未开放、宿主机 IP 配置错误、容器网络模式问题;
    • 解决:检查防火墙 / 端口、确认 cluster-announce-ip 是宿主机 IP、添加 network_mode: "host"
  2. 容器启动后日志报错:Cluster state changed: fail

    • 原因:节点间总线端口(17001-17006)未开放;
    • 解决:开放 17001-17006 端口,重启容器。
  3. 数据写入后重启容器丢失

    • 原因:数据目录未挂载或权限问题;

    • 解决:检查 volumes 挂载路径是否正确,给本地数据目录赋权:

      bash

      运行

      复制代码
      chmod 777 -R 700*/data

总结

  1. 部署核心:替换宿主机 IP + 开放所有端口(7001-7006、17001-17006) + 初始化集群命令
  2. 关键配置:cluster-announce-ip 必须是宿主机 IP,protected-mode no 关闭保护模式;
  3. 避坑点:添加 network_mode: host 避免容器网络隔离导致的通信失败,开启 AOF 持久化防止数据丢失。
相关推荐
蜂蜜黄油呀土豆25 天前
深入理解 Redis 集群架构:主从同步、哨兵机制与 Cluster 原理
redis·集群·cap·主从复制·哨兵机制·redis cluster
小满、2 个月前
Redis:安装、主从复制、Sentinel 哨兵、Cluster 集群
数据库·redis·redis cluster·redis sentinel·redis 主从复制
超人也会哭️呀6 个月前
Redis(九):Redis高并发高可用(集群Cluster)
数据库·redis·wpf·redis cluster·redis 集群·redis 集群搭建
一个处女座的程序媛1 年前
详解Redis 高可用的方式 Redis Cluster
redis·高可用·redis cluster
陈建1112 年前
Redis核心技术与实战【学习笔记】 - 27.限制Redis Cluster规模的因素(通信开销)
redis·redis cluster·cluster限制因素
QIFU2 年前
Redis Cluster (Redis 集群),使用Redis自带的集群功能搭建无主模式集群
数据库·redis·缓存·redis集群·redis cluster