Redis 的主从复制(Replication)是构建高可用、高性能分布式缓存和数据库系统的核心机制。通过主从复制,数据可以从一个主节点(Master)自动同步到多个从节点(Slave),实现读写分离、负载均衡和故障恢复。本文将深入探讨主从复制的原理、配置方法、常见问题及优化策略。
主从复制是一种数据同步机制,允许从节点实时复制主节点的数据。主节点负责处理写操作,从节点默认只处理读操作(需配置 replica-read-only yes)。当主节点数据变化时,从节点通过异步或半同步方式更新自身数据。
方式 1:
通过命令行配置
启动从节点,并执行以下命令指定主节点:
# Redis 5.0 及以上版本
REPLICAOF <master-ip> <master-port>
# Redis 5.0 以下版本
SLAVEOF <master-ip> <master-port>
验证复制状态
INFO replication
输出中的 role:slave 和 master_link_status:up 表示复制成功。
方式 2:
通过配置文件配置
在从节点的 redis.conf 中设置:
replicaof <master-ip> <master-port>
masterauth <password> # 如果主节点设置了密码
假设主节点 IP 为 192.168.1.100,端口 6379,密码为 redis123:
修改从节点配置文件:
replicaof 192.168.1.100 6379
masterauth redis123
replica-read-only yes # 从节点只读
重启从节点服务:
redis-server /path/to/redis.conf
主从复制分为三个阶段:
从节点向主节点发送 PSYNC 命令,携带复制偏移量(offset)和运行 ID(run ID)。
主节点根据运行 ID 判断是否允许增量同步。
全量复制(Full Resynchronization):从节点首次连接或复制中断后,主节点生成 RDB 快照并发送给从节点。
增量复制(Partial Resynchronization):主节点将后续的写命令缓存在复制缓冲区(Replication Buffer),从节点断线重连后仅同步差异数据(需 Redis 2.8+ 支持 PSYNC 协议)。
主节点持续将写命令发送给从节点,保持数据一致性。
特性 | 全量复制 | 增量复制 |
---|---|---|
触发条件 | 初次连接或复制缓冲区不足 | 断线重连且缓冲区存在差异数据 |
数据量 | 主节点全部数据 | 断线期间的差异命令 |
网络开销 | 高(传输 RDB 文件) | 低(仅传输命令流) |
性能影响 | 主节点可能阻塞(生成 RDB) | 几乎无影响 |
原理:主节点直接将 RDB 数据通过 Socket 发送给从节点,避免磁盘 I/O 开销。
配置:
repl-diskless-sync yes # 启用无盘复制
repl-diskless-sync-delay 5 # 等待更多从节点连接后再同步(秒)
现象:INFO replication 显示 master_link_status:down。
解决:
排查:
解决:强制从节点重新全量同步(REPLICAOF NO ONE 后重新连接)。
优化方法:
生产建议:
持久化:主节点开启 RDB 或 AOF,避免重启后全量同步。
安全加固:
masterauth <password> # 主从认证
requirepass <password> # 客户端访问密码
关键指标:
工具推荐:
升级策略:主从节点尽量保持版本一致(尤其是跨大版本升级时)。
Redis 主从复制是实现数据高可用和扩展性的基石。通过深入理解其同步机制、合理配置及监控,可以有效提升系统稳定性与性能。在复杂场景中,建议结合 Sentinel 或 Redis Cluster 构建自动化故障恢复体系,以满足企业级高可用需求。
扩展阅读:
Redis 官方复制文档
《Redis 设计与实现》—— 第 15 章 复制
Redis 源码解析(replication.c、rdb.c)