Redis是一种高性能的键值数据库,它支持主从复制,即一个主节点可以有多个从节点,从节点可以接收主节点的数据更新,并提供读服务。这样可以提高Redis的可用性和扩展性,同时也可以实现数据的备份和容灾。
Redis主从复制的原理是基于复制日志(replication backlog)和心跳包(ping-pong)的。复制日志是主节点维护的一个固定大小的环形缓冲区,用来记录所有对数据集的写操作。心跳包是主节点和从节点之间定期发送的小数据包,用来检测连接是否正常,并传递一些元信息,如复制偏移量(replication offset)和复制延迟(replication lag)。
当一个从节点连接到一个主节点时,会触发一次全量同步(full synchronization)。全量同步的过程如下:
1.从节点向主节点发送SYNC命令
2.主节点接收到SYNC命令后,会执行BGSAVE命令,将当前数据集保存到一个RDB文件中,并将此时的复制偏移量记录下来
3.主节点将RDB文件发送给从节点,并继续将复制日志中的写操作缓存起来
4.从节点接收到RDB文件后,会清空自己的数据集,并载入RDB文件中的数据
5.从节点向主节点发送ACK命令,表示已经完成了全量同步
6.主节点收到ACK命令后,会将缓存的写操作发送给从节点,完成增量同步(partial synchronization)
在全量同步完成后,主节点和从节点之间就会进入增量同步模式。增量同步的过程如下:
1.主节点每执行一次写操作,就会将其追加到复制日志中,并发送给所有已连接的从节点
2.从节点每接收到一次写操作,就会执行它,并更新自己的复制偏移量
3.主节点和从节点之间每隔一秒就会互相发送心跳包,以保持连接并交换元信息
如果主节点和从节点之间出现网络故障或其他异常情况,导致增量同步中断,那么当恢复连接后,会尝试进行部分重同步(partial resynchronization)。部分重同步的过程如下:
1.从节点向主节点发送PSYNC命令,附带自己的运行ID(run ID)和复制偏移量
2.主节点根据运行ID判断是否是同一个复制对话(replication session),并根据复制偏移量判断是否能够继续增量同步
3.如果条件满足,主节点会回复+CONTINUE,并将从节点所缺失的写操作发送给它
4.如果条件不满足,主节点会回复+FULLRESYNC,并重新生成一个运行ID,并触发一次全量同步
为了查看Redis的主从状态,我们可以使用redis-cli命令行工具。