完整重同步用于处理初次复制情况:完整重同步的执行步骤和sync命令的执行步骤一样,他们是通过让主服务器创建并发送rdb文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。

Redis 2.8 以前的复制功能不能高效地处理断线后重复制情况, 但 Redis 2.8 新添加的部分重同步功能可以解决这个问题。

部分重同步通过复制偏移量、复制积压缓冲区、服务器运行 ID 三个部分来实现。

复制偏移量

执行复制的双方-主服务器和从服务器会分别维护一个复制偏移量。

复制积压缓冲区

复制积压缓冲区是由服务器维护的一个固定长度(fixed-size)先进先出(FIFO)队列,默认大小为1MB。当主服务器进行命令传播时,它不仅会将命令发送给所有从服务器,还会将命令写入复制积压缓冲区里面。

在复制操作刚开始的时候, 从服务器会成为主服务器的客户端, 并通过向主服务器发送命令请求来执行复制步骤, 而在复制操作的后期, 主从服务器会互相成为对方的客户端。

主服务器通过向从服务器传播命令来更新从服务器的状态, 保持主从服务器一致, 而从服务器则通过向主服务器发送命令来进行心跳检测, 以及命令丢失检测。

复制的实现

1.设置主服务器的地址和端口

127.0.0.1:12345> slaveof 127.0.0.1:6379

2.建立套接字连接

3.发送ping命令

4.身份验证

5.发送端口信息

6.同步

7.命令传播

心跳检测

1.检测主从服务器的网络连接状态

127.0.0.1:6379> info repliaction

2.辅助实现min-slaves配置选项

min-slaves-to-write 3

min-slaves-max-lag 10

ps:在从服务器的数量小于3个,或者三个服务器的延迟(lag)值都大于或等于10秒时,主服务器将拒绝执行写命令

3.检测命令丢失

内容来自:<redis设计与实现>这本书