Redis学习笔记:主从集群搭建实战,从零掌握读写分离与数据同步

什么是主从复制?

主从复制(Master-Slave Replication)是 Redis 高可用的基石。一个主库(Master)负责写入,多个从库(Replica)实时同步主库数据并提供读服务。

主要作用:

  • 读写分离:主库写,从库读,分摊读压力
  • 数据热备份:从库拥有主库的完整副本,主库宕机时数据不丢
  • 高可用基础:配合哨兵(Sentinel)可实现自动故障转移

环境准备

  • 操作系统:WSL2(Windows Subsystem for Linux)
  • 容器环境:Docker + Docker Compose

目录结构与配置文件

准备挂载的数据卷

mkdir -p redis-master-slave/{config,data/master,data/replica1,data/replica2}
cd redis-master-slave

主库配置(config/master.conf)

# 允许所有IP连接(Docker容器间通信必须)
bind 0.0.0.0
# 监听端口
port 6379
# 开启AOF持久化(便于观察数据落地)
appendonly yes
# 规定日志级别,方便查错
loglevel notice
# 设定密码(为了安全,但主从都必须配一致;这里先留空方便入门)
# requirepass 123456
# 数据库数量保持默认
databases 16

从库1配置(config/replica1.conf)

bind 0.0.0.0
port 6380
appendonly yes
loglevel notice

# ****** 核心主从指令 ******
# 声明我跟随谁(注意:这里填的是Docker Compose里的服务名 "master",而不是IP!)
replicaof master 6379

# 如果主库有密码,需开启下面这行(目前没设密码,注释掉)
# masterauth 123456

从库2配置(config/replica2.conf)

bind 0.0.0.0
port 6381
appendonly yes
loglevel notice

# 同样跟随主库
replicaof master 6379

Docker Compose编排

使用 Docker Compose 将三个 Redis 实例编排在同一个自定义网络中,通过服务名互相通信。

version: '3.8'

services:
  # ---------- 主节点 ----------
  master:
    image: redis:7.2.4
    container_name: redis-master
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - ./config/master.conf:/usr/local/etc/redis/redis.conf
      - ./data/master:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-net

  # ---------- 从节点 1 ----------
  replica1:
    image: redis:7.2.4
    container_name: redis-replica-1
    restart: always
    ports:
      - "6380:6380"
    volumes:
      - ./config/replica1.conf:/usr/local/etc/redis/redis.conf
      - ./data/replica1:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    depends_on:
      - master
    networks:
      - redis-net

  # ---------- 从节点 2 ----------
  replica2:
    image: redis:7.2.4
    container_name: redis-replica-2
    restart: always
    ports:
      - "6381:6381"
    volumes:
      - ./config/replica2.conf:/usr/local/etc/redis/redis.conf
      - ./data/replica2:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    depends_on:
      - master
    networks:
      - redis-net

networks:
  redis-net:
    driver: bridge

启动集群

docker-compose up -d

验证主从状态

查看主库状态

进入 master 容器并执行 INFO replication

redis-cli -p 6379
INFO replication

输出如下即表示两个从库已成功连接:

# Replication
role:master
connected_slaves:2
slave0:ip=172.23.0.3,port=6381,state=online,offset=252,lag=1
slave1:ip=172.23.0.4,port=6380,state=online,offset=252,lag=1
master_failover_state:no-failover
master_replid:7be3860eae78aa0c884546e40d444ba5708ca4c5
master_repl_offset:252
...

观察偏移量变化

master_repl_offset 是主库当前的复制偏移量,表示已复制数据流的字节数。当主库写入数据时,该值会增长。

在主库写入数据:

set name "DockerMaster"
INFO replication

可以看到 master_repl_offset 从 252 增长到 499,从库同步该数据后也维持相同的偏移量。

验证从库数据

分别进入从库查看 name 字段,会发现数据已自动同步完成。

断线重连机制

操作场景:暂停一个从库容器 → 在主库写入新数据 → 重新启动该从库

重启后从库会增量同步而不是全量同步。这是因为 Redis 的主从复制采用带有部分重同步(PSYNC)的复制协议

  • 主库维护一个 replication backlog(环形缓冲区,默认 1MB)
  • 从库断线后重连时,将自己的 replid 和偏移量发给主库
  • 主库检查该偏移量是否仍在 backlog 中:
    • 在 backlog 内 → 部分重同步,只发送断线期间缺失的数据
    • 超出 backlog → 全量重同步,重新发送 RDB 快照

这就是高可用的一大保障:短暂的网络抖动不会触发昂贵的全量重同步。

读写分离验证

主库负责写入,从库只读。在从库执行写入命令会被拒绝:

> set test "test"
READONLY You can't write against a read only replica.

这一特性确保了集群数据的一致性流向:所有写入必须经过主库,从库只负责复制和应用。

总结

本文从零搭建了一套 Redis 一主两从集群,涵盖了:

知识点 说明
主从配置 replicaof 指令指定主库
Docker Compose 编排 自定义网络、服务名通信、数据卷挂载
复制原理 INFO replication 中的关键指标解读
偏移量 master_repl_offset 标记复制进度
断线重连 PSYNC 协议支持增量同步(部分重同步)
读写分离 从库只读保障数据一致性

以上是 Redis 主从复制的完整动手实践。理解这部分后,可以继续学习哨兵模式(Sentinel)实现自动故障转移,或集群模式(Cluster)实现数据分片与高可用。

posted @ 2026-08-08 22:01  PC2005-cloud  阅读(14)  评论(0)    收藏  举报