文章目录
引言
Redis的复制功能分为同步
和传播
两个过程:
同步
:将从服务器的数据库状态更新至主服务器当前所处的状态;传播
:在主服务器的数据库状态被修改导致主从服务器数据库状态出现不一致时(如,主服务器执行写命令后),让主从服务器的数据库重新达到一致状态;
1. 相关命令
slaveof host port
- 设置当前服务器去复制运行在
host:port
的服务器,当前服务器被称为从服务器,被复制的服务器称为主服务器;
slaveof no one
- 取消复制其他服务器
info replication
- 查看当前服务器的复制信息
2. 同步
2.1 两种需要同步的情况
在两种情况下需要执行数据库同步:初次复制
和断线后复制
;
- 初次复制:
- 从服务器以前没有复制过任何主服务器(即使以前复制过主服务器,只要执行过
slaveof no one
也认为没有复制过任何主服务器,即当前服务器状态是master
) - 或者,从服务器当前要复制的主服务器和上次复制的主服务器不同(即,需要重新执行同步)
- 断线后重复制:
- 处于命令传播阶段的主从服务器因为网络原因中断了复制,但从服务器通过自动重连重新连接上了主服务器,并继续复制主服务器;
2.2 两种同步方法
Redis2.8以前的版本,使用SYNC
命令,在两种情况下都实行完整同步,Redis2.8版本开始使用PSYNC
命令代替SYNC
命令,支持两种同步方式:完整重同步和部分重同步
- 完整重同步:将主服务器的数据库状态在后台生成RDB文件,发送给从服务器,从服务器加载RDB文件达到数据库状态一致。步骤:
- 从服务器向主服务器发送同步命令(
SYNC
或PSYNC
); - 主服务器收到同步命令后,执行
BGSAVE
命令,在后台生成RDB文件,同时使用一个缓冲区记录生成RDB文件期间,主服务器执行的新的写命令; - 主服务器的
BGSAVE
命令执行完毕后,主服务器将生成的RDB文件发送给从服务器; - 从服务器接收并载入RDB文件,将自己的数据库状态更新至主服务器执行
BGSAVE
命令时的状态; - 主服务器将记录在缓冲区里面的所有新产生的写命令发送给从服务器;
- 从服务器执行这些写命令,将自己的数据库状态更新至主服务器当前所处的状态;
- 主从服务器数据库状态达到一致,之后主服务器再有写命令,通过命令传播发送给从服务器,保证主从服务器的数据库状态一致;
- 部分重同步:主服务器将断线期间的命令发送给从服务器,从服务器接收并执行这些命令完成数据库状态一致。
- 当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前的状态;
- 部分重同步依赖服务器运行ID、复制积压缓存区、复制偏移量来实现断线期间缺失命令的补发;
2.3 SYNC
和PSYNC
命令
SYNC
SYNC
命令是Redis2.8以前使用的同步命令;在初次复制和断线后重复制时都使用完整同步;- 完整同步是一个非常耗费资源的操作:
- 主服务器需要执行
BGSAVE
命令来生成RDB文件,这个生成操作会耗费主服务器大量的CPU、内存和磁盘I/O资源; - 主服务器需要将生成的RDB文件发送给从服务器,这个发送操作会耗费主从服务器大量的网络资源ÿ