redis--高可用之持久化
redis高可用相关知识
在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。
但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务( 如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。
redis持久化
1.持久化是什么
持久化是最简单的高可用方法,主要作用是数据备份,也就是把redis缓存中内存中的数据把他保存到本地的硬盘中。
特点:冷备份(必须要停服务才能数据备份)
2.持久化的两种方式
- RDB持久化:原理是将Reids在内存中的数据库记录定时保存到磁盘上。(定时对内存中的数据生成快照,以文件形式保存在硬盘中)
- AOF持久化(append only file):原理是将Reids 的操作日志以追加的方式写入文件,类似于MySQL的binlog。(类似于Mysql的二进制日志)(以追加的方式将写和删的操作命令记录到AOF文件中)
rdb的持久化
rdb持久化:指在指定时间间隔内,将内存中当前进程中的数据生成快照保存到硬盘(快照持久化),用二进制压缩存储。保存的文件名后缀.rdb。redis启动时,可以直接读取快照文件,实现数据恢复。
rdb的触发机制:
(1)手动触发
save命令和bgsave命令都可以生成RDB文件。
- save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在Redis服务器阻塞期间,服务器不能处理任何命令请求。
- 而bgsave命令会创建一个子进程,由子进程来负责创建RDB文件,父进程(即Redis主进程)则继续处理请求。
- bgsave命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,因此save已基本被废弃,线上环境要杜绝save的使用。
save是使用主进程创建。杜绝使用!!!!!!!
示意图:
(2)自动触发
在自动触发RDB持久化时,Redis 也会选择bgsave而不是save来进行持久化。
自动触发最常见的情况是在配置文件中通过 save m n
指定当m秒内发生n次变化时,会触发bgsave。
bgsave:
bgsave就是主从复制的机制
创建一个子进程,让子进程创建rdb文件
bgsave特点:
主进程会通过fork机制创建一个子进程,子进程的创建过程中,主进程会阻塞,子进程创建完毕,主进程会停止阻塞。子进程来创建rdb文件。创建完成之后,通知主进程更新通知信息
vim /etc/redis/6379.conf #编辑配置文件----219行--以下三个save条件满足任意一一个时,都会引起bgsave的调用save 900 1 #当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsavesave 300 10 #当时间到300秒时,如果redis数据发生了至少10次变化,则执行bgsavesave 60 10000 #当时间到60秒时,如果redis数据发生了至少10000次变化, 则执行bgsave----242行--是否开启RDB文件压缩rdbcompression yes----254行--指定RDB文件名dbfilename dump.rdb----264行--指定RDB文件和AOF文件所在目录dir /var/lib/redis/6379
若将修改为 save 60 2会有怎么样的结果?
Save 60 2 的含义是,60秒内,有两次更新才会记录bgsave
接下来60秒内创建2个以上的文件
如果只有一个创建然后exit,就会等待900秒
配置文件内有所更新,而且连带第一次的一起更新
AOF持久化
- RDB持久化是将进程数据写入文件,而AOF持久化,则是将Redis执行的每次写、删除命令记录到单独的日志文件中,查询操作不会记录。
- 当Redis重启时再次执行AOF文件中的命令来恢复数据。(重放命令进行恢复)
- 与RDB相比,AOF的实时性更好,因此已成为主流的持久化方案。
AOF的开启配置
vim /etc/redis/6379.conf----700行---修改,开启AOFappendonly yes----704行---指定AOF文件名称appendfilename "appendonly.aof"----796行---是否忽略最后一条可能存在问题的指令aof-load-truncated yes #Redis恢复时,发现AOF文件的末尾被截断了,会忽略最后一条可能存在问题的指令。默认值yes。即在aof写入时,可能发生redis机器运行崩溃,AOF文件的末尾被截断了,这种情况下,yes会继续执行并恢复尽量多的数据,而no会直接恢复失败报错退出。/etc/init.d/redis_6379 restart #重启redisls /var/lib/redis/6379/ #查看是否生成了aof文件
AOF缓存区的同步文件策略存在三种同步方式,它们分别是:
- appendfsync always:命令写入aof_buf后立即调用系统fsync操作同步到AOF文件。安全性高,性能低。
- appendfsync no:当缓冲区被填满或超过了指定时限后(默认30秒),才将缓冲区的数据写入到硬盘里。性能高,但安全性低。
- appendfsync everysec:每秒同步一次,是性能和数据安全性的平衡,因此是Redis的默认配置。
appendfsync always写入过程中,立即调用redis系统的fsync操作写入到aof文件,这次写入都执行同步,硬盘的性能有瓶颈。硬盘的寿命也会大大降低appendfsync everysec
命令写入,调用write操作,write操作结束后,线程会返回,fsync同步文件由专门的线程每秒调用一次。这是一个折中的策略,是性能和安全性的平衡,是redis的默认配置,也是推荐配置appendfsync no写入操作会调用系统的write操作,但是不对aof文件进行同步,操作系统来同步,同步周期是30秒,文件同步时间不可控,缓冲区会堆积大量数据,数据的安全无法保证
aof的备份恢复
vim /etc/redis/6379.conf
cd /var/lib/redis/6379
#检查文件是否生成实现数据恢复
进入redis
set test1 1
set test2 2
set test3 3
vim /var/lib/redis/6379/appendonly.aof
#配置文件会记录所有redis的操作
flushall
/etc/init.d/redis_6379 stop
#停止redis服务
vim /var/lib/redis/6379/appendonly.aof
#根据为位置点删除flushall这个操作
/etc/init.d/redis_6379 restart
#重启服务
进入redis查看文件恢复
实验已经完成!
aof的重写功能
- 随着时间流逝,Redis服务器执行的写命令越来越多,AOF文件也会越来越大;过大的AOF文件不仅会影响服务器的正常运行,也会导致数据恢复需要的时间过长。
- 文件重写是指定期重写AOF文件,减小AOF文件的体积。需要注意的是,AOF 重写是把Redis进程内的数据转化为写命令,同步到新的AOF文件;不会对旧的AOF文件进行任何读取、写入操作!
- 关于文件重写需要注意的另一点是:对于AOF持久化来说,文件重写虽然是强烈推荐的,但并不是必须的;即使没有文件重写,数据也可以被持久化并在Redis启动的时候导入。因此在一些现实中,会关闭自动的文件重写,然后通过定时任务在每天的某一时刻定时执行。
注意:
重写会消耗性能,影响业务,不能在业务高峰期进行重写。所以一般会关闭自动重写,由定时任务在每天的某一时刻定时执行重写功能。
重写触发条件
- 手动触发: 直接调用bgrewriteaof命令,该命令的执行与bgsave有些类似:都是fork子进程进行具体的工作,且都只有在fork时阻塞。------redis-cli bgrewriteaof
- 自动触发: 通过设置auto-aof-rewrite-min-size选项和auto-aof-rewrite-percentage选项来自动执行BGREWRITEAOF。
- 只有当auto-aof-rewrite-min-size和auto-aof-rewrite-percentage两个选项同时满足时,才会自动触发AOF重写,即bgrewriteaof操作。
vim /etc/redis/6379.conf----771行----771 auto-aof-rewrite-percentage 100772 auto-aof-rewrite-min-size 64mb-----------------------以下是注释--------------------------------● auto-aof-rewrite-percentage 100 #文件的大小超过基准百分之多少后触发bgrewriteaof。默认这个值设置为100,意味着当前aof是基准大小的两倍的时候触发bgrewriteaof。把它设置为0可以禁用自动触发的功能。#即当前AOF文件大小(即aof_current_size)是上次日志重写时AOF文件大小(aof_base_size)两倍时,发生BGREWRITEAOF操作。#注意:例如上次文件达到100M进行重写,那么这次需要达到200M时才进行重写。文件需要越来越大,所以一般不使用自动重写。如果使用自动重写,需要定期手动重写干预一次,让文件要求恢复到100M。● auto-aof-rewrite-min-size 64mb #当文件大于64M时才会进行重写#当前aof文件大于多少字节后才触发。#当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF
文件重写压缩AOF文件的原因
- 过期的数据不再写入文件。
- 无效的命令不再写入文件:如有些数据被重复设值(set mykey v1, set mykey v2)、 有些数据被删除了(set myset vl, del myset)等。
- 多条命令可以合并为一个:如sadd myset v1, sadd myset v2, sadd myset v3可以合并为sadd myset v1 v2 v3。(sadd添加集合)
核心:
重写之后,aof文件当中命令减少了,内容自然减少,空间也少了,自然而然恢复速度也增加了(重写不是必须)
RDB和AOF的优缺点
RDB的优缺点
优点:
RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。当然,与AOF相比, RDB最 重要的优点之一是对性能的影响相对较小。
(体积小,恢复速度更快,对性能影响较小。)
缺点
- RDB文件的致命缺点在于其数据快照的持久化方式决定了必然做不到实时持久化,而在数据越来越重要的今天,数据的大量丢失很多时候是无法接受的,因此AOF持久化成为主流。
- 此外,RDB文 件需要满足特定格式,兼容性差(如老版本的Redis不兼容新版本的RDB文件)。
- 对于RDB持久化,一方面是bgsave在进行fork操作时Redis主进程会阻塞,另一方面,子进程向硬盘写数据也会带来IO压力。
(实时性差、兼容性差、在fork子进程时会阻塞父进程。)
AOF优缺点
优点:
- 秒级持久化,一旦执行,立刻写入,兼容性好(命令写入),文本格式保存的命令。
缺点:
- 文件大。恢复速度慢。AOF持久化需要频繁的向磁盘写数据,磁盘的I/O压力也很大。对redis主进程的性能也会有一定的影响。
相关文章:

redis--高可用之持久化
redis高可用相关知识 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务( 如主…...

『VUE3 の 要点摘录』
✅v-model 用法 v-model 原生方法: v-model computed : 更改名字: 多个 v-model 绑定 处理 v-model 修饰符 ✅TS项目报错 1、TypeScript 错误 “Module ‘…index’ has no default export” // tsconfig.json {...."compilerOpt…...

Buzz库python代码示例
Buzz库来编写一个下载器程序。 php <?php require_once vendor/autoload.php; // 引入Buzz库 use Buzz\Browser; use Buzz\Message\Response; $browser new Browser(); // 设置 $browser->setHttpClient(new HttpClientProxy([ host > , port > , ])…...

Django路由分发
首先明白一点,Django的每一个应用下都可以有自己的templates文件夹,urls.py文件夹,static文件夹,基于这个特点,Django能够很好的做到分组开发(每个人只写自己的app),作为老大&#x…...

【UGUI】中Content Size Fitter)组件-使 UI 元素适应其内容的大小
官方文档:使 UI 元素适应其内容的大小 - Unity 手册 必备组件:Content Size Fitter 通常,在使用矩形变换定位 UI 元素时,应手动指定其位置和大小(可选择性地包括使用父矩形变换进行拉伸的行为)。 但是&a…...

第二十章Java博客
如果一次只完成一件事情,很容易实现。但现实生活中,很多事情都是同时进行的。Java中为了模拟这种状态,引入了线程机制。简单地说,当程序同时完成多件事情时,就是所谓的多线程。多线程应用相当广泛,使用多线…...

实验一 SAS 基本操作和数据表的导入 2023-11-29
一、上机目的 熟悉SAS的集成环境并掌握它的基本操作。理解SAS程序的结构,理解其中的过程,过程选项,语句,语句选项等概念,掌握SAS编程技术。 二、上机内容 主要有SAS操作界面、SAS窗口操作、SAS菜单操作、SAS按钮操作…...

YOLOv5改进之ShuffleNetV2
目录 一、原理 网络结构 二、代码 三、应用到YOLOv5 一、原理...

tcp/ip协议 error=10022 Winsock.reg Winsock2.reg
tcp/ip协议 error10022 这2个注册表选项千万不能删除,否则上不了网。 按下windows键R键,输入regedit,打开注册表,在文件目录里找到如下两个文件夹,删除这两个文件夹。 路径:HKEY_LOCAL_MACHINE\System\C…...

【Redis基础】Redis基本的全局命令
✅作者简介:大家好,我是小杨 📃个人主页:「小杨」的csdn博客 🐳希望大家多多支持🥰一起进步呀! Redis基本的全局命令 1,KEYS命令 语法:KEYS pattern KEYS命令用来查询服…...

Vite 了解
1、vite 与 create-vite 的区别 2、vite 解决的部分问题 3、vite配置文件的细节 3.1、vite语法提示配置 3.2、环境的处理 3.3、环境变量 上图补充 使用 3.4、vite 识别,vue文件的原理 简单概括就是,我们在运行 npm润dev 的时候,vite 会搭起…...
oracle常用通用sql脚本——查询前用户的表空间信息
oracle常用通用sql脚本——查询前用户的表空间信息 一、查询前用户的表空间信息1、 查询当前用户的所有表空间2、 已G为单位3、 已MB为单位 二、以上俩段sql查出结果集存在差异的原因 一、查询前用户的表空间信息 1、 查询当前用户的所有表空间 SELECT * FROM dba_tablespace…...

Python内置类属性`__name__`属性的使用教程
更多Python学习内容:ipengtao.com Python中的__name__是一种内置的特殊属性,通常用于判断模块是作为主程序运行还是作为模块被导入。本文将深入讲解__name__属性的用法,通过丰富的示例代码展示其在不同情景下的应用。 模块作为主程序运行 当一…...

BUUCTF-pwn-ciscn_2019_ne_51
简单查看保护: 32为程序没有canary没有PIE,应该是简单的栈溢出。我们照着这个思路去找溢出点在哪,运行下程序看看什么情况: 程序上来是输入一个密码验证。随便输入下错误直接退出。因此我们需要到IDA中看看怎么回事: 主…...
【限时免费】20天拿下华为OD笔试之【哈希表】2023Q2B-选修课【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录 题目描述与示例题目描述输入输出示例一输入输出说明 示例二输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 现有两门选修课,每门选修课都有一部分学生选修,每个学生都有…...

Android关于杀掉进程的方案
《风波莫听穿林打叶声》—— 苏轼 〔宋代〕 三月七日,沙湖道中遇雨,雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词。 莫听穿林打叶声,何妨吟啸且徐行。 竹杖芒鞋轻胜马,谁怕?一蓑…...
mysql数据库基本概念简介
概述 为什么要使用数据库? 答:实现数据的持久化。 数据库存储类型多样,存储量大。由于其他文件等介质。 概念 DB:database(数据库),保存数据的仓库,本质是一个文件系统。 DBMS:数据库管理系统,常说的Mysql数…...

前端开发_HTML
简介 CSS用于美化内容 HTML用于摆放内容 可以理解为HTML是基础,CSS是工具 HTML定义 HTML 超文本标记语言——HyperText Markup Language 超文本——链接 标记——标签,即带尖括号的文本 标签语法 双标签 开始标签: <xxx> 即尖…...

1.Spring源码解析-ClassPathXmlApplicationContext
此类是读取spring的xml配置文件并解析。也是源码入口之一。 我们调试即将开始。 传递给父类设置值 经调试我们得到是给AbstractApplicationContext设置默认的应用上下文父级的值,很明显是空 给父类AbstractRefreshableConfigApplicationContext设置属性 刷新容器…...
android 动态创建selector状态选择器 动态创建Drawable
最近在做一个使用接口返回的字符串:"#ff0000" 来动态设置drawable背景颜色与动态设置状态选择器selector的需求,之前写习惯了shape的xml,还是第一次写动态的,有点搞笑,搞笑的是自己没写过,不知道…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...