`
on__the__way
  • 浏览: 24018 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Redis主从复制

 
阅读更多

    主服务器可以有多个从服务器。同时从服务器可以与其他的从服务器的连接,形成图状结构。Redis的复制在主服务器上是非阻塞的。这意味着从服务器执行同步时主服务器能继续处理请求。Redis的复制在从服务器上也是非阻塞的。当从服务器同步时,假如你在redis.conf中进行了相应配置,也能够继续使用旧版本的数据集处理请求。还可配置当复制流宕掉时,从服务器返回给客户端一个错误。但当同步结束后,旧的数据集需要被删除,新的数据集需要被载入。在这个期间内,从服务器会阻塞到来的连接。

    Redis复制从功能角度分为同步和命令传播两部分。同步用于将从服务器的数据库状态更新为主服务器的数据库状态,命令传播是当主服务器的数据库被修改造成主从不一致时,让从服务器与主服务器保持一致。

    Redis通过PSYNC命令实现同步操作,有两种模式:完整重同步和部分重同步。

    完整重同步

        用于从服务器的初次复制或主返回+CONTINUE(下文介绍),主执行BGSAVE生成RDB文件,并在积压缓冲区中记录之后执行的所有命令。之后主将RDB文件发送给从服务器,从载入内存更新数据,之后主将积压缓冲区的所有命令发送给从。这之后主从达到一致状态。

    部分重同步

        用于处理主从断开重连后的复制情况。完整重同步是一个很耗费资源的操作,部分重同步就是只将断开期间的增量数据而不是整个数据库的全量数据发送给从服务器,更新至一致状态的操作。主要有三个概念:复制偏移量、复制积压缓冲区、运行ID。

        复制积压缓冲区是有主服务器维护的一个先进先出的FIFO队列,将最近一段时间的写命令保存在队列中,并记录相对应的偏移量。主从服务器都会维护自己的复制偏移量,用于判断是否一致。当从断开重连后,会将自己的复制偏移量通知主,主判断该偏移量之后的数据是否在复制积压缓冲区中,若在则进行部分同步,反之进行全同步。每个Redis实例都有自己的运行ID,当从服务器保存的主ID与当前的主ID不同时则进行完整重同步。

         下图是主从复制的概述图:

    复制的步骤

    a) 主服务器设置地址和端口.

    b) 从服务器与主建立连接,并设置文件事件处理器,用于接受RDB文件及其他复制的命令。从服务器同时具有服务器和客户端两种状态。

    c) 从服务器发送ping命令,用于检查套接字读写是否正常和主服务器是否能正确处理命令。如下图

 

    d) 身份验证,根据从服务器的masterzuth选项和主服务器的requireoass选项进行验证。具体如下图

    e) 发送端口信息,从将监听端口通知主,用于INFO REPLICATION打印

    f ) 进行主从同步

    g) 命令传播。主将写命令发送给从服务器。

    其他

    a) 要禁止主服务器配置为关闭持久化并自动重启,当主服务器挂掉并重启后由于没有持久化数据造成数据丢失为空,这是若进行主从复制则使从服务器的数据丢失。

    b) 可以设置Redis主服务器在当前至少拥有N个从服务器的连接的情况下,才能接受写请求

    c) 从服务器支持默认开启的只读模式,可在redis.conf中使用rename-command指令来禁止命令

  • 大小: 52.1 KB
  • 大小: 118.5 KB
  • 大小: 139.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics