Redis之主从复制

Redis复制功能分为同步和命令传播两个操作:

  • 同步用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态(类似新建)。
  • 命令传播用于当主从服务器的状态不一致时,让二者状态回到一致(类似更新)。

同步是通过SYNC命令完成的,具体步骤如下:

  1. 从服务器向主服务器发送SYNC命令
  2. 收到SYNC的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并用一个缓冲区记录当前开始执行的所有写命令。
  3. BGSAVE命令执行完以后,主服务器会将生成的RDB文件发送给从服务器,从服务器接收到RDB文件以后,会将自己的数据库的状态更新为和主服务器执行BGSAVE命令时一致。
  4. 接着,主服务器会将记录在缓冲区的所有写命令发送给从服务器,保持二者状态一致。

命令转播,是当主从服务器由于各种不可预计的原因,导致状态不一致时,这时候就需要将主从的状态进行同步。

上面的同步是Redis2.8以前的,显然,有一些问题,就是每次主从状态不一致时,都需要将主服务器的状态(保存的数据)从头到尾进行复制(全复制),而不是从断开连接的地方继续进行。
在2.8以后,Redis使用PSYNC命令代替SYNC命令,PSYNC有完整同重步和部分重同步两种模式:

  • 完整重同步与SYNC命令一样
  • 部分重同步用于断开后重新复制的情况。

部分重同步由一下三个部分构成:

  • 主服务器的复制偏移量和从服务器的复制偏移量

  • 主服务器的复制积压缓冲区

  • 服务器的运行ID

    服务器运行ID,即run ID,用于判断主从服务器断开再连接以后,是执行完全重同步还是部分重同步,具体步骤是:主服务器会将自己的run ID发给从服务器,假如从服务器断开再连接以后就根据run ID判断是否和当前的主服务器的run ID是否一致,如果不一致就进行完全重同步,一致的话就进行部分重同步。

那么问题来了,如果只选部分重同步的话,主服务器如何补偿从服务器断线期间丢失的数据呢?
先回答一个问题,主从服务器是如何判断是否处于一致状态的?
主从服务器都会维护一个复制偏移量,如果不一致,说明主从状态不一致。
复制积压缓冲区,用于主从不一致以后,数据的补偿。复制积压缓冲区是由主服务器维护的一个固定长度的FIFO队列,默认1MB。由于是固定大小,所以正确的估算和设置复制积压缓冲区的大小很重要。
一般情况下,将复制积压缓冲区的大小设置为2secondwrite_size_per_second。

  • second为从服务器断线后重新连接上主服务器所需的平均时间(秒为单位)。
  • write_size_per_second为主服务器平均每秒产生的写命令数据量。(协议格式的写命令的长度总和。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值