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

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.rhkb.cn/news/389864.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencascade AIS_TrihedronOwner源码学习对象的实体所有者用于选择管理

opencascade AIS_TrihedronOwner 前言 AIS_Trihedron对象的实体所有者用于选择管理。 在OpenCascade的AIS&#xff08;交互对象框架&#xff09;中&#xff0c;管理类似AIS_Trihedron的对象的选择涉及理解如何处理实体&#xff08;或所有者&#xff09;以进行选择。 方法 1…

正则表达式 空格匹配

目录 一. 前提二. 半角空格 匹配半角空格三. ^ 匹配半角空格开头的半角空格四. ^ $ 匹配整行都是半角空格五. ^[ \t]$ 匹配整行都是半角或Tab空格六. \s 匹配所有空格七. [^\s]匹配除了空格之外的所有内容 一. 前提 &#x1f447;&#x1f447;&#x1f447;有如下所示的内容…

程序员面试 “八股文”在实际工作中是助力、阻力还是空谈?

“八股文”在实际工作中是助力、阻力还是空谈&#xff1f; 作为现在各类大中小企业面试程序员时的必问内容&#xff0c;“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢&#xff1f;有IT人士不禁发出疑问&#xff1a;程序员面试考…

CTF web bibibi题型

CTF web bibibi题型 1.进入网站 在kali中使用Dirsearch对地址进行目录扫描&#xff0c;发现robots.txt 网址内加入 /robots.txt 进入网址 /fl4gi5Here.php 找到flag

Uni-APP页面跳转问题(十六)

【背景】最近在做公司一个PAD端,谁被点检功能,主要时为了移动端点检设备和打印标签,需求比较简单就是扫描设备二维码,问题在于扫描后要能够重复进行多设备的扫描;早期开发的设备点检能够满足需求但是当连续扫描五六十个设备后,APP卡死,必须重启才能使用。 界面原图: 输…

安全基础学习-keil调试汇编代码

初始目的是为了通过汇编编写CRC功能。 但是基础为0,所以目前从搭建工程开始记录。 大佬绕路。 (一)创建项目 1. 新建项目 打开 Keil uVision。选择 Project -> New uVision Project 创建一个新项目。选择你的目标设备(如 ARM Cortex-M 系列处理器),我这里一开始选择…

buu做题(12)

[CISCN 2019 初赛]Love Math <?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("太长了不会算");…

Creomagic 推出认知通信功能以应对电子战 (EW) 威胁

新时代的软件定义无线电 (SDR) 技术可以在电子战和竞争频谱环境中自主维护可靠的网络。 最近的全球冲突凸显了现代战场上战术通信面临的严峻挑战。随着自主部队的日益普及&#xff0c;战场感知变得比以往任何时候都更加先进&#xff0c;需要大量信息传输和同步。在战场上传输关…

MacOS上如何优雅的使用Burp Suite Professional

MacOS上如何注册使用Burp Suite Professional 文章目录 MacOS上如何注册使用Burp Suite Professional一.如何下载二.安装BurpSuite三.注册四.启动五.创建可执行文件六.写在最后 一.如何下载 JDK官网下载 BurpSuite专业版官网下载 [注册机下载]( https://pan.baidu.com/s/10…

秒懂Linux之编写小程序——进度条

目录 一.前文摘要 二.进度条编写 三全部代码&#xff08;非Linux环境下测试&#xff09; 一.前文摘要 在开始编写之前我们先来学习一些后面会用到的知识点~ 测试结果发现&#xff0c;Sleep无作用&#xff0c;编译完会立刻打印~ 再来看另一个测试~我们同样没有换行&#xff0c…

设计模式的优点

设计模式的优点 1、可重用性2、架构指导3、经验传承4、设计透明5、实践验证 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、可重用性 设计模式允许开发者在遇到相似问题时复用解决方案&#xff0c;节省时间并减少错误。 2、架构指导 …

C:初识指针—学习笔记

目录 前言&#xff1a; 1、内存和地址 1.1 理解内存和地址 1.2 理解编址 2、指针变量和地址 2.1 取地址操作符&#xff1a;& 2.2 指针变量 2.3 如何拆解指针类型 2.4 解引用操作符&#xff08;*&#xff09; 2.5 指针变量的大小 3、指针变量类型的意义 3.1 指针…

C语言:指针(2)

一.数组名 在了解数组名前我们先看一段代码 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 根据我们上一篇学习的知识&#xff0c;我们知道&arr[0]是数组第一个元素的地址&#xff0c;这时我们再看另一段代码的运行结果。 #include <stdio.h> int ma…

Hadoop的安装和使用-2024年08月01日

Hadoop的安装和使用-2024年08月01日 1.创建Hadoop用户2.SSH登陆权限设置3.java的安装4.Hadoop单机安装配置5.Hadoop伪分布式安装配置 1.创建Hadoop用户 如果安装Ubuntu的时候不是用的“hadoop”用户&#xff0c;那么需要增加一个名为 hadoop的用户首先按ctrlaltt打开终端窗口&…

患者特征对AI算法在解释阴性筛查数字乳腺断层摄影研究中的表现的影响| 文献速递-AI辅助的放射影像疾病诊断

Title 题目 Patient Characteristics Impact Performance of AI Algorithm in Interpreting Negative Screening Digital Breast Tomosynthesis Studies 患者特征对AI算法在解释阴性筛查数字乳腺断层摄影研究中的表现的影响 Background 背景 Artificial intelligence (AI)…

新书速览|AI创意商业广告设计:Adobe Firefly + Photoshop

《AI创意商业广告设计:Adobe Fire.yPhotoshop》 本书内容 随着AI技术的出现&#xff0c;平面设计领域也出现了利用人工智能进行创作的程序&#xff0c;比如Firefly、Midjourney、 Stable Di.usion等。这些程序能够创作出高质量的设计作品。其中&#xff0c;Fire.y是由Adobe公司…

【C++】C++应用案例-通讯录管理系统

目录 一、整体介绍 1.1、需求和目标 1.2、整体功能描述 二、页面及功能描述 2.1 主菜单 2.2 添加联系人菜单 2.3 显示联系人菜单 2.4 修改联系人菜单 2.5 退出功能 三、流程设计 3.1 主流程 3.2 添加操作流程 3.3 显示联系人操作流程 3.4 修改联系人操作流程 四…

面试中的算法 [ 持续更新中 ] 基于Python语言 如何判断链表有环

本文主要介绍了如何判断链表有环的问题&#xff0c;并进行了延伸&#xff1a; 如果链表有环如何求出环的长度&#xff0c;入环节点... ...嗯&#xff0c;点个赞总可以不&#xff01;&#xff01;&#xff01; 目录 5.1如何判断链表有环 5.1.1 有一个单向链表&#xff0c;链表…

web端使用HTML5开发《贪吃蛇》小游戏教程【附源码】

自制游戏列表 1植物大战僵尸自制HTML5游戏《植物大战僵尸》2开心消消乐自制HTML5游戏《开心消消乐》3贪吃蛇自制HTML5游戏《贪吃蛇》4捕鱼达人自制HTML5游戏《捕鱼达人》 一、游戏简介 贪吃蛇是一款经典的电子游戏&#xff0c;最早在1976年由Gremlin公司推出&#xff0c;名为…

SimGCL graph contrastive learning by finding homophily in heterophily

发表于: Knowledge and Information Systems, ccfb 推荐指数: #paper/ ⭐ 总结: 重新定义了相似度矩阵, 重新定义了特征, 重新设计了节点删除概率等, 但是, 换汤不换药, 引入了大量的超参 (快 10 个了吧). 创新点不够, 所以 ccf B 期刊理所应该. (甚至我觉得更低) 相关知识: 本…