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主从复制/