Redis学习笔记(六)| 青训营笔记

78 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 20 天

八、复制

1、旧版复制功能的实现

1.1、同步

1.2、命令传播

为了防止主从服务器不一致,当主服务器收到能够让主从服务器不一致的命令,会把这个命令发送给从服务器

2、旧版复制功能的缺陷

SYNC命令是一个非常消耗资源的命令,所以我们要避免使用SYNC命令来进行同步。旧版复制的缺陷是,如果主从服务器断开后重新连接,这时候理论上主服务器只需要发送断开期间的写操作命令给从服务器,但是旧版的复制功能依然会执行SYNC命令,发送RDB文件给从服务器,这是一个非常低效的行为。

3、新版复制功能的实现

2.8以后有了新版的复制功能,同步命令被更改为PSYNC,PSYNC分为完全重同步和部分重同步,完全重同步就是之前SYNC同步,部分重同步是新的一项功能。

4、部分重同步的实现

4.1、复制偏移量

偏移量其实就是主服务器和从服务器一起分别维护的数字,这个数字记录了传播的字节数据,如果偏移量不同,则证明主从不一致。

4.2、复制积压缓冲区

主服务器维护了一个固定长度的先进先出队列,默认为1M,当主服务器有新的写命令的时候,不光是会通过命令传播给从服务器,还会写一份到积压缓冲区,当缓冲区的命令超过了设置的大小,则会弹出最早入队的命令。如果从服务器断线重连,则会发送自己的偏移量给主服务器,主服务器判断一下,从服务器的偏移量在不在积压缓冲区,如果在则发送缺少的命令给从服务器,如果不在则执行全部重同步的功能。

1M的大小是默认的,可以修改,我们要根据真实的业务环境来调整积压缓冲区的大小,既不能占用大量内存,又不能从服务器重连执行完整重同步。

4.3、服务器的运行ID(run ID)

主服务器再和从服务器建立建立以后会把自己的ID发送给从服务器保存,当断线重连的时候如果ID一样,那么说明主服务器没换,执行部分重同步,如果ID不一样,那么说明主服务器换了,直接执行完整重同步。

5、PSYNC命令的实现

实现主要是这个命令会携带一些相关的参数

6、复制的实现

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

2、建立Scoket连接

3、发送Ping命令

4、身份验证

5、发送端口信息

6、同步

7、命令传播

7、心跳检测

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

2、辅助实现min-slaves选项

3、检测命令丢失