主节点处理用户请求,并将数据复制给从节点。主从优点:
-
数据冗余,将数据热备份到从节点,主从点宕机不影响数据
-
读写分离,主节点负责写,从节点负责读,提高redis整体吞吐量
-
故障恢复,主节点下线后切换从节点为主节点
-
高可用基础,主从机制是Sentinel和cluster机制的基础,故障转移都需要从主节点切换到从节点
-
主从复制流程
- 握手阶段:主从连接成功以后,从节点需将自身信息发送给主节点
- 同步阶段:从节点连接上主节点后,需先同步数据,数据一致后才开始复制
- 全量同步:主节点生成RDB数据发送给从节点(首次)
- 从节点接收数据以后,需要主节点发送的RDB格式。以$EOF开头为不定长格式,否则为定长格式。
- 读取处理数据:
- 磁盘加载:不断读取socket中的数据并保存到临时文件中,待所有数据都保存到临时文件时,命名为RDB文件,并加载RDB文件
- 无磁盘加载:读取socket中的数据,加载到内存中
- 部分同步:主节点只需将复制积压区中的offset偏移量之后的命令发送给从节点即可。若offest不在复制积压区中,则进行全量同步。
- 从节点发送部分同步请求的命令后,主节点回复,若主节点要求全量同步,则进行全量同步。否则继续部分同步操作,从节点根据主节点返回的replid、offset(这两个参数,主节点和从节点都会各自维护一份),进行同步操作。
- 检查offset(offset有点类似于mysql做checkpoint时设计的LSN(log sequence number))是否在复制积压区中,如果不在,则说明未同步数据较多,改为全量同步。
- 全量同步:主节点生成RDB数据发送给从节点(首次)
- 复制阶段:主节点将执行的写命令传播给从节点,从节点接受并执行这些命令。redis使用异步复制,主节点传播命令完以后,不会等待从节点返回ACK确认。异步复制优点是低延迟高性能,缺点是短期内会有数据不一致的情况。
- 主从同步协议:
- PSYNC:psync是redis4之前使用的主从协议,在主从重连后,可以快速同步数据,缺点是:从节点重启后会丢失replid和offset参数,导致全量同步;在cluster中若发生主从切换,replid会丢失导致全量同步。
- PSYNC2:psync2会把这两个数据放入RDB文件中,避免丢失,因此使用PSYNC2协议,必须使用RDB持久化。