复制

Redis复制功能分为两个操作:
(1)同步(先):将从服务器状态更新至与主服务器当前状态一致。
(2)命令传播(后):将主服务器执行的写指令,发送给从服务器。
当一个服务器,要作为另外一个服务器的从服务器时,需要执行slave of ip:port(主服务器的ip:port)。

旧版本同步的实现

同步过程如下:

(1)从服务器向主服务器发送SYNC指令
(2)主服务器收到SYNC指令后,执行BGSAVE指令,生成RDB文件,同时使用一个缓冲区记录现在开始执行的所有写指令。(也就是说bgsave时服务器接受的写指令是不会同步到RDB文件中的,需要另外记录)
(3)RDB文件生成后,将RDB文件发送给从服务器。从服务器接受并载入RDB文件。
(4)主服务将缓冲区中的所有写指令发送给从服务器,从服务器执行这些写指令。

旧版同步的缺陷

当主从服务器在断线后重连,两个服务器状态可能不一致(在断线时,主服务器可能执行了写指令),此时从服务器发送SYNC指令,请求同步。主服务器需要生成RDB文件,并用一个缓冲区接受写操作,然后后RDB文件和缓冲区中的指令发送给从服务器。其实在断线前主从是一致的,只需要发送断线后主服务器接收的指令即可。(即断线后主从还是进行完全重同步,而不是只把短线时主服务器接受的写指令发送给从服务器)

新版本(2.8及之后)同步的实现

不再用SYNC指令,而是用PSYNC指令。同步分为两种情况:(1)完整重同步:与SYNC指令一样(2)部分重同步:只将断线时主服务器接受的写指令发送给从服务器。

部分重同步实现的三要素

(1)复制偏移量
通过该偏移量,判断主从服务器是否一致。主从服务器分别维护一个复制偏移量,主服务器向从服务器传播了N个字节,就在自己维护的偏移量上加N,从服务器同理。
(2)复制积压缓冲区
记录了最近主服务发送给从服务器的命令。主服务维护的一个固定长度的FIFO队列,默认大小为1MB。主服务器会将发送给从服务器的写命令记录到这个积压缓冲区。
当从服务器进行发送psync 打算进行部分重同步时,主服务器首先判断runid是否和自己一直,如果不一致则进行完整重同步;如果runid一致,再判断offset是否在自己的积压缓冲区中,如果不再则进行完整重不同,如果在则进行部分重同步。即主服务器根据runid和offset来决定进行哪种同步。
(3)服务器运行ID
进行部分重同步还是完整重同步的一个依据。从服务器初次对主服务进行复制时,从服务器回将自己的RUNID以及指定一个OFFSET一起发送给从服务器。从服务器保存该RUNID。
当从服务器断线重连时,从服务器向当前连接的主服务器发送之前保存的RUNID和自己的OFFSET。主服务器根据这个RUNID,如果与自己的RUNID相同,那么继续根据OFFSET判断是否进行部分重同步。如果不同,则直接进行完整重同步

PSYNC的实现

在这里插入图片描述

Redis复制的完整过程

设置主服务器的地址和端口

客户端向从服务器发送slaveof masterip:port。从服务器将主服务器IP和端口号保存到服务器状态(redisServer)的masterhost属性和masterport属性。然后向客户端返回OK。这是一个异步命令,实际的复制工作在将OK返回后执行。

建立套接字连接—从服务器作为主服务器的客户端

从服务器创建连向主服务器的套接字,并为这个套接字关联一个专门用于处理复制工作(如rdb文件接受,接受主服务器传播的写命令)的文件事件处理器。
主服务器接受从服务器的套接字连接后,为该套接字创建客户端状态,将从服务器看作客户端。这样从服务器同时具有客户端和服务器的身份。

发送Ping命令

ping命令作用:
(1)检查上一步构建的套接字的读写状态是否正常。
(2)检查主服务器能否正常处理命令请求

身份验证

在这里插入图片描述

从服务器发送自己的监听端口信息

从服务器执行replconf listenging_port port,将自己的监听端口号发送给主服务器。主服务器将该端口号保存到从服务器对应的客户端状态中的slave_listening_port 。

同步

从服务器向主服务发送psync指令,执行同步操作。

命令传播

同步之后,主从服务器进入命令传播阶段,主服务器将字节执行的写命令发送给从服务器。

心跳检测

子命令传播阶段,从服务器默认以一秒一次的频率向主服务器发送命令:
replconf ack <replication_offset>; replication_offset是从服务器的复制偏移量。发送replconf ack对于主服务器的作用:
(1)检测主服务器的网络连接状态。(即主服务器超过1s没收到replconf ack指令,说明连接出问题)
(2)辅助实现min_slaves选项
Redis的提高两个选项,防止服务器在不安全情况下执行写命令:
min-slaves-to-write 3 : 从服务器数量不少于3
min-slaves-max-lag 10 : 三个从服务的延迟大于等于10s。这里的lag即为主服务器多久没收到replconf ack指令了。
(3)检测命令丢失
当replconf ack <replication_offset>中,主服务器检测到自己维护的偏移量与replication_offset不同,则表示出现了命令丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值