Redis 的主从复制(Master-Slave Replication)是一种机制,它允许将一个 Redis 服务器的数据复制到多个从服务器。这种复制模式可以用于多种目的,包括读写分离、数据冗余和高可用性。
主从复制的工作原理
-
全量同步(Full Resynchronization):
- 当从服务器第一次连接到主服务器或者在某些情况下需要重新同步时,会触发全量同步。
- RDB 文件传输:主服务器执行
bgsave
命令来生成 RDB 快照文件,并将其发送给从服务器。 - 命令缓冲:在生成 RDB 文件的同时,主服务器会将此期间接收到的所有写命令缓存在内存中。
- 快照加载:从服务器接收到 RDB 文件后,会清空现有数据库并加载 RDB 文件中的数据。
- 重放命令:从服务器加载完 RDB 文件后,主服务器会将之前缓存的写命令发送给从服务器进行重放,以确保数据的一致性。
-
部分同步(Partial Resynchronization):
- 在 Redis 2.8 及以上版本中引入了部分同步功能,这使得在网络中断等情况下的重新同步更加高效。
- PSYNC 命令:从服务器使用
PSYNC
命令请求主服务器进行部分同步。PSYNC
包含了上次同步时的偏移量。 - 复制积压缓冲区:主服务器维护了一个复制积压缓冲区(replication backlog),其中保存了一定数量的最近执行过的写命令。
- 条件检查:如果从服务器请求的部分同步所需的命令仍然存在于主服务器的复制积压缓冲区中,那么主服务器就会直接将这些命令发送给从服务器,而不需要进行全量同步。
-
持续同步:
- 一旦全量或部分同步完成后,主服务器会继续将后续的写命令实时发送给从服务器。
- 这些命令通过 Redis 的发布/订阅机制传递,具体是通过
REPLICAOF
或SLAVEOF
命令建立的复制流。
复制流程
-
初始化:
- 从服务器启动并配置为从服务器,指定主服务器的地址和端口。
- 从服务器向主服务器发送
REPLICAOF
或SLAVEOF
命令。
-
全量同步:
- 如果是首次同步或者无法进行部分同步,主服务器会生成 RDB 文件并发送给从服务器。
- 从服务器接收 RDB 文件并加载。
-
部分同步:
- 如果网络中断后重新连接,从服务器尝试进行部分同步。
- 主服务器根据从服务器提供的偏移量决定是否可以进行部分同步。
-
持续同步:
- 主服务器将新的写命令实时发送给从服务器。
- 从服务器不断应用这些命令,保持与主服务器的数据一致。
注意事项
- 延迟:由于主从之间的数据同步是异步的,所以从服务器的数据可能会有一定的延迟。
- 故障恢复:如果主服务器宕机,需要手动或自动地将其中一个从服务器提升为主服务器。
- 带宽消耗:全量同步会占用大量的网络带宽,尤其是在大数据集的情况下。
- 一致性:默认情况下,Redis 不保证强一致性,但从 Redis 5.0 开始,可以通过
WAIT
命令来实现一定程度的一致性控制。
通过主从复制,Redis 提供了简单但强大的数据复制功能,适用于各种需要数据冗余和负载均衡的应用场景。