Redis主从库数据同步
-
全量复制(主从库第一次同步)
-
增量复制
-
使用场景
- 网络断连或阻塞会导致主从库无法进行命令传播,而重新进行一次全量复制开销过大,此时主从库使用增量复制同步数据
-
同步过程
- 主从库断开后,主库会把期间收到的写操作命令写入replication buff和repl_backlog_buffer缓冲区中
- repl_backlog_buffer是一个环形缓冲区,slave_repl_offset为从库下标,master_repl_offset为主库下标
- 主从库连接恢复后,从库首先发送psync命令,并把自己当前的slave_repl_offset发给主库
- 主库把处于master_repl_offset和slave_repl_offset之间的命令操作同步给从库完成同步
-
repl_backlog_buffer缓冲区
- 由于repl_back_log_buffer是一个环形缓冲区,当主从库读取速度差异过大有可能导致从库未读的操作被主库的新写操作覆盖,造成主从库数据不一致
- 缓冲空间⼤⼩ = 主库写⼊命令速度 * 操作⼤⼩ - 主从库间 ⽹络传输命令速度 * 操作⼤⼩,实际应用中考虑其他突发情况,通常把这个缓冲空间扩大一倍
- 可以考虑使用切片集群分担单个主库的请求压力
- repl_backlog_buffer是所有从库共享的
-
断线重连后同步选择
- 由于repl_backlog_buffer存在覆盖的情况,重连后主库会根据从库的slave_repl_offset选择全量复制还是增量复制
-