【Redis】主从复制Day9
写在前面在实际生产环境中单机Redis面临两个核心问题性能瓶颈和单点故障。主从复制是Redis实现高可用的基础它不仅解决了数据冗余备份问题还为读写分离、故障转移提供了可能。今天我们深入理解Redis主从复制的原理与实践。文章目录写在前面一、为什么需要主从复制1.1 单机Redis的局限性1.2 主从复制的价值二、主从复制原理2.1 复制流程概述2.2 全量同步SYNC2.3 部分同步PSYNC2.4 命令传播三、主从复制配置3.1 配置方式3.2 重要配置参数3.3 查看复制状态四、主从切换4.1 手动主从切换4.2 读写分离配置五、踩坑提醒六、主从复制优化6.1 配置优化6.2 架构优化七、面试高频考点考点1主从复制的流程考点2如何减少主从复制延迟考点3主从复制是同步还是异步考点4SYNC和PSYNC的区别八、参考资料九、互动话题一、为什么需要主从复制1.1 单机Redis的局限性实际场景某电商平台Redis单机承载了100万QPS在双十一大促时CPU使用率达到100%响应延迟从1ms飙升到100ms严重影响了用户体验。单机Redis面临的问题问题说明性能瓶颈单机处理能力有限无法水平扩展单点故障服务器宕机后服务不可用数据丢失风险硬件故障可能导致数据丢失读写压力所有请求都打到一台服务器1.2 主从复制的价值主从复制带来的好处数据冗余实现数据热备份读写分离主节点写从节点读分担压力高可用基础为哨兵和集群提供基础故障恢复主节点故障时可切换到从节点┌─────────────┐ │ Client │ └──────┬──────┘ │ Write ▼ ┌─────────────┐ │ Master │ │ (写读) │ └──────┬──────┘ │ 复制 ┌─────────────┼─────────────┐ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Slave-1 │ │ Slave-2 │ │ Slave-3 │ │ (只读) │ │ (只读) │ │ (只读) │ └─────────────┘ └─────────────┘ └─────────────┘ ▲ ▲ ▲ │ │ │ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐ │ Read │ │ Read │ │ Read │ └─────────┘ └─────────┘ └─────────┘二、主从复制原理2.1 复制流程概述经验之谈理解复制流程对于排查主从同步问题至关重要特别是全量同步和部分同步的区别。Redis主从复制分为三个阶段连接建立阶段从节点连接主节点数据同步阶段全量同步或部分同步命令传播阶段主节点持续发送写命令2.2 全量同步SYNC全量同步发生在从节点第一次连接主节点从节点断开时间过长无法部分同步全量同步流程┌──────────────┐ ┌──────────────┐ │ Slave │ │ Master │ └──────┬───────┘ └──────┬───────┘ │ │ │ 1. PSYNC ? -1 │ │────────────────────────────────────────────│ │ │ │ 2. FULLRESYNC runid offset │ │────────────────────────────────────────────│ │ │ │ 3. 执行BGSAVE生成RDB │ │ (同时记录写命令到缓冲区) │ │ │ │ 4. 发送RDB文件 │ │────────────────────────────────────────────│ │ │ │ 5. 加载RDB文件 │ │ │ │ 6. 发送缓冲区的写命令 │ │────────────────────────────────────────────│ │ │ │ 7. 同步完成开始命令传播 │ │ │2.3 部分同步PSYNCRedis 2.8引入部分同步减少全量同步的开销。部分同步条件从节点之前同步过主节点主节点runid未变化复制偏移量在复制缓冲区范围内核心概念概念说明runid主节点的唯一标识每次重启会变化offset复制偏移量记录同步位置repl_backlog_buffer复制缓冲区环形结构默认1MB┌─────────────────────────────────────────────────────────┐ │ repl_backlog_buffer │ │ ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ │ │ cmd1│ cmd2│ cmd3│ cmd4│ cmd5│ cmd6│ cmd7│ cmd8│ ... │ │ │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ │ │ ▲ │ │ │ │ │ master_offset │ └─────────────────────────────────────────────────────────┘ 如果 slave_offset 在缓冲区范围内可以部分同步2.4 命令传播同步完成后主节点持续将写命令发送给从节点# 主节点执行写命令 SET key1 value1 # 主节点将命令传播给从节点 # 从节点执行相同的命令保持数据一致三、主从复制配置3.1 配置方式方式一配置文件# redis.conf从节点配置 replicaof 192.168.1.100 6379 # Redis 5.0之前使用 # slaveof 192.168.1.100 6379 # 从节点只读 replica-read-only yes # 主节点密码 masterauth your_password方式二命令行# 在从节点执行 REPLICAOF 192.168.1.100 6379 # 取消主从关系 REPLICAOF NO ONE3.2 重要配置参数参数说明默认值replicaof主节点地址和端口-masterauth主节点密码-replica-read-only从节点只读yesrepl-diskless-sync无盘复制norepl-backlog-size复制缓冲区大小1MBrepl-timeout复制超时时间60srepl-disable-tcp-nodelay禁用TCP_NODELAYno3.3 查看复制状态# 查看主从复制信息 INFO replication # 主节点返回示例 # Replication role:master connected_slaves:2 slave0:ip192.168.1.101,port6379,stateonline,offset1024,lag0 slave1:ip192.168.1.102,port6379,stateonline,offset1024,lag0 master_repl_offset:1024 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1024 # 从节点返回示例 # Replication role:slave master_host:192.168.1.100 master_port:6379 master_link_status:up slave_repl_offset:1024四、主从切换4.1 手动主从切换踩坑提醒手动切换需要谨慎操作确保数据同步完成后再切换否则可能丢失数据。步骤# 1. 在新主节点执行停止复制 REPLICAOF NO ONE # 2. 在其他从节点执行指向新主节点 REPLICAOF new_master_ip 6379 # 3. 验证主从状态 INFO replication4.2 读写分离配置应用层需要区分读写请求# 主节点地址写操作MASTER_HOST192.168.1.100MASTER_PORT6379# 从节点地址读操作SLAVE_HOSTS192.168.1.101:6379,192.168.1.102:6379读写分离架构┌─────────────┐ │ Application │ └──────┬──────┘ │ ▼ ┌─────────────┐ │ 读写分离层 │ │ (客户端/代理) │ └──────┬──────┘ │ ┌───┴───┐ │ │ ▼ ▼ Write Read │ │ ▼ ▼ Master Slave五、踩坑提醒踩坑提醒复制延迟问题问题描述主从复制是异步的从节点的数据可能落后于主节点读取从节点可能获取到过期数据。延迟产生原因网络延迟从节点性能不足主节点写入压力过大大key复制耗时解决方案方案说明监控延迟使用INFO replication查看lag值读写分离策略强一致性读走主节点优化网络使用内网、万兆网卡控制大key避免存储大key增加带宽提高复制带宽限制# 调整复制带宽限制 repl-backlog-size 64mb # 增大复制缓冲区 client-output-buffer-limit replica 256mb 64mb 60踩坑提醒主从切换数据丢失问题描述异步复制场景下主节点宕机时从节点可能还没收到最新的写命令。解决方案配置合理的min-replicas-to-write使用哨兵或集群实现自动故障转移业务层实现重试机制# 至少有1个从节点才能写入 min-replicas-to-write 1 min-replicas-max-lag 10踩坑提醒全量同步阻塞问题描述主节点执行BGSAVE生成RDB时如果内存数据量大会消耗大量CPU和内存影响性能。解决方案使用无盘复制控制单实例内存大小在低峰期添加从节点# 开启无盘复制 repl-diskless-sync yes repl-diskless-sync-delay 5六、主从复制优化6.1 配置优化# 增大复制缓冲区 repl-backlog-size 256mb # 开启无盘复制 repl-diskless-sync yes # 复制超时时间 repl-timeout 120 # 从节点TCP_NODELAY repl-disable-tcp-nodelay no # 限制复制缓冲区大小 client-output-buffer-limit replica 512mb 128mb 606.2 架构优化优化项说明主从节点同机房减少网络延迟从节点不少于2个保证数据冗余合理分配内存预留内存给复制监控复制延迟及时发现问题七、面试高频考点考点1主从复制的流程答案连接建立从节点连接主节点发送PSYNC命令全量同步主节点执行BGSAVE生成RDB发送给从节点缓冲同步主节点将同步期间的写命令发送给从节点命令传播主节点持续将写命令发送给从节点PSYNC优化从节点记录runid和offset重连时发送PSYNC runid offset如果offset在缓冲区范围内只同步增量数据考点2如何减少主从复制延迟答案网络优化主从部署在同机房使用高速网络配置优化增大复制缓冲区开启无盘复制架构优化控制单实例内存避免大key监控告警监控slave_repl_offset和master_repl_offset差值读写策略强一致性读走主节点考点3主从复制是同步还是异步答案Redis主从复制是异步的主节点执行写命令后立即返回不等待从节点确认通过repl_backlog_buffer记录写命令从节点异步获取并执行写命令影响优点主节点性能不受从节点影响缺点主节点宕机可能丢失未同步的数据考点4SYNC和PSYNC的区别答案对比项SYNCPSYNCRedis版本2.8之前2.8之后同步方式只支持全量同步支持全量和部分同步断线重连需要全量同步可能只需部分同步性能低高资源消耗高低八、参考资料Redis官方文档 - Replication九、互动话题你的生产环境主从架构是如何设计的遇到过什么问题如何监控主从复制延迟延迟超过多少需要告警主节点宕机后如何实现自动故障转移欢迎在评论区分享你的经验和见解下一期预告Day10 - Redis哨兵机制敬请期待