【Redis 神秘大陆】006 灾备方案
六、Redis 灾备方案
6.1 存储方案
6.1.1 基础对比
| RDB持久化 | AOF持久化 | |
|---|---|---|
| 原理 | 周期性fork子进程生成持久化文件 | 每次写入记录命令日志 |
| 文件类型 | 二进制dump快照文件 | 文本appendonly日志文件 |
| 触发条件 | 默认超过300s间隔且有1s内超过1kb数据变更 | 永久性每秒fsync一次 |
| 文件位置 | 配置文件中指定目录 | 日志文件appendonly.aof |
| 写入方式 | fork后子进程同步写快照,对读写性能影响小,速度高 | 每次写入追加日志 |
| 文件格式 | RDB二进制密集结构 | AOF日志易读文本格式 |
| 数据一致性 | 快照间隔时间内可能丢失部分写 | 实时写入保证数据完整性 |
| 故障恢复 | 直接加载快照文件重建数据集,恢复更快 | 根据日志回放还原每个写操作 |
| 性能影响 | fork时可能短暂阻塞客户端 | 每次写带来额外I/O开销 |
| 自动回收 | 清理过期快照 | AOF重写动态缩小日志 |
| 扩展 | 作为主从复制基础 | 主从 replicate依赖AOF日志 |
| 选择原则 | 冷备,部分大容量场景 | 热备,追求数据安全与一致性 |
6.1.2 核心配置
RDB
- save 60 10000:RDB最多丢1分钟的数据,那么尽量就是每隔1分钟都生成一个快照
AOF
- auto-aof-rewrite-percentage 100: 就是当前AOF大小膨胀到超过上次100%,上次的两倍
- auto-aof-rewrite-min-size 64mb: 根据你的数据量来定,16mb,32mb
备份方案
- 写crontab定时调度脚本去做数据备份
- 【48 小时】每小时都copy一份rdb的备份,到一个目录中去,仅仅保留最近48小时的备份
- 【月】每天都保留一份当日的rdb的备份,到一个目录中去,仅仅保留最近1个月的备份
- 【清理】每次copy备份的时候,都把太旧的备份给删了
- 【灾备】每天晚上将当前服务器上所有的数据备份,发送一份到远程的云服务上去
每小时copy一次备份,删除48小时前的数据
crontab -e0 * * * * sh /usr/local/redis/copy/redis_rdb_copy_hourly.sh
redis_rdb_copy_hourly.sh
#!/bin/sh cur_date=`date +%Y%m%d%k`
rm -rf /usr/local/redis/snapshotting/$cur_date
mkdir /usr/local/redis/snapshotting/$cur_date
cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_datedel_date=`date -d -48hour +%Y%m%d%k`
rm -rf /usr/local/redis/snapshotting/$del_date
每天copy一次备份
crontab -e0 0 * * * sh /usr/local/redis/copy/redis_rdb_copy_daily.sh
redis_rdb_copy_daily.sh#!/bin/sh cur_date=`date +%Y%m%d`
rm -rf /usr/local/redis/snapshotting/$cur_date
mkdir /usr/local/redis/snapshotting/$cur_date
cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_datedel_date=`date -d -1month +%Y%m%d`
rm -rf /usr/local/redis/snapshotting/$del_date
每天一次将所有数据上传一次到远程的云服务器上去
rsync
快速恢复
| 场景 | 数据恢复方案 |
|---|---|
| Redis进程挂掉 | 直接基于AOF日志文件进行数据恢复,AOF文件记录了每个写操作的指令,重启Redis进程后,通过重播AOF文件中的指令来恢复数据,最多可能丢失一秒的数据。 |
| Redis进程所在机器挂掉 | 重启机器后,尝试重启Redis进程,尝试直接基于AOF日志文件进行数据恢复。如果AOF文件未破损,可直接重启Redis进程进行恢复。若AOF文件破损,可以使用redis-check-aof工具修复。 |
| 当前最新的AOF和RDB文件出现丢失/损坏 | 尝试基于当前机器上最新的RDB数据副本进行数据恢复。如果RDB文件丢失或损坏,可以从其他备份中恢复数据。 |
| 当前机器上的所有RDB文件全部损坏 | 从远程的云服务上拉取最新的RDB快照来恢复数据。 |
| 发现有重大的数据错误,如某个小时上线的程序导致数据错乱 | 选择某个更早的时间点的RDB数据副本进行恢复,将数据恢复到更早的状态。例如,发现某个时刻的数据错误,可以选择较早的RDB备份进行恢复。 |
6.2 缓存灾备处理
- 主从机制冗余备份【对等副本】:
- 策略:确保缓存系统采用主从机制,即在集群中的某一部分缓存不可用时,可以通过其他节点补充上去,保持系统的稳定运行。
- 方案:确保缓存系统采用主从机制,并及时修复故障节点,保证系统的冗余备份可用性。
- 部分用户降级【部分降级】:
- 策略:如果缓存导致应用可用性下降,可以考虑通过降级方案让一部分用户先用起来,减轻系统压力,等待缓存恢复。
- 方案:根据系统承受能力,设计降级方案,将一部分用户转移到备用系统或者采用降级功能,保证核心用户的使用体验。
- 逐步减少降级量【逐步恢复】:
- 策略:一旦部分用户降级以减少系统压力,可以逐步减少降级量,逐步恢复系统的正常状态。
- 方案:一旦缓存系统恢复正常,逐步恢复所有用户的使用权限,直至所有用户都能正常使用系统功能。
- 后台Worker预热缓存数据【提前预热】:
- 策略:当缓存系统故障后,后台Worker可以负责预热缓存数据,重新建立缓存,以尽快恢复系统的性能。
- 方案:通过后台Worker程序,根据业务规则和数据特性,预热缓存数据,尽快恢复系统的性能。
6.3 过期策略【重点】
策略介绍
https://help.aliyun.com/zh/redis/support/how-does-apsaradb-for-redis-evict-data-by-default
- volatile-lru(默认):从已设置过期时间(Expire)的Key中,删除最近最少使用的Key(LRU算法),且不会考虑Key是否已经过期。
- volatile-lfu:从已设置过期时间(Expire)的Key中,删除最不常用的Key(LFU算法)。
- volatile-random:从已设置过期时间(Expire)的Key中,随机删除一些Key。
- volatile-ttl:从已设置过期时间(Expire)的Key中,根据存活时间(TTL)从小到大排序进行删除。
- allkeys-lru:从所有Key中,删除最近最少使用的Key(LRU算法)。
- allkeys-lfu:从所有Key中,删除最不常用的Key(LFU算法)。
- allkeys-random:从所有Key中,随机删除一些Key。
- noeviction:不删除任何Key,当内存达到上限时,将无法写入新数据,数据库会返回错误信息。
数据删除策略
惰性删除:主节点在处理读取命令时会检查键是否超时,如果超时则执行删除命令,并异步发送删除命令给从节点。从节点不会主动删除超时数据,而是依赖主节点发送的删除命令。

定时删除:Redis主节点通过内部定时任务循环采样一定数量的键,当发现采样的键超时时,执行删除命令,并将删除命令同步给从节点。

当你发现这些内容对你有帮助时,为了支持我的工作,不妨给一个免费的⭐Star,这将是对我最大的鼓励!感谢你的陪伴与支持!一起在技术的路上共同成长吧!点击链接:GitHub | Gitee
相关文章:
【Redis 神秘大陆】006 灾备方案
六、Redis 灾备方案 6.1 存储方案 6.1.1 基础对比 RDB持久化AOF持久化原理周期性fork子进程生成持久化文件每次写入记录命令日志文件类型二进制dump快照文件文本appendonly日志文件触发条件默认超过300s间隔且有1s内超过1kb数据变更永久性每秒fsync一次文件位置配置文件中指…...
【Java基础】17.异常处理
文章目录 前言一、异常的概念1.异常的3种类型2.支持异常处理的关键字和类 二、Exception 类的层次三、内置异常类1.非检查性异常2.检查性异常类 四、异常处理1.捕获异常2.多重捕获块3.throws/throw 关键字1.throw 关键字2.throws 关键字 3.finally关键字 五、编译时异常处理方式…...
【python】flask结合SQLAlchemy,在视图函数中实现对数据库的增删改查
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
APIGateway的认证
APIGateway的支持的认证如下: 我们从表格中可以看到,HTTP API 不支持资源策略的功能,另外是通过JWT的方式集成Cognito的。 对于REST API则是没有显示说明支持JWT认证,这个我们可以通过Lambda 自定义的方式来实现。 所以按照这个…...
MacOS Github Push项目 精简版步骤
大白菜教程:小白菜 macOS github提交代码-CSDN博客 步骤1:git init步骤2: touch .gitignore 创建ignore文件 open .gitignore 打开ignore文件 编写ignore文件.idea/ 是文件夹的意思.git/ 也是自动生成的文件夹 也不上传.DS_St…...
Eclipse的基本使用讲解(建项目,建包,建类,写代码(基本语法))新手入门必备
目录 一.介绍eclipse 二.操作Eclipse 1.选择工作空间 2.建项目,建包,建类 1.建项目(两种) 2.建包 3.建类 三.写代码(基本语法) 1.代码操作 2.代码规范 3.代码注释 一.介绍eclipse Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其…...
3D模型处理的并行化
今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息,并分享我发现的一些小技巧,例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 那么我们为什么要诉诸并行计算呢? 使用数据有时会出现…...
盲人安全导航技巧:科技赋能让出行更自如
作为一名资深记者,长期关注并报道无障碍领域的发展动态。今日,我将聚焦盲人安全导航技巧,探讨这一主题下科技如何赋能视障人士实现更为安全、独立的出行。一款融合了实时避障、拍照识别物体及场景功能的盲人出行辅助应用叫做蝙蝠避障…...
问,由于java存在性能上,以及部分功能上的缺点,请问如何正确使用C,C++,Go,这三个语言,提升Java Web项目的性能?
拓展阅读:版本任你发,我用java8 我明白Java虽然在许多方面表现出色,但在某些特定场景下可能会遇到性能瓶颈或功能限制。为了提升Java Web项目的性能,可以考虑将C、C和Go这三种语言用于特定的组件或服务。以下是如何正确使用这些语…...
【信号与系统 - 9】傅里叶变换的性质习题
1 习题 已知 f ( t ) f(t) f(t) 的傅里叶变换为 F ( j w ) F(jw) F(jw) ,求如下信号的傅里叶变换 (1) t ⋅ f ( 3 t ) t\cdot f(3t) t⋅f(3t) 解: f ( 3 t ) ↔ 1 3 F ( j w 3 ) f(3t)\leftrightarrow \frac{1}{3}F(j\frac{w}…...
C#探索之路基础夯实篇(5):语法糖概念解析
C#探索之路基础夯实篇(5):语法糖概念解析 文章目录 C#探索之路基础夯实篇(5):语法糖概念解析1、概念定义2、Lua中的语法糖3、C#中的语法糖4、C中的语法糖5、优缺点辨析6、适用范围7、总结 从之前一开始接触lua的时候开始,开始第一次接触到语法…...
SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比
产品概述 Apache SeaTunnel 是一个非常易用的超高性能分布式数据集成产品,支持海量数据的离线及实时同步。每天可稳定高效同步万亿级数据,已应用于数百家企业生产,也是首个由国人主导贡献到 Apache 基金会的数据集成顶级项目。 SeaTunnel 主要解决数据集成领域的常见问题:…...
深入理解汇编:平栈、CALL和RET指令详解
视频学习下载地址:https://pan.quark.cn/s/04e6946a803a 汇编语言以其接近硬件的特性和高效的执行速度,在系统编程、性能优化和逆向工程中占有不可或缺的地位。本文将深入探讨汇编语言中的平栈操作以及CALL和RET指令&#…...
DP4 最小花费爬楼梯
原题链接:最小花费爬楼梯_牛客题霸_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dp。 开一个dp数组和a数组。dp[i]表示在当前这一格所需要的费用,a数组其实就是题目中的cost数组。 因为最后要求到顶楼的最低费用&a…...
OpenXR API概览与核心组件解析
在虚拟现实(VR)和增强现实(AR)领域,OpenXR API提供了一个重要的开放标准,使得开发者能够跨多种硬件和软件平台创建兼容的应用。本文将详细解释OpenXR中的核心组件和数据结构,并探讨它们如何共同…...
安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包
前言: 最近在完成公司的项目时,为了兼容其他的版本,需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包,安装成功之后,分享如下: 安装命令: ant-design-vue: 不…...
Zynq7000系列中的休眠模式
休眠模式是在系统层面定义的,它包括将APU置于待机模式,并将多个控制器保持在无时钟的复位状态。 进入休眠模式可以大大降低功耗。在休眠模式下,大多数功能时钟组都会被关闭或断电。唯一需要保持活动的设备是一个CPU、窥探控制单元(…...
在redhat7/8平台上部署ELK7.17.18的技术方案
部署环境说明 为节省资源直接使用1台测试机模拟3节点elasticsearch服务集群做部署,在该主机上同时部署了3个elasticsearch实例、1个logstash实例、1个kibana实例、1个filebeat实例。对于生产环境,以上实例服务应该做分布式部署。 ELK-TEST1 192.168.10…...
(Chat For Al,创新Al,汇语Al助手,AiTab新标签,万能助手,LLaVA)分享6个好用的ChatGPT
目录 1、Chat For AI 2、创想AI 3、汇语AL助手...
MySQL-锁篇
文章目录 表级锁和行级锁了解吗?有什么区别?行级锁使用有什么注意事项?InnoDB有哪几类行锁?共享锁和排他锁是什么?意向锁有什么用? 锁是一种常见的并发事务的控制方式 表级锁和行级锁了解吗?有什…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
