美文网首页Redis相关
Redis第15章 复制

Redis第15章 复制

作者: Oliver_Li | 来源:发表于2020-12-27 20:25 被阅读0次
    • Redis集群部署的三种常见方式,复制哨兵集群
    • 复制主写从读,减缓单主的访问压力。
    • 哨兵主从切换,主服务宕机备用服务可以做备用访问。
    • 集群分片+主从切换,一般最少6台服务,3主3从分片分压、每组主从互相复制、互相备用。

    15.1 复制旧版实现

    • 书上举例说明了之前版本和v2.8的优化情况。
    • Redis的复制功能分为同步命令传播
      • 同步:从服务器(slave)通过主服务器(master)获取RDB文件达到初始化复制目的。
      • 命令传播:同步后master新执行的命令会发送给slave,已达到后续同步的目的。
    • 同步的流程:
      • slave向master发送SYNC命令。
      • master执行BGSAVE生成RDB文件、因为BGSAVE会创建子线程执行,所以master要记录生成文件这段时间的命令到一个缓冲区。
      • 发送RDB文件、缓冲区命令给slave并执行,这时数据就是同步的了。

    15.2 复制旧版缺点

    • SYNC命令耗费资源:master生成RDB、RDB发送给slave、slave执行RDB时是阻塞的。
    • 网络问题:如果slave因为网络问题断开了后续同步依然要执行一次SYNC

    15.3 新版优化

    • 新版用PSYNC命令代替SYNC命令,分为完整重同步部分重同步完整重同步SYNC一样。
    • 部分重同步:将断开这段时间的命令单独发给slave。

    15.4 部分重同步实现

    • 复制偏移量:master和slave都维护一个复制偏移量,master向slave传播N字节,双方就都+N,对比偏移量就知道主从是否一致。
    • 复制积压缓冲区:如何判断部分同步还是完整同步复制积压缓冲区默认生成1M缓冲区队列,master向slave传播字节时会同时传播到复制积压缓冲区,如果slave恢复后发现偏移数据还在复制积压缓冲区内,也就是1M,就选择部分同步,否则完整同步
    • 服务器运行ID:初次复制时,master向slave传递一个ID,断开恢复时,slave的请求会带着ID,master判断ID相同,就选择部分同步(如果满足复制积压缓冲区的条件),因为可能会出现slave认错master的场景,否则完整同步

    15.5 PSYNC命令的实现:

    PSYNC流程

    15.6 复制的完整实现

    • SLAVEOF是异步命令,slave设置master的ip和端口后就返回成功。
    • slave向master创建socket连接,并创建一个专门用来复制的事件处理器,完成接收RDB文件、接收传播的命令等
    • slave向master发送PING命令,检查套接字和命令处理是否正常运行,出现任何问题就重连。
    • 如果master需要验证身份,PING之后就是slave向master发送密码
    • 然后slave向master发送自身端口号,方便用户在master查询slave端口信息
    • 之后就是执行PSYNC命令,这时master也会变成slave的客户端,方便后续发送缓冲的命令传播等。

    15.7 心跳监测

    • 每秒执行一次,监测网络状态。
    • 心跳监测也会带着命令偏移量,随时检查是否出现不同步的状况,随时同步数据。

    总结:

    • 复制主要考虑的有几个方面:
      • slave初次向master申请,master生成RDB文件并发到slave完成同步
      • 注意master生成RDB文件期间的命令要记录下来,补给slave
      • 同步后master再处理命令会用socket命令传播到slave达到持续同步
      • 主从网络断开后,可以根据差量大小选择完整重同步部分重同步不会发生只要断开就全量同步的结果
      • 持续心跳监测网络和偏移量,以便同步。

    相关文章

      网友评论

        本文标题:Redis第15章 复制

        本文链接:https://www.haomeiwen.com/subject/blfanktx.html