Docker 搭建Redis Cluster

  1. 创建 Docker 网络

为 Redis 集群创建专用网络,确保容器间通信:

docker network create redis-cluster-net
  1. 编写 docker-compose.yml 文件

创建文件 docker-compose.yml,定义 6 个 Redis 节点(3 主 + 3 从):

version: '3.8'

services:
  redis-node-1:
    image: redis:7.0.12
    container_name: redis-node-1
    ports:
      - "6379:6379"        # 客户端端口
      - "16379:16379"      # 集群总线端口
    volumes:
      - ./data/redis-node-1:/data
      - ./conf/redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-node-2:
    image: redis:7.0.12
    container_name: redis-node-2
    ports:
      - "6380:6379"
      - "16380:16379"
    volumes:
      - ./data/redis-node-2:/data
      - ./conf/redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-node-3:
    image: redis:7.0.12
    container_name: redis-node-3
    ports:
      - "6381:6379"
      - "16381:16379"
    volumes:
      - ./data/redis-node-3:/data
      - ./conf/redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-node-4:
    image: redis:7.0.12
    container_name: redis-node-4
    ports:
      - "6382:6379"
      - "16382:16379"
    volumes:
      - ./data/redis-node-4:/data
      - ./conf/redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-node-5:
    image: redis:7.0.12
    container_name: redis-node-5
    ports:
      - "6383:6379"
      - "16383:16379"
    volumes:
      - ./data/redis-node-5:/data
      - ./conf/redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-node-6:
    image: redis:7.0.12
    container_name: redis-node-6
    ports:
      - "6384:6379"
      - "16384:16379"
    volumes:
      - ./data/redis-node-6:/data
      - ./conf/redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

networks:
  redis-cluster-net:
    external: true
  1. 配置 Redis 集群参数

创建配置文件 conf/redis.conf,启用集群模式:



port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
dir /data
  1. 启动容器

创建目录

mkdir -p
{conf,data/redis-node-1,data/redis-node-2,data/redis-node-3,data/redis-node-4,data/redis-node-5,data/redis-node-6}

启动所有容器

docker-compose up -d
  1. 初始化 Redis 集群

进入任意容器执行集群初始化命令:

进入 redis-node-1 容器
docker exec -it redis-node-1 bash

执行集群初始化命令(主从自动分配)

redis-cli --cluster create \
redis-node-1:6379 \
redis-node-2:6379 \
redis-node-3:6379 \
redis-node-4:6379 \
redis-node-5:6379 \
redis-node-6:6379 \
--cluster-replicas 1
--cluster-replicas 1

表示每个主节点分配 1 个从节点。 根据提示输入 yes 确认哈希槽分配。

  1. 验证集群状态

# 连接到任意节点

redis-cli -c -h redis-node-1 -p 6379

# 查看集群信息

127.0.0.1:6379> CLUSTER INFO

# 查看节点列表

127.0.0.1:6379> CLUSTER NODES
  1. 测试数据分片与高可用

# 写入数据(自动路由到对应节点)

127.0.0.1:6379> SET key1 value1

# 模拟主节点故障(观察从节点是否晋升)

docker stop redis-node-1

# 再次查询数据(应自动切换到新主节点)

127.0.0.1:6379> GET key1

results matching ""

    No results matching ""