Redis 的主从复制
- 1、主从复制的实现
- 2、主从复制的同步功能(PSYNC)
- 2.1、部分重同步
本文讲解的Redis 主从复制机制,是基于 2.8及以后的版本而言,2.8以前的版本主从复制机制与此有所不同,请知悉。
Redis的复制功能分为 同步
(psync) 和 命令传播
(command propagate)两个操作。
1、主从复制的实现
-
① 设置主服务器的地址和端口
# 查看redis服务在集群中的主从角色 info replication # 设置主从关系:设从不设主 # 在Redis5.0之前的版本中,配置主从复制通常使用SLAVEOF命令。从Redis5.0开始,推荐使用REPLICAOF命令来代替SLAVEOF ## 在从服务器上设置 slaveof <主服务器ip> <主服务端口>
-
② 建立套接字连接
-
③ 发送 PING 命令
-
④ 身份验证
-
⑤ 发送端口信息
-
⑥ 同步
- PSYNC 执行完整重同步或部分重同步。
-
⑦ 命令传播
- 完成同步后,主从服务器就进入命令传播阶段。当主服务器的数据库状态被修改(例如,执行了写命令如SET、DEL等)时,主从服务器的数据库状态可能会出现不一致。为了解决这个问题,主服务器会将导致不一致的写命令(即主服务器接收到的新写命令)发送给从服务器,从服务器在接收到这些命令后会执行它们,从而使其数据库状态与主服务器保持一致。
2、主从复制的同步功能(PSYNC)
2.8及以后的版本主从复制主要是基于 PSYNC 命令,PSYNC命令具有完整重同步(full resynchronization) 和部分重同步(partial resynchronization)两种模式。
- 完整重同步:用于处理初次主从复制的情况。通过让主服务器创建并发送 RDB 文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。
- 部分重同步:用于处理断线(网络抖动等)后主从复制情况。当从服务器在断线后重新连接主服务器时,如果条件允许(如从服务器提供的复制偏移量在复制缓冲区内),主服务器将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器接收并执行这些写命令。
使用 PSYNC 命令来进行断线后重复制时间流程图:
时间线 | 主服务器 | 从服务器 |
---|---|---|
T0 | 主从服务器完成同步 | 主从服务器完成同步 |
T1 | 执行并传播 SET k11 v11 | 执行主服务器传来的 SET k11 v11 |
T2 | 执行并传播 SET k22 v22 | 执行主服务器传来的 SET k22 v22 |
… | … | … |
T180 | 执行并传播 SET k99 v99 | 执行主服务器传来的 SET k99 v99 |
T181 | 执行并传播 SET k100 v100 | 执行主服务器传来的 SET k100 v100 |
T182 | 主从服务器连接断开 | 主从服务器连接断开 |
T183 | 执行 SET k101 v101 | 断线中,尝试重新连接主服务器 |
T184 | 执行 SET k102 v102 | 断线中,尝试重新连接主服务器 |
T185 | 执行 SET k103 v103 | 断线中,尝试重新连接主服务器 |
T186 | 主从服务器重新连接 | 主从服务器重新连接 |
T187 | 向主服务器发送 PSYNC 命令 | |
T188 | 向从服务返回 +CONTINUE 回复,表示执行部分重同步 | |
T189 | 接收 +CONTINUE 回复,准备执行部分重同步 | |
T190 | 向从服务器发送 SET k101 v101、SET k102 v102、SET k103 v103 三个命令 | |
T191 | 接收并执行主服务器传来的三个 SET 命令 | |
T192 | 主从服务器再次完成同步 | 主从服务器再次完成同步 |
2.1、部分重同步
部分重同步主要有以下三个部分构成:
- ① 主服务器的复制偏移量(replication offset) 和从服务器的复制偏移量。
- ② 主服务器的复制积压缓冲区(replication backlog)
- ③ 服务器的运行ID(runid)
重点说一下主服务器的复制积压缓冲区:当主服务器进行命令传播时,它不仅将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区。主服务器的复制积压缓冲区会保存一部分最近传播的写命令,并且复制积压缓冲区会为队列中的每个字节记录相应的复制偏移量。复制积压缓冲区设置的默认大小为 1MB.
.