【Redis】主从同步复制原理

在Redis中,可以通过SLAVEOF命令或者slaveof选项,让一个服务器去复制另一个服务器,被复制的服务器称为主服务器,而对主服务器进行复制的称为从服务器。

进行复制中的主从服务器数据库将保存相同的数据,概念上将这种现象称作“数据库状态一致”。

复制功能主要分为同步命令传播两个操作

  • 同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。
  • 命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务器数据库状态出现不一致时,让主从服务器数据库重新回到一致状态。

其中根据redis版本不同,同步有新旧两个版本的不同。

旧版复制功能

实现流程:

  1. 从服务器向主服务器发送SYNC命令。
  2. 受到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有命令
  3. 当服务器的BGSAVE命令执行完毕后,主服务器会将生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务执行BGSAVE命令时的数据库状态。
  4. 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将数据库状态更新至主服务器当前所处的状态。

之后每当主服务器执行客户端发送的写命令时,服务器状态又会不一致,这时,主服务器需要对从服务器执行命令传播操作。此时,主从服务器又回到一致的数据库状态。这个阶段称为命令传播阶段。(而下面说的有关断点重连指的也是在命令传播阶段连接断开。)

旧版复制功能缺陷:
断点重连时,也要从头开始复制主服务器的数据,效率会非常低。而且SYNC是一个非常耗费资源的操作,包括大量的CPU,IO和网络资源,所以redis2.8以后提出了新的复制功能,在断点重连时可以从断点的地方继续复制,而不用从头开始进行复制。

新版复制功能

新版复制功能用PSYNC命令来代替SYNC命令。具有完整同步和部分同步两个模式。

  • 完整同步用于初次复制情况,和执行SYNC命令一样。参考上面的步骤。
  • 部分同步用于断线重连后的复制。

当断线后重新连接主服务器是,如果条件允许,主服务器可以将从服务器连接断开期间的写命令发送给从服务器,从服务器只接收并执行这些写命令就可以将数据库状态更新至主服务器当前的数据库状态。

部分同步的实现:

为了解决旧版复制功能存在的断线重连之后的效率低下和资源占用情况,新版复制功能添加了复制积压缓冲区和复制偏移量的概念。在这里插入图片描述

  • 复制积压缓冲区:主服务器维护的一个固定长度的队列,默认大小为1MB。可以通过设置repl-backlog-size来修改它的大小。在redis主从服务器在进行正常的命令传播时,主服务器除了向从服务器发送写命令外,还要向复制积压缓冲区中发送写命令
  • 复制偏移量:主服务器和从服务器分别维护的一个整数值。同样在命令传播阶段主服务器每次向从服务器传播N个字节时,就将自己的复制偏移量+N,从服务器每次接收到主服务传播来的N个字节是,也将自己的复制偏移量+N

同步触发流程:
在这里插入图片描述

如上图所示,当从服务器重新连上主服务器时,从服务器会通过PSYNC命令将自己的复制偏移量发送给主服务器,主服务器会根据这个偏移量之后的数据是否仍然存在复制积压缓冲区中来决定执行完整同步还是部分同步。

当开始执行部分同步时,主服务器只需将复制加压缓冲区的命令发送给从服务器即可达到主从数据库状态一致。

主从通信

  • PING-PONG:当通过SLAVEOF命令从服务器连接上主服务器时,从服务器向主服务器发送PING命令来检查套接字是否正常,并检查主服务器是否可以正常接收命令请求。
  • 心跳:在命令传播阶段,从服务器会每隔1s向主服务器发送命令REPLCONF ACK <replication_offset>(当前的从服务器的复制偏移量),用于检测网络连接和命令丢失。同时可以辅助实现min-slaves选项。

检测命令丢失:发送复制偏移量可以进行对比,如果从服务器小于主服务器,主服务器可以将丢失的命令从复制积压缓冲区中取出来发送给从服务器。
redis的min-slaves-to-write和min-slaves-max-lag两个选项可以防止主服务器在不安全的情况下执行写命令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值