Redis 是一种基于内存的键值存储数据库,它采用异步复制(Asynchronous Replication)来实现数据的主从备份和数据的高可用性,主要通过两个缓冲区来实现复制功能,即 Replication Buffer 和 Repl Backlog Buffer。
- Replication Buffer
Replication Buffer 是 Redis 主服务器中的一个缓冲区,主要用于保存写命令请求,它以固定大小的循环数组的形式存储,当数组被写满之后,新写入的元素会从数组头部覆盖老数据。当主服务器接收到一个写命令请求时,就会将该命令序列化成 RDB 格式或 AOF 格式,并存放到 Replication Buffer 中,等待复制给从服务器。
在实际使用中,如果主服务器执行写入命令的速度大于从服务器复制命令的速度,那么 Replication Buffer 就会被耗尽,这时主服务器会停止处理写入命令请求,直到有新的空间可用。因此,在进行大量写入操作时,需要注意调整 Replication Buffer 的大小以及增加从服务器数量等设置。
2.Repl Backlog Buffer
Repl Backlog Buffer 是 Redis 从服务器中的一个缓冲区,用于保存主服务器发送的写命令请求,以及从服务器复制命令时需要的信息,例如 offset(偏移量) 和 replication ID(复制 ID)等。与 Replication Buffer 不同,Repl Backlog Buffer 的大小是固定的,并且不会被覆盖。
当从服务器进行复制时,它会向主服务器发送一个 PSYNC 命令,主服务器根据复制 ID 和 offset 等信息来确定从服务器的数据同步情况,并将未同步的数据发送给从服务器。主服务器通过 Repl Backlog Buffer 来保存已发送但尚未同步的数据,从而保证从服务器可以正确复制数据,并且可以从上一次同步失败的地方继续复制。
需要注意的是,Repl Backlog Buffer 中保存的数据是不会过期的,这可能会导致内存占用的增加和主从同步时的延迟,因此在使用 Redis 时需要定期清理 Repl Backlog Buffer 中的数据,以免占用过多的内存空间。
综上所述,Replication Buffer 和 Repl Backlog Buffer 都是 Redis 复制功能中非常重要的部分,通过这两个缓冲区的配合,Redis 实现了数据的主从备份和高可用性。在配置 Redis 时,需要合理地调整这些参数的大小和相关设置,以确保 Redis 服务器的正常运行。
网络断开又恢复后,从主从服务器会采用增量复制的方式继续同步,也就是只会把网络断开期间主服务器接收到的写操作命令,同步给从服务器。
主从复制中两个 Buffer(replication buffer 、repl backlog buffer)有什么区别?
replication buffer 、repl backlog buffer 区别如下:
- 出现的阶段不一样:
- repl backlog buffer 是在增量复制阶段出现,一个主节点只分配一个 repl backlog buffer;
- replication buffer 是在全量复制阶段和增量复制阶段都会出现,主节点会给每个新连接的从节点,分配一个 replication buffer;
- 这两个 Buffer 都有大小限制的,当缓冲区满了之后,发生的事情不一样:
- 当 repl backlog buffer 满了,因为是环形结构,会直接覆盖起始位置数据;
- 当 replication buffer 满了,会导致连接断开,删除缓存,从节点重新连接,重新开始全量复制。