Redis: 主从复制原理

news2024/12/24 20:56:45

主从复制原理剖析


1 )配置

  • 通过下面的从节点的配置项可以开启主从之间的复制功能
    slaveof 192.16.10.101 6379
    
  • 这里的复制包含全量复制和增量复制

2 )主节点的主从配置信息解析

  • 查看主从之间的信息,在主节点上 $ info replication 打印出来的细节
    # Replication
    role: master
    connected_slaves: 2
    slave0:ip=192.168.10.102,port=6379,state=online,offset=2184,lag=1
    slave1:ip=192.168.10.103,port=6379,state=online,offset=2184,lag=1
    master_replid:0e233bbb3b38aada4764b58c2dc9e74ddfc85ccc
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:2184
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen: 2184
    
    • 从节点 offset 是指读取命令的偏移量
      • 相当于: 从节点现在已复制的偏移量的长度
      • 主节点实际上会把所有的命令转成字节,然后写到一个队列里边
      • 然后它写入了多少会记录下最终的值,也就是对应下面的 master_repl_offset
      • 两者相等,表示主从数据一致
    • lag 延迟时间,lag=1 延迟时间是1s,主从同步数据会有延迟
    • master_repl_offset 主节点已写入的命令偏移量
    • master_replid 和 master_replid2
      • master_replid 表示主节点的一个 replicationID, 它是40个16进制的字符串,随机生成的
      • master_replid2
        • 表示主节点的状态发生改变之后
        • 新的主节点ID会存放在 master_replid 中
        • 旧的主节点ID会存放在 master_replid2 中
    • 下面的5项都是在 Redis 2.8 之后, 出现的特性
      • 这里既然涉及到了主从复制,肯定会有一个全量复制,增量复制这样一个概念在里边
      • 全量复制是指:从节点把主节点的数据据全部都拷贝过去
      • 这种一般发生在环境初始化和从节点扩展以及主节点故障在从节点选举新的主节点场景中
      • 在主节点故障重新选举的过程中,run_id 会出现变化, 在 $ info server 命令中就有这个 run_id
      • 从节点根据这个 run_id 来判断是全量复制还是增量复制
    • 在2.8版本之后出现 second_repl_offset 这个配置,还有一个缓冲区的概念
    • 关于 second_repl_offset 这个配置
      • 2.8 之后,全量增量复制多了一个命令,叫 psync, 之前是建立一个 sync 的操作
      • 比如说, 现在主节点故障重启之后,它发现 run_id 变了,二话不说,走一个全量复制
      • 再有,比如说,主节点故障了,重新选取主节点,会把上一次主节点已写入队列的偏移量 master_repl_offset 记录下来,寄存到这个 second_repl_offset
      • 比如现在 master_repl_offset 已经是 2590 了,在存的时候 second_repl_offset 一般做一个 +1 的操作,也就是变成了 2591,这样,从节点再重新跟主节点建立连接的时候,会拿到这个 second_repl_offset
      • 根据上面的情况 second_repl_offset 比 master_repl_offset 多了一个字节,就没有必要做全量复制了
      • 只需要继续保持现状,跟它持续连接,每十秒 ping 一下,监听着它就行了, 继续做增量操作
      • 所以,second_repl_offset 的作用就是为了避免每一次主从的角色改变/故障重启等场景带来可能的全量复制操作而浪费性能,这样增量操作就能解决问题
    • 关于缓冲区的配置
      • repl_backlog_active: 1 表示缓冲区开启
      • repl_backlog_size:1048576 表示缓冲区的大小, 这里是 1M的大小
      • repl_backlog_first_byte_offset:1 表示从1的位置开始写
      • repl_backlog_histlen: 2184 表示当前缓冲区的长度

3 )从节点的主从配置信息解析

  • 在从节点上 $ info replication 打印出来的细节
    # Replication
    role:slave
    master_host:192.168.10.101
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:5
    master_sync_in_progress:0
    slave_repl_offset:2842
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:0e233bbb3b38aada4764b58c2dc9e74ddfc85ccc
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:2842
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:2842
    
  • 上面 master_* 是主节点的一系列信息,主要看下
    • master_last_io_seconds_ago:5 表示从库和主库最后一次同步数据的时间在五秒之前
    • master_sync_in_progress:0 表示和主库的同步状态,0是未同步,1是正在同步
    • master_repl_offset:2842 表示主节点写入的偏移量
  • 上面 slave_* 是从节点的一些列配置
    • slave_repl_offset 表示从节点复制的偏移量,和上面主节点写入偏移量一致,说明同步了
    • slave_priority:100 表示从节点在选举时成为主节点的一个几率
      • 比如主节点宕机,剩下的2个从节点开始参与选举
      • 谁能竞选成功,就看上面这个数值的大小,越大则优先级越高,竞选越容易成功
      • 如果这个值为 0,则这个从节点永远不会变成主节点
    • slave_read_only:1 从节点只读模式,1表示开启,0表示关闭
  • connected_slaves:0 表示连接到从节点的信息
    • 作为从节点,也是可以去连其他的从节点的
  • 其他选项不再赘述

4 ) Master复制日志查看

  • master/slave 进行主从进行复制的时候,在日志中也是可以体现出来

  • 下面通过查看日志的方式,把主从的一个复制流程走一遍

  • 在主节点查看日志:$ tail -f -n 800 /usr/local/redis/log/redis.log, 我们从下面位置来看

  • Ready to accept connections 表示随时等待其他节点的连接

  • Replica 192.168.10.102:6379 asks for synchronization 表示 102 从节点开始过来复制了

    • 这里可见,它发起了 sync 的请求
  • Full resync requested by replica 192.168.10.102:6379 表示 102 的复制请求是全量的复制请求

  • Replication backlog created, my new replication IDs are '0e233bbb3b38aada4764b58c2dc9e74ddfc85ccc'and '0000000000000000000000000000000000000000'

    • 刚把环境起起来,这里主节点开始创建缓冲区并生成新的 replication IDs
    • 这里有2个ID,就是上文说的 master_replid 和 master_replid2
  • 下面是RDB的操作

    1468:M 10 Nov 2020 14:21:28.324 * Starting BGSAVE for SYNC with target: disk
    1468:M 10 Nov 2020 14:21:28.324*  Background saving started by pid 1474
    1474:C 10 Nov 2020 14:21:28.326 * DB saved on disk
    1474:C 10 Nov 2020 14:21:28.326 * RDB: 4 MB of memory used by copy-on-write
    1468:M 10 Nov 2020 14:21:28.332 * Background saving terminated with success
    
    • 首先,通过 BGSAVE 把数据写入磁盘,可以看到它是后台的写入进程
    • 之后,通过 copy-on-write 把内存的 4M 数据写入磁盘
    • 最后,保存结束,终止
  • Synchronization with replica 192.168.10.102:6379 succeeded

    • 这里,提示 102 机器的复制成功了
  • 下面是 103 重复RDB的复制操作

    1468:M 10 Nov 2020 14:21:30.858 * Replica 192.168.10.103:6379 asks for synchronization
    1468:M 10 Nov 2020 14:21:30.858 * Full resync requested by replica 192.168.10.103:6379
    1468: M 10 Nov 2020 14:21:30.858 * Starting BGSAVE for SYNC with target: disk
    1468:M 10 Nov 2020 14:21:30.859 * Background saving started by pid 1475
    1475:C 10 Nov 2020 14:21:30.861 * DB saved on disk
    1475:C 10 Nov 2020 14:21:30.861 * RDB: 4 MB of memory used by copy-on-write
    1468:M 10 Nov 2020 14:21:30.952 * Background saving terminated with success
    1468:M 10 Nov 2020 14:21:30.952 * Synchronization with replica 192.168.10.103:6379 succeeded
    
    • 不再赘述

5 )画图来看复制流程(全量复制)

  • 环境搭建好之后,slave节点就发起了一个 sync 的请求,这个请求是一个 全量复制
    • 其实增量无非就是在环境构建完成之后,每次你写入一个,我就复制一个写入一个复制一个
  • sync 的命令到主节点,主节点这边执行 BGSAVE 执行BGsave之后,生成RDB快照
  • 然后,主节点会把RDB的快照发送给 slave 节点
  • slave 节点拿到RDB快照之后,会把它节点上旧的数据全部删掉,加载RDB的文件
  • 在上述过程中,我们看下
    • master主节点,在执行 BGSAVE 的时候,它是一个非阻塞的
    • 就是说, 在生成RDB执行BGSAVE 期间, 仍然是可以对外提供服务的
    • 也就是说它仍然是可以读写的,如果说这时候有一些命令,它就会把命令写到缓冲区里边去
    • 就是我们的backlog里边,它为什么要这么做呢?
    • 一方面,为了提高性能,无阻塞可提供反馈
    • 另一方面,写到缓冲区里边,master 已经生成RDB快照发给 slave节点了
    • 后续的命令从节点就拿不到了,所以,给它放到这个缓冲区里边
    • 等 slave 这边RDB加载完之后,它再从缓冲区里边去拿走后续的那些命令
    • 相当于就是把整个的数据全部复制过去了
  • 所以,我们的 slave 除了加载 RDB 之外,它还会去缓冲区里边继续接受这些命令,最终完成一个init
  • 所以,这里面包含:RDB的加载完成和缓冲区命令的复制都完成了

6 )再来看下增量复制

  • 增量复制更多的是 Slave 初始化完成后,环境已经稳定了,这个时候,就会做增量的复制
  • 增量复制就是主服务器那边发生了写操作,它就会同步到从服务器的一个过程
  • 复制的过程就是
    • 主服务器执行一个命令,从服务器就会发送一个相同的写命令
    • 从服务器接收到之后就开始执行
  • 我们可以演示一下
    • 在从服务器中执行 $ sync 先建立连接
    • 在主服务器中,进行写操作 $ set age 18
    • 在从服务器终端中输入
      "PING"
      "SELECT","0"
      "set","age","18"
      "PING"
      
      • 可以看到,每10s就会PING一下,得到新的同步的命令这样保持心跳
  • 在2.8之前都是全量复制,之后便可以增量复制了

7 )主从复制的异步性

  • 主从复制这个过程,主节点是非阻塞的,在复制的这个流程中
  • 它是开启的一个后台子守护进程去做这件事情的,比如 BGSAVE 和 生成 RDB快照发送等
  • 当前服务器仍然是可以对外提供读写这样的一些请求的,这个就是非阻塞,体现异步性
  • 从节点也是一样的,比如说正在复制主节点的数据,这个SYNC的操作也是非阻塞的
  • 复制的过程中, 它可能就会有一点问题, 比如,正在复制时,一个查询过来
    • 那我可能查到的就是比如说一些老数据,这里边就会有脏读,数据不一致等等的问题
    • 这块在故障解决中有一些方案来处理

8 )过期 key 的处理

  • 实际上从节点是不会让 key 过期的,从节点它没有 key 过期的概念
  • 它会等待接收主节点delete的命令,可以看下面的演示
    • 从节点:$ sync 先监控下
    • 主节点:$ set age 18 ex 10
    • 查看从节点输出
      "PING"
      "set","age","18","ex","10"
      "PING"
      "DEL","age"
      "PING"
      
      • 可以看到,它在等主节点发DEL 命令
  • 也就是,当Master让key到期时,会合成一个 DEL 命令传输到所有 Slave

9 )加速复制

  • 上面看日志可知,每一次的复制都会生成RDB,然后把RDB的快照文件发给从节点
  • 如果说你的磁盘性能比较差,每一次的主从复制都要写入磁盘,如后再生成RDB文件发送给从节点,性能就会被降低,因为磁盘性能差
  • 可以不写入磁盘,直接生成RDB文件发给从节点就可以了,在 Redis@2.8.18这个版本之后,加入了这个功能,可以设置无需写入磁盘,直接把这个RDB的快照文件发给从节点
  • 修改配置:repl-diskless-sync yes 默认值是 no 不开启
    • 不开启的情况下,BGSAVE 先写磁盘,然后把生成RDB快照再发送
    • 设置为 yes 开启之后,就直接把RDB快照发给从节点
    • 不会写磁盘操作,这样就加速了复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统实施方案(word2024原件参考模板)

软件实施方案 二、 项目介绍 三、 项目实施 四、 项目实施计划 五、 人员培训 六、 项目验收 七、 售后服务 八、 项目保障措施 软件开发全套资料获取:(本文末个人名片也可直接获取) 软件产品,特别是行业解决方案软件产品不同于一…

【RockyLinux 9.4】安装新版 QQ for Linux(不再是 QQ2008 那种老款了!)

总览 还记得两年之前的时候,当初用的还是那种 QQ2008 一样的 LinuxQQ 啥也干不了,还不如 QQ2008 最近寻思自己装个服务器玩,想下载一个 QQ 用来文件传输,没想到现在的 QQ Linux 这么棒! 一、下载 1.下载网址 https…

C语言练手项目之通讯录

1.前言 使用我上期发布的泛型list去制作一个通讯录,实在是太So Easy了!!!(上期代码有改动,可通过我主页介绍的个人git仓库查看!!!) 2.代码截图 1.contact.h 2.main.c 3.contact.c 4.运行结果 3.结语 如果我的文章帮助到你,看到这里不妨点个小赞,加个收藏呗,你的点赞和收藏是我…

2024年9月总结及随笔之丢卡

1. 回头看 日更坚持了639天。 读《软件开发安全之道:概率、设计与实施》更新完成读《软件设计的要素》开更并更新完成读《构建可扩展分布式系统:方法与实践》开更并更新完成读《数据湖仓》开更并持续更新 2023年至2024年9月底累计码字1555996字&#…

Linux-基础篇-磁盘分区,挂载

Linux 分区 原理介绍 Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux 中每个分区都是用来组成整个文件系统的一部分。 Linux 采用了一种叫 “ 载入 ” 的处理方法,…

【Linux-基础IO】如何理解Linux下一切皆文件磁盘的介绍

目录 如何理解Linux系统上一切皆文件 1.物理角度认识磁盘 2.对磁盘的存储进行逻辑抽象 磁盘寻址 3.磁盘中的寄存器 如何理解Linux系统上一切皆文件 计算机中包含大量外设,操作系统想要管理好这些外设,就必须对这些外设进行先描述再组织&#xff0c…

Emergency Stop (ES)

文章目录 1. 介绍2. Feature List3. 紧急停止信号触发方式3.1 Port触发紧急停止信号3.2 SMU事件触发紧急停止信号3.3 软件触发紧急停止信号 4. 应用场景4.1 Port4.2 MSC 1. 介绍 Emergency Stop (ES)是Ifx System Control Units (SCU)六大模块之一。详细信息可以参考Infineon-…

【牛客刷题记录】【JAVA】二分查找

(1) 二分查找 链接 二分查找需要序列是有序的,否则二分查找会失效。原理就是如果找的值比mid小,那么[mid,R]的内容就不需要再查找了,反之如果大于mid位置的值,则在[L,mid]内的值也不需要再查找。同时将L/R的值进行修改。注意循环…

计算机毕业设计 基于深度学习的短视频内容理解与推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

景联文科技入选《2024中国AI大模型产业图谱2.0版》数据集代表厂商

近日,大数据产业领域头部媒体数据猿携手上海大数据联盟联合发布了备受瞩目的《2024中国AI大模型产业图谱2.0版》。以大数据与AI为代表的智能技术为主要视角,聚焦全产业链,为业内提供更为专业直观的行业指导。 景联文科技凭借高质量数据集&…

第十一届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(大学组)

一.题目分析 (1).题目 (2).题目分析 1.计时分析 只要遇到Vmin,就将计时时间重置为0,直到遇到Vmax结束计时 2.按键功能分析 a.B1显示和功能页面相互切换 b.B2每次按下Vmax加0.1,加到3.3V&a…

怀孕之天赋共享:其实人身体没变,完全是天赋共享

关于怀孕天赋共享,有人说,是不是怀孕导致身体变化? 并没有。下面这个就是案例。你总不能说,小孩生下来身体立即改变吧?

【大模型系列篇】动手部署实践国产文生图模型-腾讯混元DiT

首个中英双语DiT架构,混元-DiT,高性能细粒度中文理解-多分辨率扩散Transformer模型。 腾讯提出的混元DiT,是一个基于Diffusion transformer的文本到图像生成模型,此模型具有中英文细粒度理解能力。为了构建混元DiT,精心…

plt绘画三维曲面

目录 前言实战 前言 如果想绘画三维曲面,需导入Axes3D 模块,具体语法可参考: from mpl_toolkits.mplot3d import Axes3D问题的关键是需要三维坐标对象与figure相关联,这里可以使用如下两种方法,亲测可用!…

安卓使用memtester进行内存压力测试

memteser简介 memtester 是一个用于测试内存可靠性的工具。 它可以对计算机的内存进行压力测试,以检测内存中的错误,例如位翻转、随机存取错误等。memtester 可以在不同的操作系统上运行,并且可以针对不同大小的内存进行测试。 下载源码 m…

企业微信hook协议接口,群发,标签,客户管理。

服务提供了丰富的API和SDK,可以在企微的功能之上进行应用开发和功能扩展 自建应用可以调用企微hook或协议提供的接口来实现数据交互,可以直接调用hook或协议接口提供的功能来进行消息的发送与接收、用户管理、应用管理等操作,通过接口可以实…

用Python实现运筹学——Day 8: 对偶理论的经济解释

一、学习内容 1. 对偶价格的经济含义 对偶价格(Dual Price),也称为影子价格(Shadow Price),反映了在线性规划问题中的某个约束条件下,单位资源的边际价值。影子价格是对每一单位资源的增加所带…

1.7 编码与调制

欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言前言1 基本术语2 常用的编码方法2.1 不归零编码2.2 归零编码2.3 反向归零编码2.4 曼彻斯特编码2.5 差分曼彻斯特编码 3 常用的调制方法3.1 调幅(AM&#xff09…

plt等高线图的绘制

目录 np.meshgrid()plt.contour()实战 np.meshgrid() np.meshgrid 是 NumPy 中的一个函数,用于生成多维坐标网格。它通常用于在多维空间中创建坐标点的组合,以便进行向量化的计算或者绘制三维图形。 基本语法: X, Y np.meshgrid(x, y) 参…

车视界系统小程序的设计

管理员账户功能包括:系统首页,个人中心,汽车品牌管理,汽车颜色管理,用户管理,汽车信息管理,汽车订单管理系统管理 微信端账号功能包括:系统首页,汽车信息,我…