Redis主从复制与心跳检测

主从实现

命令方式:

#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-slave选项

min-slaves-to-write 可正常连接的从服务器允许的最少数量
min-slaves-max-lag 从服务器延迟最大值(秒)

  • 检测命令是否丢失

通过发送给主服务器偏移量,主服务器可以比较是否需要部分重同步。

# Redis 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×