主从实现
命令方式:
#replicaof是新版本的命令,旧版本(5.0.0之前)是slaveof命令
replicaof host port
或者
slaveof host port
从节点手动执行命令slaveof no one,这样执行以后使自己成为主节点,然后其他从节点就可以手动连接到新主节点
配置方式:
#配置主机的ip端口
replicaof <masterip> <masterport>
#配置主机的密码
masterauth <mster-requirepass>
旧版复制原理(2.8以前)
初次复制
初次复制时,从节点向主节点发送SYNC命令,主节点会执行BGSAVE命令,生成RDB文件,并且在RDB文件生成过程中主节点执行的命令会被记录到缓冲区中;生成完毕后将RDB文件与缓冲区的命令发送给从节点,从节点就有了主节点的全部数据库状态。之后主节点执行的命令会记录到缓冲区,给从节点完成同步。
断线重复制
当从节点断线重连后,会再次向主节点发送SYNC命令,完成全量同步。(因为从节点包含了掉线之前的主节点数据库状态,所以没有必要全量同步,这种方式效率比较低)
新版复制原理(2.8之后)
Redis2.8之后使用PSYNC命令来代替SYNC命令
初次复制
初次复制与2.8之前的SYNC相同。
断线重复制
使用部分重同步,主节点只将主从服务器断开期间执行的命令发送给从节点,从节点接收并执行这些命令就可以恢复到主节点的数据库状态。
部分重同步实现原理:
- 复制偏移量offerset(记录主从节点的数据字节数)
- 复制缓冲区(固定长度先入先出的队列)
- 运行ID(每个节点的唯一标识,用来记录主从节点关系)
心跳检测
在命令传播阶段,从服务器每秒一次向主服务器发送REPLCONF ACK <offerset>命令,来确保:
如果主服务器超过1秒没有收到从服务器发来的心跳检测命令,说明从服务器不能正常和主服务器连接,主服务器会把上一次发送ACK的时间记录到lag里。
min-slaves-to-write 可正常连接的从服务器允许的最少数量
min-slaves-max-lag 从服务器延迟最大值(秒)
通过发送给主服务器偏移量,主服务器可以比较是否需要部分重同步。