深入Redis原理与应用——主从复制

深入Redis原理与应用——主从复制

一、概念

(1)redis 中用户可以执行 SLAVEOF 命令让一个服务器去复制另一台服务器。
(2)旧版的复制功能:分为同步和命令传播两个阶段

(3)旧版同步:当客户端向从服务器发送 SLAVEOF 命令要求从服务器同步主服务器时,从服务器需要先执行同步操作。

  • 从服务器向主服务器发送 SYNC 命令
  • 收到 SYNC 命令的主服务器开始执行 BGSAVE 命令,在后台生成一个 RDB 文件,并使用一个缓冲区记录从现在开始的所有命令。
  • 当 BGSAVE 执行完成时,主服务器会将 BGSAVE 命令生成的 RDB 文件发送给从服务器,从服务器接收并载入这个文件。
  • 主服务器将缓冲区中记录的所有写命令发送给从服务器,从服务器执行这些命令并最终达到一致。

(4)旧版命令传播:同步之后为了继续保持主从一致,主服务器会将导致主从不一致的命令发送给从服务器,让从服务器执行。

(5)旧版的复制在初次复制时性能可观,但在断线后重复制性能也要执行相同的复制操作,效果不好。

(6)新版的复制功能(2.8 版本开始):使用 PSYNC 代替 SYNC,PSYNC 具有完整重同步和部分重同步。

  • 完整重同步用于处理初次复制的情况,与 SYNC 相差不大。
  • 部分重同步用于处理断线后重复制情况:断线重连后如果条件允许,主服务器可以将从服务器连接断开期间执行的写命令发送给从服务器执行,就可以达到数据一致。

(7)部分重同步实现由三个部分构成:主从服务器的复制偏移量、主服务器的复制积压缓冲区、服务器的运行 ID。

  • 复制偏移量:执行复制的双方都会分别维护一个复制偏移量,主服务器向从服务器传输 N 个字节时会+N,从服务器接收 N 个字节时会+N,即如果主从服务器处于一致的状态,双方的复制偏移量总是相同的。
  • 复制积压缓冲区:是由主服务器维护的一个固定长度、先进先出的队列,默认大小为1MB。当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区中。当从服务器断线重连时,从服务器会通过 PSYNC 命令将自己的复制偏移量 offset 发送给主服务器:如果偏移量之后的数据仍然存在于复制积压缓冲区中则执行部分重同步操作(将 offset 偏移量之后的数据都发送给从服务器),否则执行完整的重
    同步操作。
  • 服务器运行 ID:每个 redis 服务器都有自己的运行 ID,初次复制时从服务器会保存主服务器的运行 ID,断线重连之后先检查从服务器保存的主服务器运行 ID 与现主服务器的运行 ID 是否相同,不相同则直接执行完整重同步。

二、复制的实现

(1)设置主服务器的地址和端口:执行 SLAVEOF 命令后从服务器会先将 IP 地址和端口保存到 redisServer 的 masterhost 和 masterport 属性中。
(2)建立套接字连接:设置完 IP 和端口后从服务器会创建连向主服务器的套接字连接,如果连接成功从服务器会为这个套接字创建一个专门用于复制操作的文件事件处理器,将负责后续的复制工作。主服务器接收到从服务器的套接字连接后会将其看作一个客户端,为其创建相应的客户端状态。从服务器将具有服务端和客户端两种状态。
(3)发送 PING 命令:从服务器首先发送一个 PING 命令,有两个作用:一是检查套接字的读写是否正常,二是检查主服务器能否正常处理请求。只有读到 PONG 命令才证明可以继续执行下个步骤。
(4)身份验证:从服务器收到 PONG 回复后接下来就是决定是否进行身份验证。主从服务器都没有设置密码或者主从服务器设置了相同的密码则通过验证继续进行下一步,否则会重试。
(5)发送端口信息:从服务器向主服务器发送其监听端口号,主服务器接收后将其保存在对应的客户端状态的 slave_listening_port 中,目前唯一的作用就是打印客户端端口信息。
(6)同步:从服务器发送 PSYNC 指令执行同步操作。在同步操作之前只有从服务器是主服务器的客户端;同步操作之后主服务器也会称为从服务器的客户端(完整重同步发送缓冲区中的命令,部分重同步发送复制积压缓冲区中的数据都需要主是从的客户端)。
(7)命令传播

三、心跳检测

(1)检测主从服务器的网络状态
(2)辅助实现 min-slaves。防止主服务器在不安全的情况下执行写命令。
(3)检测命令丢失:通过复制偏移量检测,发现丢失后主服务器会利用复制积压缓冲区重新发送丢失的命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值