redis杂谈之旧版复制(3)

1.旧版复制

Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作:

·同步操作用于将从服务器的数据库状态更新至主服务器当前所处 的数据库状态。

·命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一 致状态

1.1 同步

当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服 务器时,从服务器首先需要执行同步操作,也即是,将从服务器的数据 库状态更新至主服务器当前所处的数据库状态

实现:

从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命 令来完成,以下是SYNC命令的执行步骤:

1)从服务器向主服务器发送SYNC命令。

2)收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个 RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令

3)当主服务器的BGSAVE命令执行完毕时,主服务器会将 BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这 个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时 的数据库状态。

4)主服务器将记录在缓冲区里面的所有写命令发送给从服务器, 从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库 当前所处的状态

redis杂谈之旧版复制(3)_第1张图片

 实际举例-

redis杂谈之旧版复制(3)_第2张图片

redis杂谈之旧版复制(3)_第3张图片 

 1.2命令传播

在同步操作执行完毕之后,主从服务器两者的数据库将达到一致状 态,但这种一致并不是一成不变的,每当主服务器执行客户端发送的写 命令时,主服务器的数据库就有可能会被修改,并导致主从服务器状态 不再一致

举个例子:个例子,假设一个主服务器和一个从服务器刚刚完成同步操作, 它们的数据库都保存了相同的五个键k1至k5

redis杂谈之旧版复制(3)_第4张图片

 如果这时,客户端向主服务器发送命令DEL k3,那么主服务器在执 行完这个DEL命令之后,主从服务器的数据库将出现不一致:主服务器 的数据库已经不再包含键k3,但这个键却仍然包含在从服务器的数据库 里面

redis杂谈之旧版复制(3)_第5张图片

 

 为了让主从服务器再次回到一致状态,主服务器需要对从服务器执 行命令传播操作:主服务器会将自己执行的写命令,也即是造成主从服 务器不一致的那条写命令,发送给从服务器执行,当从服务器执行了相 同的写命令之后,主从服务器将再次回到一致状态

redis杂谈之旧版复制(3)_第6张图片

 1.3旧版复制功能的缺陷

在Redis中,从服务器对主服务器的复制可以分为以下两种情况:

·初次复制:从服务器以前没有复制过任何主服务器,或者从服务 器当前要复制的主服务器和上一次复制的主服务器不同。

·断线后重复制:处于命令传播阶段的主从服务器因为网络原因而 中断了复制,但从服务器通过自动重连接重新连上了主服务器,并继续 复制主服务器。

对于初次复制来说,旧版复制功能能够很好地完成任务,但对于断 线后重复制来说,旧版复制功能虽然也能让主从服务器重新回到一致状 态,但效率却非常低

举例一:

redis杂谈之旧版复制(3)_第7张图片redis杂谈之旧版复制(3)_第8张图片

 在时间T10091,从服务器终于重新连接上主服务器,因为这时主从 服务器的状态已经不再一致,所以从服务器将向主服务器发送SYNC命 令,而主服务器会将包含键k1至键k10089的RDB文件发送给从服务器, 从服务器通过接收和载入这个RDB文件来将自己的数据库更新至主服务 器数据库当前所处的状态

SYNC:

每次执行SYNC命令,主从服务器需要执行以下动作:

1)主服务器需要执行BGSAVE命令来生成RDB文件,这个生 成操作会耗费主服务器大量的CPU、内存和磁盘I/O资源。

2)主服务器需要将自己生成的RDB文件发送给从服务器,这 个发送操作会耗费主从服务器大量的网络资源(带宽和流量),并 对主服务器响应命令请求的时间产生影响。

3)接收到RDB文件的从服务器需要载入主服务器发来的RDB 文件,并且在载入期间,从服务器会因为阻塞而没办法处理命令请求

你可能感兴趣的:(redis,数据库)