复制
复制之后的主从服务器会保存同样的数据,维持相同的状态
Redis主从复制以及主从复制原理 - 知乎 (zhihu.com)
SLAVEOF 主服务器地址
1. 同步
同步(SYNC/PSYNC)是复制的第一步,目的是使得从服务器转换为和主服务器同样的状态;其在旧版和新版redis中的实现原理有所不同。
旧版:从服务器发送SYNC指令,当主服务器接收到指令之时,首先执行BGSAVE,在后台生成此刻状态对应的RDB文件,同时,前台缓冲区中将保存从此刻开始的所有写命令;当RBD文件生成完毕后,发送给从服务器,然后再把缓冲区中的命令数据发给从服务器;从服务器从而恢复出和主服务器同样的状态。
新版:一个完整的SYNC指令是相当耗时的!而某些情况下,SYNC不是必要的,比如某个时刻从服务器突然断电,和主服务器断开连接,而一段时间后重新连接好,那么此时从服务器只需要执行断电期间的主服务器写命令即可;PSYNC和SYNC的区别就在这里,PSYNC包含完全复制和部分复制,让系统自动选择更优的同步方案。
2. 命令传播
命令传播是复制的第二步,当SYNC完成之后,每当主服务器执行完新的写命令导致状态发生变化时,都需要发送指令给从服务器,从而让从服务器发生相同的变化;
3. 心跳检测
REPLCONF ACK <offset>
:从服务器需要每秒钟向主服务器发送一次这个命令(心跳检测),作用是检测当前网络连接是否正常,是否正确同步(如果从服务器offset落后的话,通过心跳检测,主服务器就会把缺失的命令重新发给从服务器)
4. 底层原理
PSYNC:关键就是偏移量(offset),定长队列(复制积压缓冲区),服务器运行ID这三者;主服务器和从服务器都会保存一个offset(单位为字节),表示当前服务器已经同步的位置,比如说,如果当前主服务器的offset是1023,随后它向从服务器发送了包含10个字节的命令用于命令传播,那么对应的offset就变为1033,对于从服务器,则是一样的道理;定长队列的长度默认为1MB,可以自行设置,其包含了最近一段时间主服务器所发出的指令字节以及对应的offset,当超出长度时,则最早的一些指令溢出;从服务器发送PSYNC之后,同时发送自己的offset,然后主服务器判断自己的定长队列中的offset区间是否包含从服务器的offset,如果包含,那么就执行部分复制(因为这部分的指令还是保存起来的嘛),反之则只能是完整的SYNC;此外,还会判断从服务器断联之前的主服务器ID和当前将要进行同步的主服务ID是否一致,来判断到底是部分重复还是完全重复;
网络连接:复制之后的主从服务器都是对方的客户端;主服务器成为从服务器的客户端主要是为了完成SYNC/PSYNC所需的命令数据或RDB数据的发送。