面试题:简述redis主从同步的过程

主从复制的作用

  1. 读写分离: master写、 slave读,提高服务器的读写负载能力
  2. 负载均衡: 基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
  3. 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
  4. 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
  5. 高可用基石: 基于主从复制,构建哨兵模式与集群,实现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说明

  1. 为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务 【slave-serve-stale-data yes|no 】
  2. 数据同步阶段, master发送给slave信息可以理解master是slave的一个客户端,主动向slave发送命令
  3. 多个slave同时对master请求数据同步, master发送的RDB文件增多, 会对带宽造成巨大冲击, 如果master带宽不足, 因此数据同步需要根据业务需求,适量错峰
  4. slave过多时, 建议调整拓扑结构,由一主多从结构变为树状结构, 中间的节点既是master,也是slave。注意使用树状结构时,由于层级深度,导致深度越高的slave与最顶层master间数据同步延迟较大, 数据一致性变差, 应谨慎选择

命令传播阶段

  • 当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,同步的动作称为命令传播

  • 从服务器会发送REPLCONF ACK {offset}命令,汇报slave自己的复制偏移量,获取最新的数据变更指令,当主服务器接收到指令的时候,会比较offset的是否相等,如果不等,会发送缓冲区中2个之间的数据,从服务器会保存主服务器的offset,并恢复数据。

原文地址:https://www.cnblogs.com/dalianpai/p/14333071.html