redis主从同步原理(浅谈)

redis主从同步原理(浅谈)1 前言在 redis 中为了保证 redis 的高可用 一般会搭建一种集群模式就是主从模式 主从模式可以保证 redis 的高可用 那么 redis 是怎么保证主从服务器的数据一致性的 接下来我们浅谈下 redis 主 master 从 slave 同步的原理 2 初次全量同步当一个 redis 服务器初次向主服务器发送 salveof 命令时 redis 从服务器会进行一次全量同步 同步的步骤如下图所示 s

1.前言

在redis中为了保证redis的高可用,一般会搭建一种集群模式就是主从模式。

主从模式可以保证redis的高可用,那么redis是怎么保证主从服务器的数据一致性的,接下来我们浅谈下redis主(master)从(slave)同步的原理。

2.初次全量同步

当一个redis服务器初次向主服务器发送salveof命令时,redis从服务器会进行一次全量同步,同步的步骤如下图所示:

在这里插入图片描述

  • slave服务器向master发送psync命令(此时发送的是psync ? -1),告诉master我需要同步数据了。
  • master接收到psync命令后会进行BGSAVE命令生成RDB文件快照。
  • 生成完后,会将RDB文件发送给slave。
  • slave接收到文件会载入RDB快照,并且将数据库状态变更为master在执行BGSAVE时的状态一致。
  • master会发送保存在缓冲区里的所有写命令,告诉slave可以进行同步了
  • slave执行这些写命令。

3.命令传播

slave已经同步过master了,那么如果后续master进行了写操作,比如说一个简单的set name redis,那么master执行过当前命令后,会将当前命令发送给slave执行一遍,达成数据一致性。

4.重新复制

当slave断开重连之后会进行重新同步,重新同步分完全同步和部分同步

首先来看看部分同步大致的走向

在这里插入图片描述

  • 当slave断开重连后,会发送psync 命令给master。
  • master收到psync后会返回+continue回复,表示slave可以执行部分同步了。
  • master发送断线后的写命令给slave
  • slave执行写命令。

实际上当slave发送psync命令给master之后,master还需要根据以下三点判断是否进行部分同步。

先来介绍一下是哪三个方面:

  • 服务器运行ID

每个redis服务器开启后会生成运行ID。

当进行初次同步时,master会将自己的ID告诉slave,slave会记录下来,当slave断线重连后,发现ID是这个master的就会尝试进行部分重同步。当ID与现在连接的master不一样时会进行完整重同步。

  • 复制偏移量

复制偏移量包括master复制偏移量和slave复制偏移量,当初次同步过后两个数据库的复制偏移量相同,之后master执行一次写命令,那么master的偏移量+1,master将写命令给slave,slave执行一次,slave偏移量+1,这样版本就能一致。

  • 复制积压缓冲区

复制积压缓冲区是由master维护的固定长度的先进先出的队列。

当slave发送psync,会将自己的偏移量也发送给master,当slave的偏移量之后的数据在缓冲区还存在,就会返回+continue通知slave进行部分重同步。

当slave的偏移量之后的数据不在缓冲区了,就会进行完整重同步。

结合以上三点,我们又可以总结下:

  • 当slave断开重连后,会发送psync 命令给master。
  • master首先会对服务器运行id进行判断,如果与自己相同就进行判断偏移量
  • master会判断自己的偏移量与slave的偏移量是否一致。
  • 如果不一致,master会去缓冲区中判断slave的偏移量之后的数据是否存在。
  • 如果存在就会返回+continue回复,表示slave可以执行部分同步了。
  • master发送断线后的写命令给slave
  • slave执行写命令。

5.主从同步最终流程

在这里插入图片描述

6.结语

最近公司需要,我搭建了一套redis主从集群并且用哨兵进行监听实现主从切换。因此我根据《redis设计与实现》梳理了redis主从原理,给自己加深印象。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200378.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:56
下一篇 2026年3月20日 上午10:57


相关推荐

  • Web Services规范

    Web Services规范本文中文版来源 http www ibm com developerwor cn webservices ws wsrp index shtml nbsp Webservices 规范 nbsp nbsp nbsp 级别 初级 IBM 2002 年 12 月 01 日 nbsp nbsp nbsp 简单对象访问协议 SOAP 是 W3C 组织的一个 Note 它描述了一种在分散的或分布式的环境中如何交换信息的轻量级协议 Messaging 简单对象

    2026年3月16日
    2
  • SQL Server 2014聚集列存储索引

    SQL Server 2014聚集列存储索引

    2021年11月26日
    41
  • leetcode-91解码方法(动态规划|记忆化搜索)[通俗易懂]

    leetcode-91解码方法(动态规划|记忆化搜索)[通俗易懂]一条包含字母 A-Z 的消息通过以下映射进行了 编码 :‘A’ -> 1‘B’ -> 2…‘Z’ -> 26要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“111” 可以将 “1” 中的每个 “1” 映射为 “A” ,从而得到 “AAA” ,或者可以将 “11” 和 “1”(分别为 “K” 和 “A” )映射为 “KA” 。注意,“06” 不能映射为 “F” ,因为 “6” 和 “06” 不同。给你一个只含数字的 非空 字符串

    2022年8月8日
    6
  • 基于Scrapy分布式爬虫的开发与设计

    基于Scrapy分布式爬虫的开发与设计个人博客请访问 http blog xhzyxed cn nbsp 这个项目也是初窥 python 爬虫的一个项目 也是我的毕业设计 当时选题的时候 发现大多数人选择的都是网站类 实在是普通不过了 都是一些简单的增删查改 业务类的给人感觉一种很普通的系统设计 当时也刚好在知乎上看到了一个回答 你是如何利用计算机技术解决生活的实际问题 链接就不放了 有兴趣的可以搜索下 然后就使用了这个课题 摘要 基

    2026年3月20日
    2
  • SQL 数据查询(4)—— 嵌套查询

    SQL 数据查询(4)—— 嵌套查询文章目录嵌套循环SELECTSnameFROMStudentWHERESnoIN( SELECTSno FROMSC WHERECno=’2′);

    2022年8月10日
    9
  • TASK异步进程处理场景[通俗易懂]

    TASK异步进程处理场景

    2022年2月13日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号