Redis主从复制简析

115 阅读2分钟

旧版主从复制

旧版主从复制主要有个操作:

  1. 同步(sync)
  2. 命令传播(command propagate)

1. 同步

image.png

2. 命令传播

image.png

缺陷:

每次进行断线重连时,就要进行全量复制,影响资源

1. BGSAVE 生成RDB快照会影响主服务器的I/O资源,cpu资源
2. 传输大量数据浪费网络资源
3. 从服务器进行同步时,阻塞,没法处理命令请求

新版复制psync

  1. 完整同步
  2. 部分同步

部分同步实现

image.png

复制积压缓冲区(repl_backlog_buffer)

image.png

如果需要同步的数据超过了复制积压缓冲区,就需要全量复制。

PSYNC实现

image.png

一些TRICKY POINT

从库过多怎么办:

主从从模式

image.png

repl-backlog-buffer和 replication buffer的区别

1、repl_backlog_buffer:就是上面我解释到的,它是为了从库断开之后,如何找到主从差异数据而设计的环形缓冲区,从而避免全量同步带来的性能开销。如果从库断开时间太久,repl_backlog_buffer环形缓冲区被主库的写命令覆盖了,那么从库连上主库后只能乖乖地进行一次全量同步,所以repl_backlog_buffer配置尽量大一些,可以降低主从断开后全量同步的概率。而在repl_backlog_buffer中找主从差异的数据后,如何发给从库呢?这就用到了replication buffer。

2、replication buffer:Redis和客户端通信也好,和从库通信也好,Redis都需要给分配一个 内存buffer进行数据交互,客户端是一个client,从库也是一个client,我们每个client连上Redis后,Redis都会分配一个client buffer,所有数据交互都是通过这个buffer进行的:Redis先把数据写到这个buffer中,然后再把buffer中的数据发到client socket中再通过网络发送出去,这样就完成了数据交互。所以主从在增量同步时,从库作为一个client,也会分配一个buffer,只不过这个buffer专门用来传播用户的写命令到从库,保证主从数据一致,我们通常把它叫做replication buffer。

Ref

  • Redis设计与实现