面试题:简述redis主从同步的过程
主从复制的作用
- 读写分离: master写、 slave读,提高服务器的读写负载能力
- 负载均衡: 基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
- 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
- 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
- 高可用基石: 基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案
从复制过程大体可以分为3个阶段
建立连接阶段
- 建立slave到master的连接,使master能够识别slave, 并保存slave端口号
数据同步阶段
- .从服务发送一个psync2同步命令给主服务要求全量同步。主服务接收到从服务的sync同步命令时,会fork一个子进程后台执行bgsave命令(非阻塞)快照保存,生成RDB文件,并将RDB文件发送给从服务。从服务再将接收到的RDB文件,先清空数据,再载入自己的redis内存。待从服务将RDB载入完成后,主服务再将缓冲区所有写命令发送给从服务。从服务在将主服务所有的写命令载入内存从而实现数据的完整同步。
数据同步阶段master说明
- 如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
- 复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态 【repl-backlog-size 1mb 】
- master单机内存占用主机内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执行bgsave命令和创建复制缓冲区
数据同步阶段slave说明
- 为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务 【slave-serve-stale-data yes|no 】
- 数据同步阶段, master发送给slave信息可以理解master是slave的一个客户端,主动向slave发送命令
- 多个slave同时对master请求数据同步, master发送的RDB文件增多, 会对带宽造成巨大冲击, 如果master带宽不足, 因此数据同步需要根据业务需求,适量错峰
- slave过多时, 建议调整拓扑结构,由一主多从结构变为树状结构, 中间的节点既是master,也是slave。注意使用树状结构时,由于层级深度,导致深度越高的slave与最顶层master间数据同步延迟较大, 数据一致性变差, 应谨慎选择
命令传播阶段
-
当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,同步的动作称为命令传播
-
从服务器会发送REPLCONF ACK {offset}命令,汇报slave自己的复制偏移量,获取最新的数据变更指令,当主服务器接收到指令的时候,会比较offset的是否相等,如果不等,会发送缓冲区中2个之间的数据,从服务器会保存主服务器的offset,并恢复数据。