Redis之主从复制的实现原理

Redis之主从复制的实现原理

必备知识:https://blog.csdn.net/sinat_32366329/article/details/81160282 如果不具备RDB持久化知识,请先看完这篇文章。

旧版复制功能的实现

         Redis的复制功能可以分为同步命令传播两个操作:

         同步操作用于将从服务器的数据库状态更新至主服务器当前所处的状态。

         命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态不一致时,让主从服务器的数据库重新回到一致状态。

同步

         当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先要执行同步操作,即将从服务器的数据库状态更新至主服务器当前所处的数据库状态。

         同步过程步骤如下:

  1. 从服务器向主服务器发送SYNC命令。
  2. 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
  3. 当主服务器的BGSAVE命令执行完毕,主服务器将生成的RDB文件发送给从服务器,从服务器接收并加载这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令是的数据库状态。
  4. 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器当前所处的状态。

同步图解过程

命令传播

在同步操作完毕后,主从服务器两者的数据库状态达到一致,但是如果客户端发送写命令给主服务器时,将导致主从服务器状态不一致。

为了让主从服务器数据一致,主服务器需要对从服务器执行命令传播操作:主服务器会将自己执行的那条写命令,发送给从服务器执行,当从服务器执行了该写命令后,主从服务器将再次回到一致状态。

旧版复制功能的缺陷2.8以前

         在Redis中,从服务器对主服务器的复制可以分为以下两种情况:

  1. 初次复制:从服务器以前没有复制过任何主服务器。或者上次复制的主服务器和这一次不是同一个主服务器。
  2. 短线后重新复制:处于命令传播阶段的主服务器因为网络原因而中断复制,但从服务器通过自动重现连接上了主服务器,并继续复制主服务器。

图解过程如下

严重缺陷

  1. 主服务器在时间T0到T10086过程中一直处于一致状态。这两个服务器的数据是一样的。
  2. 从服务器断开重连后,只需要主服务器的K10087,K10088,K10089三个命令即可,但是主服务器却返回了一个新的RDB文件,如果RDB文件很大,必将导致严重的内存问题。

新版复制功能的实现2.8开始

         为了解决旧版的问题,Redis2.8以后引入了PSYNC代替SYNC命令执行复制时的同步操作。

         PSYNC命令具有完全同步和部分重同步功能。

         完全同步和旧版的同步是一样的。

         部分重同步主要是用于断线后的重复制情况:当从服务器断开重新连接后,如果条件允许,主服务器将断开期间的写命令发给从服务器,从服务器执行断开期间的写命令完成同步,将数据库更新到和主服务器一致。

部分重同步的实现

  1. 主服务器的复制偏移量和从服务器的复制偏移量。
  2. 主服务器的复制积压缓冲区(队列,默认1MB)。
  3. 服务器的允许ID。

主服务器和从服务器都会维护一个复制偏移量,主要是用户对比复制的执行结果。例如主从服务器的复制偏移量均为1000,当主服务器完成了3个写命令后,主服务器偏移量为1003,这时候将3个命令给从服务器执行,从服务器执行完毕,复制偏移量也为1003。

如果主从服务器的数据是一致的,那么他们的偏移量也是一致的。

复制积压缓冲区,在主服务器将写命令给从服务器后,还会写入到复制积压缓冲区,如果执行到了偏移量为1003的时候,从服务器A断开,主服务器继续执行了7个写入命令,这时候主服务器的偏移量为1100,A服务器连接上,请求复制主服务器,这时候主服务器会分情况处理。

1)主服务器不是A从服务器之前复制的主服务器(根据服务器ID判断),执行完全同步。

2)发现A从服务器之前复制的是自己。根据A从服务器的偏移量去复制积压缓冲区中看1004-1100命令是否依然存在,如果存在将1004-1100偏移量的命令返回给A从服务器执行。如果不存在,只能执行完全同步恢复数据一致了。

关注微信公众号(程序员小兔)不定期分享技术

### 实现 Redis 主从复制的方式 #### 配置方法 为了配置 Redis主从复制,需先理解基本概念并完成几个关键步骤。默认情况下,了解过 Redis 的持久化功能是有帮助的,即 RDB 和 AOF 功能[^2]。 1. **拉取 Redis 镜像** 对于基于 Docker 的环境来说,可以通过命令 `docker pull redis` 来获取最新的官方 Redis 镜像版本[^4]。 2. **启动 Redis 容器** 创建两个或多个容器实例来模拟不同的服务器节点。使用如下命令分别启动主节点和从节点: ```bash # 启动主节点 docker run --name master -d redis redis-server --appendonly yes # 启动从节点并与主节点关联 docker run --slaveof <master-ip> 6379 --appendonly yes ``` 这里 `<master-ip>` 应替换为主机的实际 IP 地址。 3. **验证主从关系建立成功与否** 连接至任意一个 Redis 实例并通过执行命令 `INFO REPLICATION` 或者更简便地利用 `ROLE` 命令查询当前角色状态,确认两者间已形成正确的主从关系[^3]。 #### 工作原理 Redis 主从复制机制主要依赖于全量复制与增量复制两种方式共同维持数据的一致性。 - **全量复制**发生在初次建立连接时,此时会触发一次完整的数据库快照传输给新的 Slave 节点;这期间 Master 可能继续接收客户端求,因此还会记录下所有在此阶段产生的变更指令集作为缓冲区的一部分待稍后发送给 Slave。 - **增量复制**则是指当网络中断或其他原因造成部分更新丢失之后重新建立起的数据同步过程。现代版 Redis 支持通过偏移量追踪未被传递过的更改项,并采用 PSYNC 协议实现高效重传而非每次都做完全拷贝。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值