Redis主从复制

Redis主从复制

1. 第一次同步(全量复制)

  • 建立主从服务器连接

  • 同步数据:主服务器执行bgsave生成RDB文件,发送给从服务器,从服务器加载RDB文件

  • 在同步数据过程中新生成的写操作命令会被记录到从服务器的replication_buffer缓冲区,待从服务器加载完RDB文件后,执行这些写操作以实现主从一致。

    如果同步数据过程太长导致replication_buffer缓冲区满了,则重新连接后再做全量复制

2. 命令传播(异步)

第一次同步后,主从服务器之间维护一个TCP长连接,将主服务器上的写操作命令异步发送给从服务器。

若从服务器非常多,如果主服务器要和所有从服务器做一次全量复制太麻烦,为了分摊主服务器的压力,可以选定一个或多个从服务器充当“经理”的角色,主服务器只关心与“经理”的同步,其余从服务器的同步交给“经理”去解决

3. 增量复制

若主从服务器之间网络断开,会造成主从不一致。

Redis2.8以前,主从断开重连后会采用全量复制保证一致性。

Redis2.8以后,采用增量复制:

图片

主服务器维护一个环形缓冲区repl_backlog_buffer,主从命令传播时,还会把写操作命令记录到repl_backlog_buffer中,用一个master_repl_offset来记录主服务器写到哪了,而从服务器维护一个slave_repl_offset来记录自己读到哪了。

主从重连后,比较两个offset,只把相差的那一部分发送给从服务器,来实现同步。但由于这是一个环形缓冲区, 如果发现主服务器写的进度已经把从服务器读的进度“套圈”了,就还是会使用全量复制来同步

环形缓冲区repl_backlog_buffer的最小大小:重连平均时间 * 主服务器每秒生成写命令数据量大小,repl_backlog_buffer的大小至少要大于这个,以减少“套圈”的情况。


Redis主从复制
http://example.com/2025/05/15/Redis主从复制/
作者
Kon4tsu
发布于
2025年5月15日
许可协议