第 15 章: 复制¶
SYNC
命令执行期间,
主从服务器的通信过程。
Redis 的命令传播过程示例。
如果这时,
客户端向主服务器发送命令 DEL k3
,
那么主服务器在执行完这个 DEL 命令之后,
主从服务器的数据库将出现不一致:
主服务器的数据库已经不再包含键 k3
,
但这个键却仍然包含在从服务器的数据库里面,
如图 15-4 所示。
在上面的例子中,
主服务器因为执行了命令 DEL k3
而导致主从服务器不一致,
所以主服务器将向从服务器发送相同的命令 DEL k3
:
当从服务器执行完这个命令之后,
主从服务器将再次回到一致状态 ——
现在主从服务器两者的数据库都不再包含键 k3
了,
如图 15-5 所示。
PSYNC
命令执行部分重同步时的过程。
Redis 的复制积压缓冲区的结构图。
Redis 使用复制积压缓冲区来为断线的从服务器发送缺失数据的过程。
PSYNC
命令判断是执行部分重同步还是完整重同步的流程。
Redis 服务器监测命令缺失,并补发缺失命令的过程。
如果这时主服务器执行了命令 SET key value
(协议格式的长度为 33
字节),
将自己的复制偏移量更新到了 233
,
并尝试向从服务器传播命令 SET key value
,
但这条命令却因为网络故障而在传播的途中丢失,
那么主从服务器之间的复制偏移量就会出现不一致:
主服务器的复制偏移量会被更新为 233
,
而从服务器的复制偏移量仍然为 200
,
如图 15-24 所示。
在这之后,
当从服务器向主服务器发送 REPLCONF ACK 命令的时候,
主服务器会察觉从服务器的复制偏移量依然为 200
,
而自己的复制偏移量为 233
,
这说明复制积压缓冲区里面复制偏移量为 201
至 233
的数据(也即是命令 SET key value
)在传播过程中丢失了,
于是主服务器会再次向从服务器传播命令 SET key value
,
从服务器通过接收并执行这个命令可以将自己更新至主服务器当前所处的状态,
如图 15-25 所示。