聊聊redis的主从复制吧

  • 聊聊基础概念

主从复制与主从替换

主从复制不同于主从替换,主从复制是正常情况下主节点同步数据到从节点;主从替换是主节点挂了之后,把从节点替换为主节点;

从节点存在的意义:备份主节点数据+负载均衡(对外提供可读操作)

从节点配置主节点的信息(两种方式)

1、临时配置:启动从节点的redis-cli执行命令【slaveof host port】,host是主节点的ip,port是主节点的端口号,结果总是返回ok

2、永久配置:进入redis.conf,添加【slaveof host port】到文件中

runid和offset

runid:每个redis在启动或重启时都会生成一个唯一的runid;

offset:主从节点都有自己的主从复制偏移量,主节点复制数据到从节点时,从节点的偏移量的offset=原始offset+命令数据长度,同时从节点会把’从offset’发给主节点,所以主节点会同时保存’主offset’和’从offset’,主节点可以通过判断’主offset’是否等于’从offset’来判断主从是否一致

backlog:是一个复制积压缓冲区,最大1M,主从同步的整个过程中主节点还会被外界写入数据,所以在主从同步进行时,主节点会把这些外部写入的’命令数据’保存一份备份到backlog,在主从同步完rdb文件后,主节点还需要同步缓存中的这些’命令数据’给到从节点(或者在’命令数据’因网络问题丢失后,主节点也可以从backlog中复制备份的数据重新同步到从节点)

主从复制的过程

  • 主从复制默认使用rdb文件的原因?

(1)rdb文件是二进制文件比较小,所以主节点向磁盘写入rdb的I/O效率以及主节点传输rdb文件给从节点的效率都比aof文件高

(2)rdb文件是二进制文件比较小,所以从节点写入rdb文件恢复数据的效率也比aof文件高
* 全量复制的过程?

(1) 一开始从节点执行【slaveof host port】命令,查找网络上的主节点,找到后发送ping给主节点,主节点返回pong,这样双方就建立了连接关系,建立了连接关系后就可以进行数据的复制了

(2) 从节点发送【psync ? -1】给主节点,’?’是因为从节点第一次不知道主节点的runid所以用?代替,-1表示从节点自己的偏移量(首次主从复制固定为-1)

(3) 主节点收到-1后知道这是第一次主从复制,返回【funllresync 主runid 主offset】给从节点,从节点收到后保存在自己的信息中

(4) 主节点发完fullresync命令后马上执行bgsave命令生成rdb文件(rdb保存在磁盘中、由redis主线程分出一个子线程执行bgsave),然后把rdb文件传送给从节点

(5) 主节点在执行bgsave命令和发送rdb文件给从节点的时候,还会被外界写入数据(简称’命令数据’),主节点会将这些’命令数据’保存一份到backlog缓冲区中,同步完rdb文件后就会继续同步缓冲区中的这些’命令数据’

(6) 从节点收到rdb文件后会先清空本地内存数据再加载rdb文件数据到本节点,加载完后再执行主节点推过来的’命令数据’相应的命令(’命令数据’其实就是一些写命令)

聊聊redis的主从复制吧
  • 增量复制的过程?

  • 什么时候才会需要增量复制:在主从同步的整个过程中,所有的命令都可能发生网络中断的情况,这时候就需要增量同步。

  • 过程:
    不管在什么时候主节点都会将’写命令’记录在一个叫 repl_backlog_buffer的缓冲区中,该缓冲区是一个环形数组【在执行bgsave的时候写命令也会写入全量复制中的backlog,故此时会同时将写命令记录在这两个缓冲区】
    –>

主节点在repl_backlog_buffer上用偏移量’主offerset’记录写命令的偏移量(上面全量复制中的’主offerset’就是这个值,理论上应为repl_backlog_buffer中最新的数据位置)

–>

从节点也有自己主从同步过程中最新数据的位置偏移’从offerset’,理论上这两个偏移值是相同的,但是在网络中断时,可能’主offerset’>’从offerset’

–>

此时进行增量复制:从节点先发送【psync 主runid 从offset】给主节点,主节点收到后先判断该’主runid’是否是自身,若是则再去”repl_backlog_buffer缓冲区”中判断’从offset’偏移量之后的’写命令’数据是否存在,存在则先发送【continue】命令给从节点,然后发送 ‘从offset’~’主offset’ 之间的写命令数据同步给从节点

聊聊redis的主从复制吧

Original: https://www.cnblogs.com/mofes/p/16173121.html
Author: 明天喝可乐
Title: 聊聊redis的主从复制吧

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589735/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 四、初识Java

    JavaSE:标准版(桌面程序,控制台开发……) JavaME:嵌入式开发(手机,小家电……)[了解就行] JavaEE:E企业级开…

    Java 2023年6月5日
    089
  • MyBatis 获取参数值的两种方式

    MyBatis获取参数值的两种方式:${}和#{}${}的本质就是字符串拼接,#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值…

    Java 2023年6月7日
    072
  • Gitlab Runner的安装与配置

    Runner Runner就像一个个的工人,而Gitlab-CI就是这些工人的一个管理中心,所有工人都要在Gitlab-CI里面登记注册,并且表明自己是为哪个工程服务的。当相应的工…

    Java 2023年6月8日
    097
  • 【Java】Cron表达式

    一. 域说明 二. 特殊字符说明 三. 常用例子 四. 注意事项 1. 有些表达式能包含范围或列表 2. “/”字符用来指定数值的增量 3. “…

    Java 2023年5月29日
    052
  • 【MC】我的世界零基础开云服务器教程

    【MC】我的世界零基础开云服务器教程 文章目录 【MC】我的世界零基础开云服务器教程 前言 一、需要用到的软件及网站 二、在本地开服务器 * 1.安装Java 2.在本地运行服务端…

    Java 2023年6月5日
    088
  • 自动备份软件 —— Syncovery 7.98s Pro、Enterprise

    SynCovery自动备份软件原名Super FlexibleSynchronizer,是目前功能最为强大的实时自动备份工具,连FTP、WebDAV等全部支持!最近从V6开始改用比…

    Java 2023年5月30日
    076
  • 零点问题与微分不等式

    零点问题与微分不等式 零点问题关注于”有没有解”,”有几个解”。 单调性与存在性 罗尔原话 多项式方程的根 单调性与存在性 可以使用…

    Java 2023年6月7日
    066
  • SpringBoot-druid

    SpringBoot-druid 9.1 druid简介 Java程序很大一部分要操作数据库,为了提高性能操作数据库,又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一…

    Java 2023年6月5日
    074
  • 保姆级服务,一键 Git Worktree,这样满意吗?

    前言 上一篇文章Git Worktree 高级使用 整体反应不错,这完全是日常开发中可以用到的奇淫技巧。微服务环境下,通常我们都会有多个 repo,高级用法好归好,但每个 repo…

    Java 2023年6月5日
    088
  • 如何给注册中心锦上添花?

    hello,大家好,我是小楼。 在上一篇文章《如何组装一个注册中心》中,我们看到了如何利用一些现有的技术方案来组装出一个生产可用的注册中心最小集。 有的同学看完表示学到了,也有同学…

    Java 2023年6月6日
    089
  • Factory Pattern模式(简单工厂、工厂方法、抽象工厂模式)

    与工厂相关的的三个设计模式2020-11-08 15:03:29 简单工厂模式:说白就是,间接脱离了new 创建对象,而是直接从工厂中获得对象。 简单工厂:不是用new创建对象,而…

    Java 2023年6月9日
    081
  • 《回炉重造》——泛型

    泛型 前言 以前学习到「泛型」的时候,只是浅浅的知道可以限制类型,并没有更深入理解,可以说基础的也没理解到位,只是浮于表面,所以,现在回炉重造,重学泛型!打好基础! 什么是泛型? …

    Java 2023年6月10日
    092
  • CSharp: Abstract Factory in donet core 3

    csharp;gutter:true; /// /// Abstract Factory抽像工厂 /// geovindu,Geovin Du eidt /// public in…

    Java 2023年6月16日
    072
  • NoSQL,关系型数据库,行列数据库对比、类比

    数据库对比、类比 关系型数据库、NoSQL 关系型数据库 表与表之间有关系。表存储一些格式化的数据结构,每个元组字段的组成都一样,这样便于表之间的联结操作。不过也限制了其性能瓶颈。…

    Java 2023年6月8日
    078
  • 常用排序算法(一)-java实现

    排序算法总结 1.十大经典算法及性能 2.具体排序算法 1.冒泡排序 循环过程中比较相邻两个数大小,通过交换正确排位,循环整个数组即可完成排序 图片演示 代码实现Java //冒泡…

    Java 2023年6月8日
    0104
  • mybatis plus + druid多数据源(使用dynamic实现)

    引入pom: 配置文件yml中: 用法:在相应service类或方法上添加DS注解,如: Original: https://www.cnblogs.com/007sx/p/134…

    Java 2023年5月30日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球