Redis RDB AOF持久化 主从集群同步原理

news2024/11/24 3:48:17
RDB
  1. RDB Redis数据备份文件 也被叫做Redis数据快照 简单来说就是 把内存中的所有数据记录到磁盘中 当Redis实例故障实例重启后从磁盘读取快照文件恢复数据 快照文件称为RDB文件 默认时保存在当前运行目录
  2. 执行时机
    1. 执行save命令
127.0.0.1:6379> save
OK
127.0.0.1:6379> 


4428:M 02 Aug 2024 19:56:52.391 * Ready to accept connections tcp
4428:M 02 Aug 2024 19:57:51.494 * DB saved on disk
4428:M 02 Aug 2024 19:58:10.097 * DB saved on disk

  1. 执行bgsave命令
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> 

4428:M 02 Aug 2024 19:59:22.611 * Background saving started by pid 4460
4460:C 02 Aug 2024 19:59:22.614 * DB saved on disk
4460:C 02 Aug 2024 19:59:22.615 * Fork CoW for RDB: current 2 MB, peak 2 MB, average 2 MB
4428:M 02 Aug 2024 19:59:22.650 * Background saving terminated with success
  1. Redis停机的时候
[root@CentOS7 ~]# ps -ef|grep redis
root       4428   3846  0 19:56 pts/2    00:00:00 redis-server *:6379
root       4499   4097  0 20:00 pts/4    00:00:00 grep --color=auto redis
[root@CentOS7 ~]# kill -9 4428
[root@CentOS7 ~]# 

4428:M 02 Aug 2024 19:59:22.650 * Background saving terminated with success
已杀死
[root@CentOS7 ~]# 

  1. 触发RDB条件时
# save ""
#
# Unless specified otherwise, by default Redis will save the DB:
#   * After 3600 seconds (an hour) if at least 1 change was performed
#   * After 300 seconds (5 minutes) if at least 100 changes were performed
#   * After 60 seconds if at least 10000 changes were performed
#
# You can set these explicitly by uncommenting the following line.
#	当3600秒有一次修改 300秒有100次修改 60 秒有10000修改
# save 3600 1 300 100 60 10000

  1. RDB文件内容
REDIS0011ú      redis-ver^E7.2.0ú
redis-bitsÀ@ú^EctimeÂ^Zʬfú^Hused-memÂÈ^Q^O^^Haof-baseÀ^^^A^@^@^Bk1^Bv2ÿ¦<84>MYÑ<85><8e>X
~                                                                                                                                                                                                                                                                                                                                                                                                            
"dump.rdb" [noeol][已转换] 2L, 120C 

[root@CentOS7 ~]# cat dump.rdb 
REDIS0011	redis-ver7.2.0

  1. 关闭RDB
# Snapshotting can be completely disabled with a single empty string argument
# as in following example:
#
save ""
#
# Unless specified otherwise, by default Redis will save the DB:
#   * After 3600 seconds (an hour) if at least 1 change was performed
#   * After 300 seconds (5 minutes) if at least 100 changes were performed
#   * After 60 seconds if at least 10000 changes were performed

  1. RDB原理

bgsave开始时会fork主进程得到子进程 子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件
fork采用copy-on-write

  • 当主进程执行读操作时访问共享内存
  • 当主进程执行写操作时则会拷贝一份数据执行写操作
  • image.png
AOF
  1. AOF Append Only File 追加文件 Redis处理每一个写命令都会记录在AOF文件 可以看作时命令日志文件
  2. AOF刷盘策略
# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
  1. 开启AOF
# Please check https://redis.io/topics/persistence for more information.

appendonly yes

# The base name of the append only file.
#
# Redis 7 and newer use a set of append-only files to persist the dataset
# and changes applied to it. There are two basic types of files in use:
  1. AOF auto-aof-rewrite
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

image.png

主从同步原理
  1. 全量同步
    1. 执行时机
    2. 第一次建立连接时
      1. 流程
      2. salve 执行replicaof命令建立连接
      3. salve请求数据同步(会发送自己的replication id 和offset)
      4. master判断是否是第一次同步(判断以及根据replcation id是否相等)
      5. master是第一次同步返回master的replication id 和offset
      6. slave保存版本信息
      7. master 执行bgsave 生成RDB文件 RDB文件记录RDB期间的所有命令
      8. master 发送RDB文件给salve
      9. slave清空数据加载RDB文件
      10. master 发生repl_baklog中的命令
      11. slave收到并执行命令
- slave节点请求增量同步
- master节点判断replid,发现不一致,拒绝增量同步
- master将完整内存数据生成RDB,发送RDB到slave
- slave清空本地数据,加载master的RDB
- master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
- slave执行接收到的命令,保持与master之间的同步
  1. slave停机时间过长 导致主节点的offset在环形缓冲区覆盖了从节点的时offset
  2. 增量同步
    1. 执行流程
    2. salve异步发送replication id和offset 到master
    3. master 判断replication id 是否相等
    4. 相等 去repl_baklog中获取offset后的数据
    5. 发生offset后的命令
repl_backlog原理
  1. repl_backlog是一个固定大小的环形数组
  2. repl_backlog会记录redis中redis处理过的命令日志级offset包括master当前offset和slave已经拷贝到的offset slave和master的offset差异就是slave需要增亮拷贝的数据
  3. image.png
  4. 随着不断有数据写入 master的offset逐渐变大 slave也不断的拷贝追赶master的offset
  5. image.png
  6. 直到数组被填满
  7. image.png
  8. 此时 如果有新的数据写入 就会覆盖数组中的旧数据 旧数据只要是绿色 说明已经被同步到slave覆盖也无伤大雅红色是未同步的数据
  9. 当slave出现网络阻塞导致master的offset远远超过salve的offset
  10. image.png
  11. 如果master继续写入新数据 其offset就会覆盖旧的数据 直到salve现在也覆盖
  12. image.png
  13. 棕红色的部分就是尚未同步但是 却已经被覆盖的数据如果此时slave恢复需要同步就会发现自己的offset都没有了 无法完成增量同步 只能做全量同步

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

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

相关文章

(002)两数相加

思路分析&#xff1a; 类似于一个大数加法&#xff0c;注意链表的边界和进位&#xff0c;同时还有注意存在两个链表长度不等&#xff0c;需要处理多出来的元素 代码实现&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNod…

PDF发票解析并将信息回填到前端(1)后端解析PDF

文章目录 参考文章技术栈需求解析发票类型 1. 最终项目结构1.1 说明 2. 相关代码2.1 导入相应的maven依赖2.2 实体类2.3 工具类2.4 三层架构controllerservicemapper 参考文章 参考文章 技术栈 SpringBootVue 需求 本文主要是实现提取发票中的部分内容&#xff0c;并实现自…

单调栈② | Java | LeetCode 接雨水 最大的矩形

42. 接雨水 暴力法 for循环遍历每一个柱子&#xff0c;内层for循环找到左边和右边比它高的柱子 时间复杂度 n^2 优化&#xff1a;添加一个预处理 定义一个数组&#xff0c;存放该柱子右边比他高的柱子是哪一个 再用一个数组&#xff0c;存放该柱子左边比他高的柱子是哪一个 …

html页面下载及多html文件合成单pdf方法

1&#xff0c;html页面下载 &#xff5e;1&#xff0c;首先在edge中微软扩展商店搜索 “SingleFile”添加扩展 浏览器右上角点击扩展按钮 下拉菜单选择管理扩展 点击 获取 Microsoft Edge 扩展 进入微软商店搜索 “singlefile” 点击获取 点击浏览器右上角扩展按钮&#xff0c;…

IPv4 vs IPv6:了解这两大协议的关键差异

我发现&#xff0c;很多找代理IP的朋友在后台问我的问题都很相似&#xff01;都被配置IP的最后一步&#xff1a;选择IPv4还是IPv6&#xff1f;给难住了。昨晚我一晚没睡&#xff0c;终于整理出对IPv4和IPv6的对比总结&#xff0c;从概念阐述到特点对比&#xff0c;再解答IPv6总…

利用 IP 地址进行社交工程攻击?

社交工程攻击是网络安全的主要威胁之一。现在攻击者不再仅依赖技术漏洞&#xff0c;而是想利用人性的弱点来获取有价值的信息或实现非法目的。 IP 地址在社交工程攻击中的作用 定位和伪装获取目标用户的 IP 地址&#xff0c;大致确定目标用户地理位置&#xff0c;然后伪装成当…

spring原理(自学第六天)

Aware 接口及 InitializingBean 接口 今天将会学到Aware 接口及 InitializingBean 接口 我们可以先了解他们的作用&#xff1a; 1. Aware 接口用于注入一些与容器相关信息, 例如 a. BeanNameAware 注入 bean 的名字 b. BeanFactoryAware 注入…

解锁LLM应用潜能:提示工程的39种方法与应用全解析!

大型语言模型&#xff08;LLMs&#xff09;在许多不同的自然语言处理&#xff08;NLP&#xff09;任务上表现出了显著的性能。提示工程在提升LLMs已有能力方面发挥着关键作用&#xff0c;使其在各种NLP任务上取得了显著的性能提升。提示工程需要编写自然语言指令&#xff0c;即…

QT 应用程序输出中文乱码

一 &#xff0c;选择文本编码 1. 点击编辑再点击Select Encoding选择编码 2 .在弹出的窗口&#xff0c;选择UTF-8再点击按编码保存即可 3. 重新编译&#xff0c;可以发现中文乱码问题解决

Spring源码解析(28)之AOP的核心对象创建过程总结

一、总结图 二、总结 以上是对AOP核心对象创建的一个总结&#xff0c;接下来我们分点介绍我们自从定义了aop.xml之后&#xff0c;spring在启动的时候是怎么创建了这些核心对象的。 启动spring容器之后&#xff0c;其实核心是是refresh方法&#xff0c;refresh的13个核心方法&…

CTFHub——XSS——反射型

1、反射型&#xff1a; 发现为表单式&#xff0c;猜测哪个可能存在注入漏洞&#xff0c;分别做测试注入发现name框存在xss漏洞 输入发现有回显但不是对方cookie&#xff0c;参考wp发现要用xss线上平台 将xss平台测试语句注入&#xff0c;将得到的url编码地址填入url框&#xf…

Lineage凌骥电源模块维修CP2725AC54Z

Lineage Power交换机电源常见维修型号有&#xff1a; CAR2024FPZ0-1A、CP2725AC54TEZ、AXA005A0X-SRZ、APXW005A0X3-SRZ、AXA016A0X3-SRZ、EP3000AC48TE、CP3000AC54TEZ、 CP3000AC54TEZ、QBDW033A0B641Z及EP4848系列直流电源维修等。 凌骥电源维修实践中&#xff0c;有许多开关…

【OpenCV C++20 学习笔记】击中击不中(Hit-or-Miss)

击中击不中 Hit-or-Miss 原理代码实现 原理 形态学操作对图片的处理是基于图片的形状的。形态学操作将一个或多个结构元素(structuring elements)&#xff0c;即卷积核&#xff0c;应用到图片上从而获得计算结果。最基本的两个形态学操作就是腐蚀(erosion)和膨胀(dilation)。这…

7 时间序列单特征:多输入->多输出(LSTM/GRU/TCN)

今天看到关于时间序列预测知识点&#xff0c;竟然要收费&#xff01;本着开源第一的思想&#xff0c;自己也找到相关的代码尝试一下写几个通用的模版。 模型想要 输入&#xff1a;Input (input_size, hidden_size),其中&#xff1a;input_size time_stemp,因为是单个变量因此…

从实现第一个ArkTs应用开始入门

前言 新建了个鸿蒙学习项目&#xff0c;后续持续学习会把代码放到这里来&#xff1a;鸿蒙项目仓库学习实践版 基本概念 从HarmonyOS NEXT Developer Preview1(API 11)版本开始&#xff0c;HarmonyOS SDK以Kit维度提供了六大领域的开放能力&#xff0c; 包括&#xff1a; 应用…

800G FR4解决方案:高速数据传输的理想选择

随着业务规模的扩大&#xff0c;数据中心面临着越来越多的数据处理需求。虚拟化、物联网&#xff08;IoT&#xff09;和云计算等数据密集型应用推动了数据中心流量的不断增长&#xff0c;从而提升了对大容量800G解决方案的市场需求。因此&#xff0c;新建800G数据中心&#xff…

marker - PDF 转 markdown

文章目录 一、关于 marker特点它是如何工作的例子性能商业用途托管API限制 二、安装Optional: OCRMyPDF 三、用法1、配置转换单个文件转换多个文件在多个GPU上转换多个文件 三、故障排除四、有用的设置五、基准测试速度精度吞吐量 六、运行自己的基准测试七、感谢 一、关于 mar…

C++初学(9)

9.1、结构简介 虽然数组能够和存储多个元素&#xff0c;但所有元素必须相同&#xff0c;也就是说&#xff0c;同一个数组不能既存放int类型也存放float类型&#xff0c;而C的结构可以满足要求。结构是一种比数组更灵活的数据格式&#xff0c;因为同一个结构可以存储多种类型的…

防御笔记第九天(持续更新)

注意&#xff1a;攻击可能只是一个点&#xff0c;而防御需要全方面进行。 1.IAE引擎 2.DPI DPI ----深度包检测 --- 针对完整的数据包&#xff0c;进行内容的识别和检测 3.基于特征字的检测技术 4&#xff0c;基于应用网关的检测技术 基于应用网关的检测技术 --- 有些应用控…

数据库方言

数据库方言&#xff0c;也称数据库领域特定语言&#xff08;DSL&#xff09;&#xff0c;是针对特定数据库系统的专有扩展或子集&#xff0c;它允许用户在特定环境内使用更高效、更简洁的查询语句。 关键字&#xff08;Keywords&#xff09; 关键字是数据库方言中预定义的单词&…