专栏首页AustinDatabasesRedis 持久化,为什么,必须要持久化,不就一个cache吗?

Redis 持久化,为什么,必须要持久化,不就一个cache吗?

鉴于很多企业对于 REDIS MONGODB 的不重视,所以才有了这样的文字,REDIS 很多企业都在用,但用的好不好,估计也只有自己知道,没有密码,监听地址乱写,或者没有持久化,或持久化了也不知道持久化了,这样的情况不少。

今天的说说持久化的问题,Redis 有两种持久化的文件 RDB 和 AOF 文件,而这两种文件到底起到什么作用,估计没有DBA 的单位正在使用REDIS 的这个问题可能不是很清楚,这里就说说REDIS 的 AOF ,RDB 文件。

1 RDB 文件,RDB 文件主要是为了进行REDIS 备份和恢复而进行的,某些应用场景REDIS 存储的数据并不是可以进行丢弃的,例如缓存,有些数据的变动是要刷入到数据库中并不是单纯为了提高性能而进行的静态读取,而如果REDIS CRASH 后,这些数据并没有和传统数据库进行交互和落盘。那数据就丢失了,这样的情况是不能被允许的,所以当整个系统崩溃,或者需要将当时的一部分数据在另外的REDIS进行恢复,则RDB 文件就是最好的恢复方式方法。RDB 文件本身是一个紧凑单一的文件,很容易被传递,另外RDB的文件保存机制也使得保存数据文件消耗的系统资源比较低。

  • Redis 调用forks. 同时拥有父进程和子进程。
  • 子进程将数据集写入到一个临时 RDB 文件中。
  • 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

2 AOF 文件,AOF 文件与RDB 文件相比不同的是AOF 文件并不是一个snapshot 的概念, 他是一个 append 的概念,文件的信息会直接添加到文件的末尾,当然这的方式比上面的RDB文件的好处就是,通过调整数据的刷新方式,是可以做到数据不丢失的,但不利的地方,即使随着保证数据不丢失的等级升高,对REDIS 本身的性能影响就会越突出。并且AOF 文件是在系统重启动,或者CRASH 后,在启动REDIS后对系统数据进行恢复的一种方式。

所以针对上面的量的RDB文件和AOF 文件的不同,两种文件的使用的方式和针对REDIS 所承担的任务不同,就会有一个性能和安全性的衡量。

1 如果你的REDIS 仅仅是从事只读的,并且分担读压力的缓冲层,则可以不使用任何的持久化,因为即使你的REDIS CRASH 了,顶多就是在一次启动REDIS 后开始读取,传统数据库,或通过其他方式将将数据填满,所以可以不涉及持久化

2 如果你的REDIS 是从事写缓冲的工作,例如经常更新数据,所以在REDIS中进行了数据的更新,在多次的运算和更新后,将最后的结果刷入到传统的数据库中,这的确是一个解决高并发,更新值,降低传统数据库负担的方式,例如你一分钟更新上百次或上千次的值的情况下,这样的情况下,你是需要将 RDB 文件和 AOF 文件都开启的,并且随着你的应用逻辑和 你容忍数据可能丢失度的降低,你的RDB 文件和 AOF 文件的保存方式等级都会提高,例如 RDB 文件

你是否需要提高下面的RDB 文件的刷新率 ,根据刷新的频率,调整

例如如果写入的在5秒就有10000次,则不需要调整,如果60秒内写入9999次,则需要调整一下 save 60 10000 变为 save 60 5000

这样RDB 的flush file的频率就会提高,满足你的需求。另外在你CTRL + C 终止REDIS 的情况下(Redis 并未在有),会强制先将数据刷入到 RDB 文件,否则除非你 KILL 否则是无法关闭 REDIS的。

AOF 文件,默认是关闭的,需要打开,并且默认是每秒来进行与磁盘的交互

所以在双重的RDB 和AOF 文件的加持下,在这样的业务场景下,数据安全是有保证的,如果还想严格的不丢失数据,则需要将上图的设置调整为 appendfsync always 打开,则任何的操作都会记录在 appendonly.aof 文件中。

随着REDIS 写入的数据的增加,需要文件的分割,rewrite是aof的一个机制,用来压缩aof文件,通过fork一个子进程,重新写一个新的aof文件,该次重写不是读取旧的aof文件进行复制,而是将读取内存中的redis数据库,重写一份aof文件,有点类似于rdb的快照方式;

触发机制为:

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

当文件大小,达到旧的aof文件大小的2倍的情况下,并且文件达到64MB的情况下,重写机制就会启动。

在重启动时如何处理有错的aof

aof-load-truncated yes

文件重写策略

aof-rewrite-incremental-fsync yes

所以REDIS 的持久化可以根据REDIS在系统中所承担的作用来设置,如果是只读作为读缓冲,则可以不需要进行持久化的操作,可以将RDB AOF 文件关闭,已达到最好的效果,当然你的程序也需要考虑在 REDIS CRASH 后的数据重新刷入,否则会引起缓存雪崩,导致你的实体数据库 MYSQL ORACLE ,POSTGRESQL SQL SERVER 等数据库无法承受短期的高频的数据读取,而不再有响应。

要不就需要设置 RDB, AOF 文件,在某些应用场景下,防止丢失数据,或者引起缓冲击穿后的雪崩问题。

建议如果没有特殊的要求,需要打开 RDB AOF 持久化,这样REDIS 好, 传统数据库好,你好我好,大家好。

本文分享自微信公众号 - AustinDatabases(AustinDatabases),作者:carol11

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • --MYSQL MGR 崩溃后的修复和问题查找

    MYSQL 的 GROUP REPLICATION 估计大多数的公司都没有用,即使用也不是在主要的项目和关键的地方。所以网上相关MYSQL Group Rep...

    AustinDatabases
  • PostgreSQL 的逻辑复制 与 部分疑问

    PostgreSQL 本身是支持流式复制的,而大部分数据库都支持逻辑复制的方式,流式复制稳定高效,但缺点是不灵活,而逻辑复制的优点就在于此。

    AustinDatabases
  • PostgreSQL WAL LOG 与时间线timeline 与rejoin node 错误

    问题的起因是,在做repmgr 恢复的时候,经常有同学说恢复的时候, repmgr rejion node 的时候pg_rewind 会报错,与时间线有关。(p...

    AustinDatabases
  • redis持久化rdb和aof之间的优势劣势

    概念: 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

    李红
  • redis持久化rdb和aof之间的优势劣势

    概念: 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

    李红
  • 学习笔记]快速开发Hibernate

    樊欢 java及开源项目爱好者。     Email :heydaymail@hotmail.com     Blog :http://heyay.blogon...

    张善友
  • Java反射教程(二)

    Java学习123
  • Mac连上WIFI但是无法上网的3种解决方案

    一般我们最先会认为是DNS问题,你可以试下用ip访问一个服务器(网站)看下行不行,如果也不行那就应该不是DNS的问题了。或者改变一下DNS,如114,或者自己...

    小贝壳
  • Mybatis高级查询(二):多表联合查询

    提供pojo类并提供get/set方法以及重写toString方法,这里以User类为例,除User类以外还应提供数据库表对应的类,如Orders,item等

    用户7649162
  • 神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL !

        一个中国小孩参加国外的脱口秀节目,因为语言不通,于是找了一个翻译。     主持人问:“Who is your favorite singer ?” ...

扫码关注云+社区

领取腾讯云代金券