2. 环境准备:Docker Compose 搭建 3 节点 Redis 集群(1 主 2 从)
在开始主从同步与故障切换验证之前,需要先搭建一个标准的 Redis 主从复制环境。本节使用 Docker Compose 快速部署 1 个主节点和 2 个从节点,为后续的冒烟测试提供稳定、可复现的基础设施。
2.1 架构概览
3 节点集群采用星型拓扑:主节点负责处理写入请求,两个从节点实时同步主节点数据,并在主节点故障时承担读流量或触发切换。整体架构如下图所示:
架构要点:主节点(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 启动与验证步骤
- 启动集群:在
redis-lab/目录下执行docker-compose up -d,等待三个容器全部启动。 - 检查容器状态:使用
docker-compose ps确认三个服务均为Up状态。 - 验证主从复制:
- 连接主节点:
redis-cli -p 6379,执行INFO replication查看角色和从节点列表。 - 连接从节点:
redis-cli -p 6380,执行INFO replication确认role:slave且master_link_status:up。
- 连接主节点:
- 数据同步测试:在主节点写入一个 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 清理卷数据,确保环境从干净状态开始,避免残留数据干扰测试结果。