Redis第15章 复制
2020-12-27 本文已影响0人
Oliver_Li
- Redis集群部署的三种常见方式,
复制
、哨兵
、集群
。 - 复制
主写从读
,减缓单主的访问压力。 - 哨兵
主从切换
,主服务宕机备用服务可以做备用访问。 - 集群
分片+主从切换
,一般最少6台服务,3主3从分片分压、每组主从互相复制、互相备用。
15.1 复制旧版实现
- 书上举例说明了之前版本和v2.8的优化情况。
- Redis的复制功能分为
同步
和命令传播
:-
同步
:从服务器(slave)通过主服务器(master)获取RDB文件达到初始化复制目的。 -
命令传播
:同步后master新执行的命令会发送给slave,已达到后续同步的目的。
-
-
同步
的流程:- slave向master发送
SYNC
命令。 - master执行
BGSAVE
生成RDB文件
、因为BGSAVE
会创建子线程执行,所以master要记录生成文件这段时间的命令到一个缓冲区。 - 发送RDB文件、缓冲区命令给slave并执行,这时数据就是同步的了。
- slave向master发送
15.2 复制旧版缺点
-
SYNC
命令耗费资源:master生成RDB、RDB发送给slave、slave执行RDB时是阻塞的。 - 网络问题:如果slave因为网络问题断开了后续同步依然要执行一次
SYNC
15.3 新版优化
- 新版用
PSYNC
命令代替SYNC
命令,分为完整重同步
和部分重同步
,完整重同步
和SYNC
一样。 -
部分重同步
:将断开这段时间的命令单独发给slave。
15.4 部分重同步实现
-
复制偏移量
:master和slave都维护一个复制偏移量,master向slave传播N字节,双方就都+N,对比偏移量就知道主从是否一致。 -
复制积压缓冲区
:如何判断部分同步
还是完整同步
,复制积压缓冲区
默认生成1M缓冲区队列,master向slave传播字节时会同时传播到复制积压缓冲区
,如果slave恢复后发现偏移数据还在复制积压缓冲区
内,也就是1M,就选择部分同步
,否则完整同步
。 -
服务器运行ID
:初次复制时,master向slave传递一个ID,断开恢复时,slave的请求会带着ID,master判断ID相同,就选择部分同步
(如果满足复制积压缓冲区
的条件),因为可能会出现slave认错master的场景,否则完整同步
。
15.5 PSYNC命令的实现:
PSYNC流程15.6 复制的完整实现
-
SLAVEOF
是异步命令,slave设置master的ip和端口后就返回成功。 - slave向master创建socket连接,并创建一个专门用来复制的事件处理器,完成接收RDB文件、接收传播的命令等
- slave向master发送PING命令,检查套接字和命令处理是否正常运行,出现任何问题就重连。
- 如果master需要验证身份,PING之后就是slave向master发送密码
- 然后slave向master发送自身端口号,方便用户在master查询slave端口信息
- 之后就是执行PSYNC命令,这时master也会变成slave的客户端,方便后续发送缓冲的
命令传播
等。
15.7 心跳监测
- 每秒执行一次,监测网络状态。
- 心跳监测也会带着命令偏移量,随时检查是否出现不同步的状况,随时同步数据。
总结:
- 复制主要考虑的有几个方面:
- slave初次向master申请,master生成RDB文件并发到slave完成
同步
- 注意master生成RDB文件期间的命令要记录下来,补给slave
-
同步
后master再处理命令会用socket命令传播
到slave达到持续同步 - 主从网络断开后,可以根据差量大小选择
完整重同步
或部分重同步
不会发生只要断开就全量同步
的结果 - 持续心跳监测网络和偏移量,以便同步。
- slave初次向master申请,master生成RDB文件并发到slave完成