Redis主从复制过程详解

引言

Redis的复制功能分为同步传播两个过程:

  • 同步:将从服务器的数据库状态更新至主服务器当前所处的状态;
  • 传播:在主服务器的数据库状态被修改导致主从服务器数据库状态出现不一致时(如,主服务器执行写命令后),让主从服务器的数据库重新达到一致状态;

1. 相关命令

  1. slaveof host port
  • 设置当前服务器去复制运行在host:port的服务器,当前服务器被称为从服务器,被复制的服务器称为主服务器
  1. slaveof no one
  • 取消复制其他服务器
  1. info replication
  • 查看当前服务器的复制信息

2. 同步

2.1 两种需要同步的情况

在两种情况下需要执行数据库同步:初次复制断线后复制

  1. 初次复制
  • 从服务器以前没有复制过任何主服务器(即使以前复制过主服务器,只要执行过slaveof no one也认为没有复制过任何主服务器,即当前服务器状态是master)
  • 或者,从服务器当前要复制的主服务器和上次复制的主服务器不同(即,需要重新执行同步)
  1. 断线后重复制
  • 处于命令传播阶段的主从服务器因为网络原因中断了复制,但从服务器通过自动重连重新连接上了主服务器,并继续复制主服务器;

2.2 两种同步方法

Redis2.8以前的版本,使用SYNC命令,在两种情况下都实行完整同步,Redis2.8版本开始使用PSYNC命令代替SYNC命令,支持两种同步方式:完整重同步部分重同步

  1. 完整重同步:将主服务器的数据库状态在后台生成RDB文件,发送给从服务器,从服务器加载RDB文件达到数据库状态一致。步骤:
  • 从服务器向主服务器发送同步命令(SYNCPSYNC);
  • 主服务器收到同步命令后,执行BGSAVE命令,在后台生成RDB文件,同时使用一个缓冲区记录生成RDB文件期间,主服务器执行的新的写命令;
  • 主服务器的BGSAVE命令执行完毕后,主服务器将生成的RDB文件发送给从服务器;
  • 从服务器接收并载入RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的状态;
  • 主服务器将记录在缓冲区里面的所有新产生的写命令发送给从服务器;
  • 从服务器执行这些写命令,将自己的数据库状态更新至主服务器当前所处的状态;
  • 主从服务器数据库状态达到一致,之后主服务器再有写命令,通过命令传播发送给从服务器,保证主从服务器的数据库状态一致;
  1. 部分重同步:主服务器将断线期间的命令发送给从服务器,从服务器接收并执行这些命令完成数据库状态一致。
  • 当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前的状态;
  • 部分重同步依赖服务器运行ID复制积压缓存区复制偏移量来实现断线期间缺失命令的补发;

2.3 SYNCPSYNC命令

SYNC
  1. SYNC命令是Redis2.8以前使用的同步命令;在初次复制断线后重复制时都使用完整同步
  2. 完整同步是一个非常耗费资源的操作:
  • 主服务器需要执行BGSAVE命令来生成RDB文件,这个生成操作会耗费主服务器大量的CPU、内存和磁盘I/O资源;
  • 主服务器需要将生成的RDB文件发送给从服务器,这个发送操作会耗费主从服务器大量的网络资源ÿ
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值