一、主从复制简介

  • 主从复制目的:实现高可用
  • 主从复制作用:
    • 读写分离:提高服务器的读写负载能力
    • 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,提高Redis服务器并发量与数据吞吐量
    • 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
    • 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
    • 高可用基石:基于主从复制,构建哨兵模式和集群,实现Redis的高可用方案

二、主从复制的工作流程

  • 建立连接阶段
  • 数据同步阶段
  • 命令传播阶段

1、建立连接阶段

  • 主从连接配置:slave 配置文件 -> slaveof <masterip> <masterport>
  • 主从断开连接:slave 客户端 -> slaveof no one

图片加载失败

2、数据同步阶段

  • 全量复制
  • 增量复制
全量复制
  1. slave 连接 master,发送指令 psync2
  2. master 执行 bgsave
  3. master 创建复制缓冲区(存储 bgsave 阶段新增的)
  4. master 将生成的 RDB 文件通过 socket 发送给 slave
  5. slave 接收 RDB,清空数据,执行 RDB 文件恢复数据
增量复制
  1. slave 发送命令告知 master RDB 恢复完成
  2. master 发送复制缓冲区信息(AOF)
  3. slave 执行 bgrewriteaof 恢复数据

3、命令传播阶段

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

命令传播阶段的增量复制
  • 三个核心要素
    • 服务器的运行 id (runid)
    • 主服务器的复制积压缓冲区
    • 主从服务器的复制偏移量
  1. 服务器的运行 id (runid)
    • 每一台服务器每次运行的身份识别码
    • 由40位字符组成,是一个随机的十六进制字符
    • master 首次连接 slave 时,会将自己的运行ID发送给 slave
  2. 复制积压缓冲区
    • 本质是一个FIFO的队列,用于存储服务器执行过的命令(AOF)
    • 默认存储空间是1M,当入队元素数量大于队列长度时,队首元素会被弹出
    • 每台服务器启动时,如果开启了AOF或被连接称为 master 节点,即创建复制积压缓冲区
  3. 主从复制器复制偏移量(offset)
    • 描述复制积压缓冲区中的指令字节位置
    • 比对 masterslaveoffset 进行同步数据

图片加载失败