Redis 是如何实现主从同步的
replica 在配置 replicaof
参数之后,会发送 PSYNC
命令到 master。
PSYNC replicationid offset
这里分为两种情况:
- replica 希望做全量同步,那就可以发送
PSYNC ? -1
,然后 master 会把执行save
的结果,也就是 RDB 文件发送给 replica,然后 master 不断将新的命令同步给 replica,这个同步是 RESP 格式的。 - replica 希望做增量,那就可以将
replicaid
和当前的offset
发送到 master,这个时候不能保证发生增量同步,还得看 master 是否有offset
之后的数据,Redis 把这个叫做 backlog,backlog 可以通过info replication
查看。如果需要的增量数据不在 backlog 中,master 会通知 replica 进行全量同步,这个就和 1 相同了,如果在的话会将offset
之后的数据以 RESP 格式发送给 replica。
如果对这个流程感兴趣,可以看看:使用 Go 模拟 replica,从 master 同步数据
Key 过期是如何实现的
key 过期的时候(包括被驱逐),master 会发送 del key
到 replica,这样就可以保持数据一致。
除此之外,replica 实现了如果检测到 key 过期,对于客户端的读操作就视作 key 不存在,然后等待 master 的删除命令。
一旦 replica 提升为 master,自身会开始控制 key 的过期,不会依赖之前的 master。