若转载请表明来源,感谢!
本文结构:
- 阐明 Redis主从复制的几个要点(要点以本人觉得的重要程度进行排序,即重要点在前面,以便快速切入重点,加快理解)
- 复制功能的作用
- 主从复制阶段
- 详细说明Redis主从复制原理及处理过程
- 断线重连后的数据发送
- SYNC命令执行过程
- 流程图
说明:重点---以红色标示,次重点---以蓝色标示,命令---以紫色标示。
复制(REPLICATION)
Redis 支持简单易用的主从复制(master-slave replication)功能,该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制。
关于Redis主从复制的几点说明:
- Redis使用异步复制。从Redis2.8开始,从服务器会以每秒一次的频率向主服务器报告复制流(replicationstream)的处理进度。
- 复制功能不会阻塞主服务器:即使一个或多个从服务器正在进行初次同步,主服务器也可以继续处理请求命令。
- 复制功能也不会阻塞从服务器:只要在redis.conf配置文件中进行了相关的配置,即使从服务器正在进行初次同步,服务器也可以使用旧版本的数据集来处理查询命令。但是,在从服务器删除旧版数据集并载入新版本数据集的那段时间内,连接请求会被阻塞。
- 一个主服务器可以有多个从服务器。
- 除了主服务器可以具有从服务器,从服务器也可以同时具有从服务器,整个服务器架构可以形成一个树状结构。
复制功能作用
- 单纯用于数据冗余(data redundancy)
- 做读写分离架构:让多个从服务器处理只读命令请求,来提升扩展性(scalability)
- 让主服务器免于持久化操作,提高主服务器性能:关闭主服务器的持久化功能,然后由从服务器进行持久化操作。
主从复制阶段
Redis的复制功能分为 同步(sync)和 命令传播(command propagate)两个操作:
- 同步操作:作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。
- 命令传播:作用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。
主从复制原理及过程
同步
- 建立连接并向主服务器发送SYNC数据同步命令:无论是初次连接还是重新连接,当建立一个从服务器时,从服务器都将向主服务器发送一个SYNC命令(即同步命令)。
- 主服务器执行BGSAVE命令:接收到从服务器发送过来的SYNC命令后,主服务器开始执行BGSAVE命令(即进行rdb持久化过程,详细rdb过程可见后续持久化过程介绍的文章),在保存操作执行期间,将所有新执行的命令都保存到一个缓冲区中。
- 主服务器执行完毕BGSAVE命令后,主服务器将执行得到的.rdb文件发送给从服务器,从服务器接收到这个.rdb文件后,将文件中的数据载入到内存中。
- 之后主服务器会将以Redis命令协议的格式(类似aof追加命令的方式),将写命令缓存区中积累的所有内容都发送给从服务器,以保证主从数据的一致性。
命令传播
同步操作执行完毕后,主从服务器两者的数据库状态达到了一致状态,但每当主服务器执行完客户端发送的写命令时,主从服务器的数据库状态将不一致。
为了让主从服务器再一次回到一致状态,主服务器需要对从服务器执行命令传播操作:主服务器将自己执行的写命令,发送给从服务器执行,使主从服务器保持一致状态。
断线重连后的数据发送
- 从服务器可以在主从服务器之间的连接断开时,进行自动重连。
- 在Redis2.8 版本之前,在命令传播阶段断线重连后的从服务器总要执行一次完整重同步操作(full resynchronization),但2.8版本后,从服务器可以根据主服务器的情况来选择执行完整重同步还是部分重同步(partial resynchronization)。
- Redis2.8版本后,使用使用PSYNC命令代替SYNC进行同步操作。
- PSYNC:具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式,将在后文进行说明。
- 完整重同步:用于处理初次复制情况,与SYNC命令的执行步骤一致,即下一节的SYNC命令执行过程。
- 部分重同步:用于处理断线后重复制情况,当从服务器断线重连主服务器后,主服务器可以将从服务器断开期间执行的写命令发送给从服务器,保持主从数据一致。
SYNC命令执行过程
每次执行SYNC命令,主从服务器需要执行一下动作:
- 从服务器向主服务器发送SYNC命令:向主服务器发送数据同步请求。
- 主服务器执行BGSAVE命令生成RDB文件:生成RDB文件会耗费主服务器大量的CPU、内存和磁盘I/O资源。
- RDB文件发送:主服务器需要将自己生成的RDB文件发送给从服务器,这个过程会耗费主从服务器大量的网络资源(带宽和流量),并对主服务器响应命令请求的时间产生影响。
- 从服务器载入RDB文件数据:接收到RDB文件的从服务器需要载入主服务器发送过来的RDB文件,并且在载入期间,从服务器会因为阻塞而没有办法处理命令请求。
流程图
下一篇:旧版本主从复制的缺陷及新版的改进