2. 环境准备:Docker Compose 搭建 3 节点 Redis 集群(1 主 2 从)

在开始主从同步与故障切换验证之前,需要先搭建一个标准的 Redis 主从复制环境。本节使用 Docker Compose 快速部署 1 个主节点和 2 个从节点,为后续的冒烟测试提供稳定、可复现的基础设施。

2.1 架构概览

3 节点集群采用星型拓扑:主节点负责处理写入请求,两个从节点实时同步主节点数据,并在主节点故障时承担读流量或触发切换。整体架构如下图所示:

Redis 1主2从架构图 Redis 主节点 127.0.0.1:6379 Redis 从节点 1 127.0.0.1:6380 Redis 从节点 2 127.0.0.1:6381 REPLICAOF REPLICAOF 主节点写入,从节点只读同步
架构要点:主节点(Master)提供读写服务,从节点(Replica)通过 REPLICAOF 命令与主节点建立复制关系。默认情况下,从节点仅提供读服务,不会自动提升为主节点,需要借助哨兵或手动切换。

2.2 目录结构与配置文件

在宿主机上创建统一的项目目录,每个 Redis 节点拥有独立的配置文件和持久化目录,便于管理和隔离。

redis-lab/
├── docker-compose.yml
├── master/
│   └── redis.conf
├── replica1/
│   └── redis.conf
└── replica2/
    └── redis.conf

2.3 配置文件详解

主节点配置开启持久化并绑定所有网卡;从节点配置除了指定主节点地址外,还需设置 replica-read-only yes 确保从节点不接收写入。

配置项 主节点 (6379) 从节点 1 (6380) 从节点 2 (6381)
port 6379 6380 6381
bind 0.0.0.0 0.0.0.0 0.0.0.0
appendonly yes yes yes
replicaof 无 master 6379 master 6379
replica-read-only 无 yes yes

主节点配置文件 master/redis.conf

port 6379
bind 0.0.0.0
appendonly yes
appendfilename "appendonly.aof"
dir /data

从节点配置文件 replica1/redis.conf

port 6380
bind 0.0.0.0
appendonly yes
appendfilename "appendonly.aof"
dir /data
replicaof master 6379
replica-read-only yes

从节点配置文件 replica2/redis.conf

port 6381
bind 0.0.0.0
appendonly yes
appendfilename "appendonly.aof"
dir /data
replicaof master 6379
replica-read-only yes

2.4 Docker Compose 编排文件

使用 Docker Compose 定义三个服务,分别映射宿主机端口,并将配置文件与数据目录挂载到容器内。网络模式使用默认的 bridge,容器之间通过服务名互相访问。

version: '3.8'
services:
  master:
    image: redis:7.2
    container_name: redis-master
    ports:
      - "6379:6379"
    volumes:
      - ./master/redis.conf:/usr/local/etc/redis/redis.conf
      - ./master/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

  replica1:
    image: redis:7.2
    container_name: redis-replica1
    ports:
      - "6380:6379"
    volumes:
      - ./replica1/redis.conf:/usr/local/etc/redis/redis.conf
      - ./replica1/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    depends_on:
      - master

  replica2:
    image: redis:7.2
    container_name: redis-replica2
    ports:
      - "6381:6379"
    volumes:
      - ./replica2/redis.conf:/usr/local/etc/redis/redis.conf
      - ./replica2/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    depends_on:
      - master
端口映射说明:容器内部 Redis 默认端口均为 6379,通过宿主机端口 6379/6380/6381 映射到不同容器,实现本地多实例访问。从节点配置中的 replicaof master 6379 使用的是 Docker 内部服务名,无需关心宿主机端口。

2.5 启动与验证步骤

  1. 启动集群:在 redis-lab/ 目录下执行 docker-compose up -d,等待三个容器全部启动。
  2. 检查容器状态:使用 docker-compose ps 确认三个服务均为 Up 状态。
  3. 验证主从复制:
    • 连接主节点:redis-cli -p 6379,执行 INFO replication 查看角色和从节点列表。
    • 连接从节点:redis-cli -p 6380,执行 INFO replication 确认 role:slave 且 master_link_status:up。
  4. 数据同步测试:在主节点写入一个 key,在从节点读取验证。

2.6 主从复制状态验证

执行 INFO replication 命令后,主节点输出示例:

# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.3,port=6379,state=online,offset=140,lag=0
slave1:ip=172.18.0.4,port=6379,state=online,offset=140,lag=0
master_replid:3a8c9e1b2f4d5a6b7c8d9e0f1a2b3c4d5e6f7a8b
master_repl_offset:140

从节点输出示例:

# Replication
role:slave
master_host:master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:140
关键指标:master_link_status:up 表示复制链路正常;offset 值在主从一致时说明数据完全同步;lag 表示从节点与主节点的延迟秒数,通常为 0 或 1。

2.7 常见问题与排查

现象 可能原因 解决措施
从节点 master_link_status:down 主节点未启动或网络不通 检查主节点容器状态,确认 docker-compose logs master
从节点无法连接主节点 replicaof 配置中主机名错误 确认 Docker 服务名与 docker-compose.yml 一致
数据不同步 主节点未开启持久化或从节点重启后全量同步失败 检查 appendonly yes 配置,重启从节点触发重新同步
端口冲突 宿主机端口已被占用 修改 docker-compose.yml 中宿主机映射端口

2.8 环境清理与重置

实验结束后,使用以下命令停止并删除容器,同时清理持久化数据:

# 停止并删除容器
docker-compose down

# 删除持久化数据目录(谨慎操作)
rm -rf master/data replica1/data replica2/data
建议:每次进行故障切换实验前,先执行 docker-compose down -v 清理卷数据,确保环境从干净状态开始,避免残留数据干扰测试结果。
Docker Compose 启动与验证流程 1. 启动集群 docker-compose up -d 2. 检查状态 docker-compose ps 3. 验证复制 INFO replication 4a. 主节点写入 SET key value 4b. 从节点读取 GET key 验证通过:从节点能读取到主节点写入的数据