- 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完成













网友评论