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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 吐血推荐:VBScript教程及语言参考电子书「建议收藏」

    吐血推荐:VBScript教程及语言参考电子书「建议收藏」经过两次练手之后,花费一天时间,通过对从迅雷上所下载所有VBScript资源的整合,鼎力制作了此本VBScript教程及语言参考书。全书资源丰富,主要包括两部分内容。第一部分是教程部分,通过此章节的学习,我们可以很轻松的掌握VBScript的基础知识。第二部分是语言参考,提供一个搜索页面,在我们使用的时候可以随时查找到自己所需要查找的函数等的…

    2022年6月25日
    32
  • CentOS 7.5 PhpMyAdmin安装教程

    CentOS 7.5 PhpMyAdmin安装教程PhpMyAdmin简介:phpMyAdmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用…

    2022年5月31日
    27
  • vs2015注册码[通俗易懂]

    vs2015注册码[通俗易懂]VisualStudioProfessional2015简体中文版(专业版)KEY:HMGNV-WCYXV-X7G9W-YCX63-B98R2VisualStudioEnterprise2015简体中文版(企业版)KEY:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y…

    2022年8月22日
    6
  • 京东云服务器_docker 京东自动签到

    京东云服务器_docker 京东自动签到众所周知,京东的京豆可以在付款时抵扣现金支付,多攒京豆还是能省下一部分钱的,而且京豆的获取页很简单,其中一种就是通过签到的方式获得,而每天手动签到实在太过麻烦,如果能实现自动化就好了,这时,依靠于openwrt,京东自动签到插件就诞生了,在路由器上设置一下便可以一劳永逸,无需人工全部自动化完成,签到后可以自动将签到详细结果推送到手机的微信上,这种签到方式是在自己的路由器上,完全不用担心安全和隐私泄…

    2022年9月17日
    2
  • 用Python读取CSV文件的5种方式

    用Python读取CSV文件的5种方式典型的数据集stocks.csv:一个股票的数据集,其实就是常见的表格数据。有股票代码,价格,日期,时间,价格变动和成交量。这个数据集其实就是一个表格数据,有自己的头部和身体。第一招:简单的读取我们先来看一种简单读取方法,先用csv.reader()函数读取文件的句柄f生成一个csv的句柄,其实就是一个迭代器,我们看一下这个reader的源码:喂给reader一个可迭代对象或者是文件的object,然后返回一个可迭代对象。首先读取csv文件,然后用csv.reader生成一个csv迭代器

    2022年7月21日
    12
  • 单点登录SSO解决方案之SpringSecurity+JWT实现

    单点登录SSO解决方案之SpringSecurity+JWT实现  通过前面几天文章我们详细的介绍了SpringSecurity的使用,本文我们来看下,结合JWT来实现单点登录操作。一、什么是单点登陆  单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统二、简单的运行机制  单点登录的机制其实是比较简单的,用一个现实中的…

    2022年5月21日
    39

发表回复

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

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