《Redis设计与实现》第十五章 复制

第十五章 复制

在Redis中,用户可以通过执行SLAVEOF命令或者设置一个slaveof选项让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,为主从。
《Redis设计与实现》第十五章 复制

15.1 旧版复制功能的实现

Redis的复制功能分为sync同步command propagate命令传播两个操作。
同步:同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。
命令传播操作:用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。

15.1.1 同步

1、发送sync
2、接受sync并开启bgsvae命令,缓冲区记录所有写命令
3、bgsave完成后发送rdb文件,接受rdb后倒入并执行缓冲区命令。

《Redis设计与实现》第十五章 复制

15.1.2 命令传播

《Redis设计与实现》第十五章 复制

15.2 旧版复制功能的缺陷

在Redis中,从服务器对主服务器的复制可以分为以下几种情况:
1、初次复制
2、断线后复制(效率极低)

《Redis设计与实现》第十五章 复制

15.3 新版复制功能的实现

PSYNC命令代替SYNC命令,新命令有完整同步和部分重同步。

《Redis设计与实现》第十五章 复制
也就是在断线重同步的时候用了部分重同步而不是全部重同步。

15.4 部分重同步的实现

主要由三个部分构成:
1、主服务器的复制偏移量和从服务器的复制偏移量(replication offset)
2、主服务器的复制积压缓冲区
3、服务器的运行

15.4.1 复制偏移量

执行复制的双方会维护一个肤质偏移量,主发送N个字节的数据,就加上N,从接受就接受N。

《Redis设计与实现》第十五章 复制
如果主从偏移量总是相同的,那么久一样,想法不同就是不一致。

《Redis设计与实现》第十五章 复制
此时就执行部分重同步。
主服务器又如何补偿从服务器A在断线期间丢失的那部分数据呢?

15.4.2 复制积压缓冲区

复制积压缓冲区是由主服务器维护的一个古典长度的先进先出队列大小默认1MB。

《Redis设计与实现》第十五章 复制

《Redis设计与实现》第十五章 复制
会根据从服务器发送的idx也就是偏移量来决定是否执行部分冲同步,如果offset在就部分冲同步 否则就完全冲同步。

《Redis设计与实现》第十五章 复制

15.4.3 服务器运行ID

每个服务器都有自己的运行ID 由50个随机十六进制字符组成。

《Redis设计与实现》第十五章 复制

15.5 PSYNC 命令的实现

《Redis设计与实现》第十五章 复制
完整过程设计runid、offset、积压id

15.6 复制的实现

15.6.1 步骤1:设置主服务器地址和端口

redisserver里面有masterhostmasterport属性。

《Redis设计与实现》第十五章 复制

15.6.2 简历套接字连接

《Redis设计与实现》第十五章 复制

15.6.3 步骤3:发送PING命令

《Redis设计与实现》第十五章 复制

15.6.4 步骤4:身份验证

如果服务器设置了masterauth就进行身份验证。

《Redis设计与实现》第十五章 复制

15.6.5 步骤5:发送端口信息

《Redis设计与实现》第十五章 复制

15.6.6 步骤6:同步

《Redis设计与实现》第十五章 复制

15.6.7 命令传播

也就是将自己的命令发送到从服务器。

15.7 心跳检测

命令传播阶段会以一定频率检测心跳,向主服务器发送命令。

15.7.1 检测主服务器的网络连接状态

INFO replication 、 REPLICONF ACK检测主从网络连接状态、检测命令丢失。

15.7.2 辅助实现min-slaves配置选项

15.7.3 检测命令丢失

《Redis设计与实现》第十五章 复制
也就是检测偏移量是否一样,是否一致。

15.8 重点回顾

  • redis的复制
  • 完全复制和部分复制重同步
  • 偏移量、runid、复制积压缓冲区
  • sync连接步骤
  • 检测主从之间的状态

可以说redis的实现相当简单易懂了,相比zk集群的各种什么算法和配置以及心跳检测的各种情况。

《Redis设计与实现》第十五章 复制