# Redis主从复制怎么实现 ## 1. 主从复制概述 Redis主从复制(Master-Slave Replication)是指将一个Redis服务器(主节点)的数据复制到一个或多个Redis服务器(从节点)的过程。这种机制是Redis实现高可用性和读写分离的基础架构。 ### 1.1 核心价值 - **数据冗余**:实现数据热备份 - **故障恢复**:主节点故障时从节点可升级 - **负载均衡**:读写分离减轻主节点压力 - **高可用基石**:哨兵和集群的基础 ### 1.2 典型拓扑 ```mermaid graph TD A[Master] --> B[Slave1] A --> C[Slave2] C --> D[Slave3] # 级联结构
建立连接阶段
SLAVEOF 127.0.0.1 6379
masterhost/masterport
同步准备阶段
PING
命令检测连通性PONG
后开始认证(如果配置了requirepass
)数据同步阶段
# 伪代码示例 def sync(): slave.send("PSYNC ? -1") # 初次同步使用全量复制 master.bgsave() # 后台生成RDB master.repl_buffer = [] # 开启复制缓冲区 master.send_rdb(slave) # 传输RDB文件 slave.load_rdb() # 清空数据后加载 master.send(repl_buffer) # 发送缓冲区的写命令
命令传播阶段
Redis 4.0+ 引入的优化机制: - 复制偏移量:主从各自维护offset - 复制积压缓冲区:主节点的环形缓冲区(默认1MB) - Run ID:主节点唯一标识
sequenceDiagram Slave->>Master: PSYNC <runid> <offset> alt 偏移量在缓冲区内 Master-->>Slave: +CONTINUE Master->>Slave: 发送缺失命令 else 需要全量同步 Master-->>Slave: +FULLRESYNC Master->>Slave: 发送RDB end
主节点配置(redis.conf):
# 必须配置项 requirepass yourpassword masterauth yourpassword # 从节点访问主节点的密码 # 优化参数 repl-backlog-size 64mb # 增大复制缓冲区 repl-backlog-ttl 3600 # 断开后保留时长 client-output-buffer-limit slave 512mb 128mb 60 # 调大客户端缓冲区
从节点配置:
# 命令行方式 redis-cli -a yourpassword SLAVEOF 127.0.0.1 6379 # 配置文件方式 slaveof 127.0.0.1 6379 masterauth yourpassword slave-read-only yes # 推荐开启只读
# 主节点执行 redis-cli> INFO replication # 输出示例 connected_slaves:2 slave0:ip=192.168.1.2,port=6380,state=online,offset=123456,lag=0 slave1:ip=192.168.1.3,port=6381,state=online,offset=123456,lag=1 # 从节点验证 redis-cli> ROLE
问题现象 | 可能原因 | 解决方案 |
---|---|---|
从节点无法连接 | 网络问题/认证失败 | 检查masterauth 配置 |
复制中断 | 超时(repl-timeout默认60s) | 增大repl-timeout |
全量复制频繁 | 缓冲区不足 | 增大repl-backlog-size |
主从数据不一致 | 从节点过期键处理问题 | 配置slave-read-only yes |
网络优化:
参数调优:
repl-diskless-sync yes # 无盘复制(适用于SSD) repl-ping-slave-period 10 # 心跳检测间隔
监控指标:
master_repl_offset
增长是否正常slaveX_lag
延迟秒数拓扑结构:
Master -> Slave1 -> Slave2
优势: - 减轻主节点压力 - 适合多机房部署
风险: - 级联层次不宜超过3层 - 延迟会逐级放大
Spring Boot配置示例:
@Bean public LettuceConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration master = new RedisStandaloneConfiguration("master", 6379); RedisStandaloneConfiguration slave = new RedisStandaloneConfiguration("slave", 6380); LettuceClientConfiguration config = LettuceClientConfiguration.builder() .readFrom(ReadFrom.REPLICA_PREFERRED) .build(); return new LettuceConnectionFactory(master, slave, config); }
特性 | 主从复制 | 集群模式 |
---|---|---|
数据一致性 | 最终一致 | 分区一致 |
扩展性 | 垂直扩展 | 水平扩展 |
故障转移 | 需配合哨兵 | 内置自动转移 |
适用场景 | 中小规模数据 | 海量数据 |
注:本文基于Redis 6.2版本编写,部分参数在不同版本可能存在差异。实际部署时应参考对应版本的官方文档。 “`
该文档共计约1750字,采用Markdown格式编写,包含技术原理、配置示例、问题排查和最佳实践等内容,符合技术文档规范。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。