你说精通 Redis ,你看过持久化的配置吗?

0145c5efdc7e7cf8f3cd5ea9c4691d47.gif

作者 | 阿Q

来源 | 阿Q说代码

今天让我们从理论和配置两个层面来揭开Redis持久化的神秘面纱。

所谓持久化可以简单理解为将内存中的数据保存到硬盘上存储的过程。持久化之后的数据在系统重启或者宕机之后依然可以进行访问,保证了数据的安全性。

Redis有两种持久化方案,一种是快照方式(SNAPSHOTTING),简称RDB;一种是只追加模式(APPEND ONLY MODE),称为AOF。接下来让我们分别了解一下它们的使用与注意事项。

RDB

RDBRedis DataBase的缩写,是 Redis 默认的持久化方案。它能够在指定的时间间隔内将内存数据集快照(snapshot)写入磁盘,恢复时将快照文件( dump.rdb )读回内存。

4f53047443b0c78053101ba62e16b775.png

我们先来扒一下配置文件中的SNAPSHOTTING:

配置文件

save  <seconds> <changes>

在给定的秒数内,如果对数据库执行的写入操作数达到设定的值,则将数据同步到数据文件。支持多个条件配合,Redis默认配置文件中提供了三个条件:

save 900 1 //900s内有1个更改
save 300 10 //300s内有10个更改
save 60 10000 //60s内有10000次更改

注意:若不想用RDB方案,可以把 save ""的注释打开,上边三个注释掉。

stop-writes-on-bgsave-error yes

bgsave出现错误时,Redis是否停止执行写命令;

  • 如果为yes,则当硬盘出现问题时,Redis将停止接受写入操作,这样我们可以及时发现,避免数据的大量丢失;

  • 如果为no,则Redis无视bgsave的错误继续执行写命令。

如果已经设置了对Redis服务器的正确监视和持久性,即采用了其他手段发现和控制数据完整性,可能希望禁用此功能,以便即使在磁盘、权限等方面出现问题时,Redis仍能正常工作。

注意:如果后台保存过程将再次开始工作,Redis将自动允许再次写入。

rdbcompression yes

指定存储到本地数据库时是否压缩Redis采用LZF压缩)数据,默认为yes。如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变得巨大。

rdbchecksum yes

RDB版本5开始,在存储快照后,还可以使用CRC64算法来进行数据校验,CRC64校验放在文件的末尾。开启之后,保存和加载RDB文件时会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

禁用校验和创建的RDB文件的校验和为零,这将告诉加载代码跳过检查。

dbfilename dump.rdb

指定本地数据库文件名,重启之后自动加载进内存,手动执行save 命令的话即刻生效。

大坑请注意flushallshutdown命令都会清空并提交至dump.rdb

dir ./

指定本地数据库存放目录。

理论

工作方式

  • Redis 需要保存dump.rdb文件时,它会调用系统函数fork(),创建一个子进程(与主进程完全一致);

  • 子进程将数据集写入临时文件RDB中;

  • 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。

如何触发RDB快照

  1. 配置文件中默认的快照配置;

  2. 命令save(阻塞, 只管保存快照,其他的等待)或者是bgsave(异步)命令,快照同时还可以响应客户端命令;

  3. 执行flushall 命令,清空数据库所有数据,意义不大;

  4. 执行shutdown 命令,保证服务器正常关闭且不丢失任何数据,意义也不大。

通过RDB文件恢复数据

在实际开发中,一般会考虑到物理机硬盘损坏的情况,所以我们会选择备份dump.rdb文件。将备份的dump.rdb 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。

优点

  • RDB是一个非常紧凑的文件,非常适用于数据集的备份;

  • RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复;

  • Redis的主进程不进行I/O操作,确保了极高的性能;

  • 适合大规模数据的恢复,对于数据的完整性和一致性要求不高的话,RDBAOF方式更加高效。

缺点

  • Redis意外宕机时,你可能会丢失几分钟的数据;

  • RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求。如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒;AOF也需要fork,但是可以调节重写日志文件的频率来提高数据集的耐久度。

AOF

为了解决RDB方式在宕机时丢失数据过多的问题,从1.1 版本开始,Redis增加了一种durable的持久化方式:AOF

AOFAppend Only File的缩写,默认不开启。AOF以日志的形式来记录每个写操作,只允许追加文件但不可以改写文件,当服务器重启的时候会重新执行这些命令来恢复原始的数据。

我们再来看一下配置文件中的APPEND ONLY MODE:

配置文件

appendonly no

默认为关闭状态,改为yes打开持久化。AOFRDB可以同时启用而不会出现问题。

appendfilename "appendonly.aof"

文件默认名称,启动即创建。加载先于dump.rdb文件

appendfsync

同步策略:系统函数fsync() 告诉操作系统在磁盘上实际写入数据。Redis支持三种不同的模式

appendfsync always //每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好
appendfsync everysec //默认推荐,异步操作,每秒记录,如果宕机,有1秒内数据丢失
appendfsync no //不同步,只有在操作系统需要时在刷新数据

要想了解接下来的配置内容,先得说一下“日志重写”的原理:

重写

由于AOF采用的是将命令追加到文件末尾的方式,所以随着写入命令的不断增加,AOF文件的体积会变得越来越大。为避免出现此种情况,新增了重写机制:可以在不打断服务客户端的情况下,对AOF文件进行重建(rebuild)。

重写触发: 通过执行bgrewriteaof命令,可以生成一个新的AOF文件,该文件包含重建当前数据集所需的最少命令。Redis 2.2需手动执行该命令,Redis 2.4则可以通过修改配置文件的方式自动触发(配置在下边涉及)。

重写原理:

  • Redis 执行系统函数fork() ,创建一个子进程(与主进程完全一致);

  • 子进程开始将新 AOF 文件的内容写入到临时文件;

  • 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾,这样即使在重写的中途发生停机,现有的 AOF 文件也是安全的;

  • 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。

  • Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF文件的末尾。

no-appendfsync-on-rewrite no

当我们同时执行主进程的写操作和子进程的重写操作时,两者都会操作磁盘,而重写往往会涉及到大量的磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形。

为了解决这个问题,no-appendfsync-on-rewrite参数出场了。

  • 如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题;

  • 如果设置为yes,这就相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区。因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就会丢失数据。丢失多少数据呢?在linux的操作系统的默认设置下,最多会丢失30s的数据。

因此,如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes;如果应用系统无法忍受数据丢失,则设置为no

auto-aof-rewrite-percentage 100

重写百分比,默认为上次重写后aof文件大小的一倍。

auto-aof-rewrite-min-size 64mb

重写触发的最小值:64mb。

根据auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage参数确定自动触发时机。Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。

大型互联网公司一般都是3G起步

aof-load-truncated yes

AOF文件被截断时,即AOF文件的最后命令不完整,如果此时启动Redis,会将AOF数据加载回内存,此时便会出现问题。

  • yes:加载一个截断的AOFRedis服务器开始发出日志,通知用户该事件;

  • no:服务器将中止并出现错误,拒绝启动。

当我们得知AOF文件报错时,可以用以下方法来修复出错的 AOF 文件:

  • 为现有的 AOF文件创建一个备份;

  • 使用 Redis 附带的 redis-check-aof 命令,对原来的AOF文件进行修复;

    • redis-check-aof –fix

    • redis-check-aof --fix appendonly.aof  修复命令,杀光不符合规范的语法

  • 可选)使用 diff -u 对比修复后的 AOF文件和原始 AOF 文件的备份,查看两个文件之间的不同之处;

  • 重启 Redis服务器,等待服务器载入修复后的 AOF文件,并进行数据恢复。

aof-use-rdb-preamble yes

在重写AOF文件时,Redis能够在AOF文件中使用RDB前导,以加快重写和恢复速度。启用此选项后,重写的AOF文件由两个不同的节组成:RDB fileAOF tail

加载Redis时,会识别AOF文件以Redis字符串开头,并加载带前缀的RDB文件,然后继续加载AOF尾部。

理论

优点

  • 数据的完整性和一致性更高,AOF的持久化通过使用不同的策略,最多丢失1秒的数据;

  • AOF文件是一个只进行追加的日志文件,不需要写入seek

  • Redis可以在 AOF文件体积变得过大时,自动地在后台对 AOF 进行重写,重写操作是绝对安全的;

  • AOF文件记录的写入操作以Redis协议的格式保存,容易读懂,容易对文件进行分析;

缺点

  • 对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积;

  • 根据所使用的 fsync 策略,AOF的速度可能会慢于RDB

在一般情况下,每秒 fsync 的性能依然非常高,而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。

对比与总结

如何选择使用哪种持久化方式?

一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性,应该同时使用两种持久化功能。

如果非常关心数据,但仍然可以承受数分钟以内的数据丢失,那么可以只使用 RDB 持久化。

由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式。

有很多用户都只使用AOF持久化,但我们并不推荐这种方式:因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份,并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快。

AOF和RDB之间的相互作用

在版本号大于等于 2.4Redis 中,BGSAVE 执行的过程中,不可以执行 BGREWRITEAOF 。反过来说,在 BGREWRITEAOF 执行的过程中,也不可以执行 BGSAVE。这可以防止两个 Redis 后台进程同时对磁盘进行大量的I/O 操作。

如果 BGSAVE 正在执行,并且用户显示地调用 BGREWRITEAOF 命令,那么服务器将向用户回复一个 OK 状态, 并告知用户BGREWRITEAOF 已经被预定执行:一旦 BGSAVE 执行完毕,BGREWRITEAOF就会正式开始。

Redis 启动时,如果 RDB持久化和 AOF 持久化都被打开了, 那么程序会优先使用 AOF 文件来恢复数据集,因为 AOF文件所保存的数据通常是最完整的。

备份redis数据

  • 创建一个定期任务(cron job),每小时将一个 RDB 文件备份到一个文件夹,并且每天将一个 RDB 文件备份到另一个文件夹;

  • 确保快照的备份都带有相应的日期和时间信息,每次执行定期任务脚本时,使用 find 命令来删除过期的快照;

  • 至少每天一次,将 RDB 备份到你的数据中心之外,或者至少是备份到你运行 Redis 服务器的物理机器之外。

性能建议

在实际应用时,因为RDB文件只用作后备用途,建议只在slave上持久化RDB文件,而且只需要15分钟备份一次就够了,只保留save 900 1这条规则。

如果开启AOF,好处是在最恶劣情况下也只会丢失不超过2秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。

只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设置到5G以上。默认超过原大小的100%时重写可以改到适当的数值。

如果不开启AOF,仅靠Master-Slave Replication实现高可用性也可以。能省掉一大笔IO,也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。

7b86a7819a18f3ef5a915962639bffce.gif

ae04e3d1d597b7c509855b66fc0b11b9.png

往期推荐

5G 落地进入爆发期,是时候让毫米波登场了

Github王炸功能!Copilot替代打工人编程?

边缘应用增长800%,听听Akamai边缘部署的经验

Mendix 发布全球低代码报告

3b2802195506c8079eb3641f21cd0dac.gif

点分享

e518890f4c8a75c6bcd01b69f917e095.gif

点收藏

2d0892c3b61c4cf1bd32da455c1893dd.gif

点点赞

72cda2ba667a11f856638a6c3df8da4e.gif

点在看

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

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

相关文章

matlab from有什么用,Matlab函数使用'fromworkspace'将向量传递给simulink

我想编写一个包含simulink块的matlab函数 . 该函数应将数据加载到simulink模型中&#xff0c;运行它&#xff0c;然后从函数返回数据 .我能想到的唯一方法就是在simulink中使用To Workspace和From Workspace块 . 问题是From Workspace块不从功能范围中获取变量&#xff0c;只从…

一种低延迟的超时中心实现方式

简介&#xff1a; 在很多产品中都存在生命周期相关的设计&#xff0c;时间节点到了之后需要做对应的事情。超时中心&#xff08;TimeOutCenter&#xff0c;TOC&#xff09;负责存储和调度生命周期节点上面的超时任务&#xff0c;当超时任务设置的超时时间到期后&#xff0c;超时…

浪潮云海OpenStack X版本技术贡献中国第一

10月6日&#xff0c;OpenStack社区发布第24个版本 Xena&#xff08;简称X版本&#xff09;&#xff0c;浪潮云海在Nova、Cyborg、Cinder、Masakari、Manila等核心项目的技术贡献排名再次获得「中国第一」、全球前三&#xff0c;已连续4个版本荣登社区技术贡献国内榜首&#xff…

【实践案例】Databricks 数据洞察在美的暖通与楼宇的应用实践

简介&#xff1a; 获取更详细的 Databricks 数据洞察相关信息&#xff0c;可至产品详情页查看&#xff1a;https://www.aliyun.com/product/bigdata/spark 作者 美的暖通与楼宇事业部 先行研究中心智能技术部 美的暖通 IoT 数据平台建设背景 美的暖通与楼宇事业部&#xff0…

mysql 默认时间字段 1067,mysql替datetime类型字段设置默认值default

操作服务器环境为Linux centos5.7安装的mysql版本 MariaDB&#xff0c;图简单直接使用命令install上去的。在自己mac上测试数据库修改Alter语句没有问题的&#xff0c;ALTER TABLE XXX.XXX ADD COLUMN createtime datetime NOT NULL DEFAULT NOW() AFTER userinfo;但是在服务器…

tcp ip协议_网络通信-TCP/IP协议族简述

导读&#xff1a;计算机与网络设备要相互通信需要遵守同样的规则。例如&#xff0c;如何找到通信目标、该使用哪种语言通信、怎么结束通信等规则。不同的硬件、操作系统之间的通信都需要遵循同一种规则&#xff0c;这种规则也称为是协议。下面本文主要从以下三个点讨论与互联网…

网站图片全自动加密_11 个值得收藏的在线工具和资源网站

pdf.toPDF 格式免费转换工具&#xff0c;可将 PDF 与其他文件类型相互转换&#xff0c;其他文件类型可自行查看。网站还提供常用的 PDF 工具&#xff0c;包括压缩、修复、拆分和解锁 PDF。ilovepdf完全免费。与 pdf.to 的区别是它支持转换的文件类型少&#xff0c;但 PDF 工具丰…

超详攻略!Databricks 数据洞察 - 企业级全托管 Spark 大数据分析平台及案例分析

简介&#xff1a; 5分钟读懂 Databricks 数据洞察 ~ 更多详细信息可登录 Databricks 数据洞察 产品链接&#xff1a;https://www.aliyun.com/product/bigdata/spark&#xff08;当前产品提供&#xffe5;599首购试用活动&#xff0c;欢迎试用&#xff01;&#xff09; 开源大数…

Alluxio完成C轮5000万美元融资,新设中国区总部力拓国内市场

编辑 | 宋慧 出品 | CSDN云计算 头图 | 付费下载于 IC photo 11月17日&#xff0c;全球开源的云原生数据编排软件开发商Alluxio宣布完成5000万美元C轮融资&#xff0c;该轮融资由新投资方高瓴创投领投&#xff0c;战略投资方和原股东a16z, Seven Seas Partners&#xff0c;火…

关于架构师:角色、能力和挑战

简介&#xff1a; 成为一名架构师可能是很多开发者的技术追求之一。那么如何理解架构&#xff1f;架构师是一个什么样的角色&#xff0c;需要具备什么样的能力&#xff1f;在架构师的道路上&#xff0c;会面临哪些挑战&#xff1f;本文作者道延分享他对架构以及架构师的思考和相…

php 网站移动端自适应,HTML5 移动端自适应布局

场景&#xff1a;为适应各种大小的屏幕自适应布局我知道的两种方式1.使用媒体查询&#xff0c;下面制定了几种适应方式&#xff0c;例如第一个表示屏幕宽度在320px-360px之间的&#xff0c;html字体大小适配为13.65pxmedia only screen and (max-width: 360px) and (min-width:…

python avg_python闭包

本文分为如下几个部分什么是闭包闭包与装饰器闭包等价——偏函数闭包等价——类闭包等价——其他闭包用于捕获状态值闭包等价——协程三种方法实现动态均值什么是闭包闭包是携带着一些自由变量的函数。我们直接来看一个例子def fun_out(a):def fun_in(b):return a breturn fun…

云上技术 | 混合云管理平台多Region架构

简介&#xff1a; 随着现代化进程加速&#xff0c;企业业务规模和迭代速度也今非昔比&#xff0c;在已具备一定规模的中大型电力系统中&#xff0c;会面临着数字化升级的压力&#xff0c;包括复杂组织架构管理、计算资源弹性扩展、IT运维提效等需求。基于电力行业属性部署一朵专…

超值爆赞丨Java 程序员推荐的学习教程,刷爆了朋友圈...

文内福利&#xff0c;扫码免费领取Hello&#xff0c;各位锋迷们&#xff0c;我是小千。很多学习Java的小伙伴都在找的全套免费java视频教程&#xff0c;这里全都有&#xff0c;资料齐全&#xff0c;拿来吧你&#xff01;零基础学Java的学习路线图是怎样的&#xff1f;&#xff…

cas server php下载,关于用CAS Server与Php、Jetty配置实现SSO#4

最早由Yale开发的CAS在目前开源SSO市场上占据了80%的份额。简单研究了一下&#xff0c;感觉CAS确实比较成熟&#xff0c;认证流程均可通过证书保证安全&#xff0c;也提供了对多种App服务器和开发环境的支持。比较感兴趣的是两个&#xff1a;Php和Jetty&#xff0c;前者较为常用…

阿里大数据云原生化实践,EMR Spark on ACK 产品介绍

开源大数据社区 & 阿里云 EMR 系列直播 第六期 主题&#xff1a;EMR spark on ACK 产品演示及最佳实践 讲师&#xff1a;石磊&#xff0c;阿里云 EMR 团队技术专家 内容框架&#xff1a; 云原生化挑战及阿里实践Spark 容器化方案产品介绍和演示直播回放&#xff1a;扫描文…

剪映电脑版_七款手机剪辑app,效果堪比电脑软件

鉴于很多小伙伴因为没有电脑或者电脑配置低带不动pr或者AE的这类软件&#xff0c;但是又对剪辑有一定兴趣的人&#xff0c;可以先从手机上的剪辑做起&#xff0c;可以为以后的电脑办公打下很好的基础&#xff0c;亦或者有些人在电脑不方便用的情况下&#xff0c;想先用手机大致…

xposed 修改参数_【Android 原创】2020春节红包第三题Xposed框架Hook的应用

作者论坛账号&#xff1a;CrazyNut准备工具以及思路首先不了解Xposed框架Hook的可以看看大佬的基础教程 - 《教我兄弟学Android逆向12 编写xposed模块》本文不需要会看懂汇编代码&#xff0c;当你看完上面的文章&#xff0c;学会Xposed框架Hook的简单应用后。就算是从未接触过的…

Let‘s Fluent:更顺滑的MyBatis

简介&#xff1a; 只需瞅一眼Google Trends上全球Java界最热门的两款SQL映射框架近一年的对比数字&#xff0c;就不难了解其实力分布&#xff1a;在此领域&#xff0c;MyBatis早已占领东亚地区开发者市场&#xff0c;并以绝对优势稳居中国最抢手Java数据库访问框架之首。 作者 …

元宇宙会成为 IPv6 的拐点吗?

‍‍作者 | 马超&#xff0c;王丽丽&#xff0c;王一凡 责编 | 张红月出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;“如无必要&#xff0c;勿增实体”的奥卡姆剃刀原则&#xff0c;从IT人士的角度来看就是“只要能运行&#xff0c;就千万不要改”&#xf…