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/126324.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月17日 下午9:40
下一篇 2022年4月17日 下午9:40


相关推荐

  • 操作系统存储管理之虚拟存储与分页式虚拟存储系统

    操作系统存储管理之虚拟存储与分页式虚拟存储系统虚拟存储实现思路在实际运行过程,把有关作业的全部信息都装入主存储器后,作业执行时实际上不是同时使用全部信息的,有些部分运行一遍便再也不用,甚至有些部分在作业执行的整个过程中都不会被使用到(如错误处理部分)。进程在运行时不用的,或暂时不用的,或某种条件下才用的程序和数据,全部驻留于内存中是对宝贵的主存资源的一种浪费,大大降低了主存利用率。于是,提出了这样的问题:作业提交时,先全部进入辅助存储器,作

    2026年4月14日
    8
  • OpenClaw连接错误unauthorized/1008使用SSH隧道安全访问

    OpenClaw连接错误unauthorized/1008使用SSH隧道安全访问

    2026年3月15日
    2
  • mac idea 2021 激活码(JetBrains全家桶)

    (mac idea 2021 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZP…

    2022年3月21日
    96
  • switch流控(flow control)

    switch流控(flow control)半双工:在switch中又叫做背压(BackPressure)添加链接描述。在交换机进行数据转发时,同一时间内,只能发送或者接受数据。利用冲突检测机制在端口接受数据时,抑制本端口发送。全双工:switch可以在转发时,同时接收和发送数据。1.pause帧2.非对称流控3.pause时间交换机在进行内部数据转发的时,内部需要一个packagebuff进行数据缓存,在多个端口同时向…

    2022年6月5日
    55
  • 如何从零开始学android?

    如何从零开始学android?不知不觉进入软件开发这一行业已经8年了,回想起刚毕业在深圳一个月拿着2000的工资,还要在休息时间自学android,感觉那段时光真的是大学毕业后最充实的一段时光了;努力总会有结果的,第二年涨到5000,第三年跳槽回郑州给了我7500,主要是离家近,父母年纪大了,给的钱少点无所谓,起码能经常回家看看。回忆到此结束,之前看到有人在悟空问答提问怎么从零开始学android这个问题,但是限于爪机无力…

    2022年6月13日
    36
  • nginx–正向代理、反向代理及负载均衡(图解+配置)

    nginx–正向代理、反向代理及负载均衡(图解+配置)学习背景什么是 nginx 百度百科 Nginx enginex 是一个高性能的 HTTP 和反向代理 web 服务器 那么除了反向代理 nginx 支持正向代理 负载均衡以及基于 SSL 安全证书的 HTTPS 访问等功能特性 本文主要是介绍是 nginx 如何配置正向代理 反向代理及负载均衡 如果你自己从来没有安装过 nginx 想要先初步了解下 nginx 的基本安装及最简单的访问 可以看下我的这篇博文 nginx 如何基于 rpm 包进行离线安装及配置 Linux 进入正文 一 正向代理 1 1 什么是正向

    2026年3月26日
    3

发表回复

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

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