Redis复制浅析

SLAVEOF

  • SLAVEOF host port在当前Redis服务器执行可以让当前服务器成为服务器ip的从服务器,并且丢弃原有数据集,并开始对新主服务器进行同步(同步即将从服务器状态更新到和主服务器当前状态一致)。
  • SLAVEOF no one 可以让当前服务器保持原有数据,并停止对其他服务器的同步,成为主服务器
同步
  1. 首先从服务器向主服务器发送SYNC命令 ;
  2. 收到命令的主服务器执行BGSAVE命令,在后台生产RDB文件,同时起一个缓冲区记录从当前开始之后执行的写命令;
  3. 主服务器中RDB文件生产完毕时,发送给从服务器,从服务器进行数据载入,载入过程中,从服务器会因为阻塞无法响应命令请求;
  4. 主服务器把缓冲区中的写命令发送给从从服务器,从而使得主从数据保持一致。
PSYNC命令
该命令具有全量同步和部分同步功能。全量同步表示从服务器初次同步和SYNC命令步骤一致;断线后重连同步可以只同步主服务器在短线这段时间内执行的写操作;

部分重同步
包含三部分:主从服务器的复制偏移量、复制加压缓冲区、服务器运行ID

-- 复制偏移量:主从服务器都会维持一个复制偏移量,用来主服务器向从服务器传播的字节数。
-- 复制积压缓冲区:一个FIFO的队列,队列大小可以设置,默认1MB
-- 服务器运行ID:每个Redis服务器都有一个运行ID,由40个随机的十六进制字符组成。从服务器向主服务器进行初次复制时,会记录主服务器的运行ID。
【Redis复制浅析】当从服务器断线重连时,可以通过复制偏移量对比出从服务器在断线时丢失的命令,通过复制加压缓冲区中的数据(假设丢失数据size大于缓冲区大小,则必须进行全量同步)来进行恢复,从服务器重连上一个主服务器时,会把之前保存的服务器运行ID发送给它,假设运行ID一致,则可以进行重连,否则全量同步。
心跳检测
命令传播过程中,从服务器默认每1秒向主服务器发送命令REPLCONF ACK<replication_offset>来检测网络连接状态、命令是否丢失、辅助实现min-slaves选项(min-slaves-towrite[最少需要的从服务器数量]和min-slaves-max-lag(从服务器延迟值)可以防止主服务器在不安全的状态下执行写命令)

    推荐阅读