redis主从复制

Redis 主从复制

Redis主从结构

Redis主从读取结构

所有的数据修改只在主服务器上进行,然后将最新的数据同步给从服务器,这样就使得主从服务器的数据是一致的。

从连接主

从第一次连接主

从服务器请求连接主服务器

服务器 B 执行这条命令
replicaof <服务器 A 的 IP 地址> <服务器 A 的 Redis 端口号>

从服务器发送psync命令

psync runID offset

其中:

  • runID: 每个 Redis 服务器在启动时都会自动生产一个随机的 ID 来唯一标识自己。当从服务器和主服务器第一次同步时,因为不知道主服务器的 run ID,所以将其设置为 "?"。
  • offset: 表示复制进度,第一次连接为-1

主服务器返回复制请求

fullresync runID offset
  • runID: 主服务器的 run ID
  • offset: 主服务器的复制偏移量

从服务器接收到后会保存runID和offset

全量复制

全量复制出现在第一次连接和连接断开后重新连接时。

主服务器执行bgsave命令,fork一个子进程,将内存数据以rdb文件格式进行保存,然后发送给从服务器

注意三个时间间隙:

  • 主服务器生成rdb文件时
  • 主服务器发送rdb文件时
  • 从服务器加载rdb文件时

在这三个时间段,请求会记录到 replication buffer中,直到从服务器完成加载rdb文件到内存中,主服务器会将replication buffer缓存的写命令发送给从服务器,这样就保证了主从服务器的数据一致性。

命令传播

命令同步图

主从服务器连接会一直keep,用于发送写操作,属于长连接,叫做基于长连接的命令传播

目的是为了避免重复tcp连接造成的性能开销

增量复制

增量复制适用于主从连接建立后,网络波动导致断开,二者重新连接并进行数据同步

2.8版本添加

主从网络波动

从服务器重新连接到主服务器后,会再次发送psync命令,但这次发送,runIDoffset是已知的

主从重建连接

这里涉及到replication bufferrepl_backlog_bufferreplication offset

redis cmd buffer

  • repl_backlog_buffer:这是一个环形缓冲区,一个主服务器只存在一个repl_backlog_buffer,写命令在执行结束后会记录在repl_backlog_buffer
    在buffer满时,会重新头部命令,保证最新的命令在buffer中

  • replication buffer: 在全量复制阶段和增量复制阶段都会出现,主节点会给每个新连接的从节点,分配一个 replication buffer,满了,会导致连接断开,删除缓存,从节点重新连接,重新开始全量复制

  • replication offset: 用于repl_backlog_buffer偏移量记录
    主服务器使用master_repl_offset来记录自己「写」到的位置,从服务器使用slave_repl_offset 来记录自己「读」到的位置。

posted @   我才不是老家伙  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示