记录一个面试题
Redis主从复制模式是如何进行数据同步的
先画个图让自己记忆深刻一点
- 主从复制数据同步分为两类
- 第一次同步
- 增量或者全量同步
描述一下回答的关键点
- 每一个redis实例都会有一个 runId 作为唯一标识
- 在slave 执行命令 replicaof [ master ip] ,注册为slave
- 第一次同步时,为全量同步
3.1 slave 发送psync 命令给master
3.2 master 接受命令后,执行save 命令,生成RDB文件
3.3 发送RDB文件给slave,同时会发送 runid 给slave
3.4 slave 清空之前数据,加载RDB文件
3.5 master 推送 replication buffer中的写操作给slave
后续正常的命令同步也是主库将命令写到replication buffer然后发给从库
完成数据同步 - 如何增量同步
4.1 master 除了会将写操作保存到 replication buffer ,同时会保存一份到repl_backlog_buffer。
4.2 每一次同步,master 和slave 都会记录 一个偏移量。保持一致
4.3 需要增量同步时,slave 发送 master runid 和 offset 偏移量 ,master从repl_backlog_buffer记录中获取后面的写操作,发送给 replication buffer ,由replication buffer 将增量操作发送给slave - 那些情况会发生全量同步
5.1 第一次同步
5.2 当slave下线重新下线时,发送runid发现不是之前的master,会重新全量同步。全量同步会清空之前数据
5.3 当偏移量数据不在repl_backlog_buffer中,进行全量同步