精品推荐

  • 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布!

  • Docker快速手上视频教程(无废话版)【免费】

作者:xlecho

转载自:

https://www.cnblogs.com/xlecho/p/11834011.html

Redis持久化的方案其实是很多人接触的比较少的,因为相对应的数据故障不会很多,一次初始化的设置就能保证后续故障的全部顺利解决。本文讲述一下该机制的主要设置方法和持久化方案的对比,同时也会讲述一些持久化的原理。如果对于Redis持久化比较熟悉的希望能够给到你帮助,如果不熟悉的,你大可参考本文对你的Redis进行设置。

什么是Redis的持久化?

可能很多人很少接触这个词,总觉的我们Redis的所有数据都是全部能够永久存储的。然而你可能不知道的是,Redis的数据都是在内存当中的,如果没有持久化策略,你关闭Redis或者之后,你的数据有可能全部都丢失了。我们每再一次登录Redis访问上一次数据的时候,我们都看到了原来的数据,就是得益于Redis的持久化。Redis的持久化简单说就是,将Redis存在内存中的值存储到可以永久存储的地方(磁盘等)

Redis的持久化方案

  • RDB Redis DataBase

  • AOF Append Only File

RDB [Redis DataBase]

RDB 是 Redis 默认的持久化方案。当满足一定条件的时候,会把当前内存中的数据写入磁盘,生成一个快照文件 dump.rdb。Redis 重启会通过加载 dump.rdb 文件恢复数据。dump.rdb是我们redis文件当中的一个,位置如下图:

RDB是怎么实现持久化的

RDB是按照规则来触发持久化存储的,在我们的redis.conf中我们可以看到如下的几个配置:

save 900 1 # 900 秒内至少有一个 key 被修改(包括添加)save 300 10 # 300 秒内至少有 10 个 key 被修改save 60 10000 # 60 秒内至少有 10000 个 key 被修改

这几个配置是不冲突的,只要满足任意一个都会触发。

  • RDB方式的优点

    • RDB 是一个紧凑的单一文件,很方便传送到另一个远端数据中心,非常适用于灾难恢复。

    • 与AOF相比,在恢复大的数据集的时候,RDB 方式会更快一些。

  • RDB方式的缺点

    • RDB 方式数据没办法做到实时持久化/秒级持久化。因为 bgsave 每次运行都要执行 fork 操作创建子进程,频繁执行成本过高。

    • 在一定间隔时间做一次备份,所以如果 redis 意外 down 掉的话,就会丢失最后一次快照之后的所有修改(数据有丢失)。如果数据相对来说比较重要,希望将损失降到最小,则可以使用 AOF 方式进行持久化。

RDB持久化的演示

如果我们都按照正常程序走的话,我们是很难看到没有持久化,或者出现持久化问题的故障现场的。所以我们要学会持久化操作,或者只管看到持久化就需要手动触发持久化问题。这里主要演示两种情况,一种是数据正常备份,一种是数据丢失,我们恢复备份数据。

注意

这两个操作都算是危险操作,我们需要在操作之前进行一下设置一下Redis快照,Redis提供了两条命令:

  • save: 在生成快照的时候会阻塞当前 Redis 服务器, Redis 不能处理其他命令。如果内存中的数据比较多,会造成Redis长时间的阻塞。生产环境不建议使用这个命令。为了解决这个问题,Redis 提供了第二种方式。

  • bgsave:执行 bgsave 时,Redis 会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是 Redis 进程执行fork操作创建子进程(copy-on-write),RDB持久化过程由子进程负责,完成后自动结束。它不会记录fork之后后续的命令。阻塞只发生在fork阶段,一般时间很短。用 lastsave 命令可以查看最近一次成功生成快照的时间。

使用shutdown 持久化

我们先在Redis库中设置如下几个值

set k1 1set k2 2set k3 3set k4 4set k5 5

# 操作完成上面的步骤之后我们停止服务器,触发RDB的自动保存saveshutdown

# 然后再次启动Redis服务redis-server redis.conf

# 启动完成,查看我们那些刚刚保存的数据是否被持久化了keys *

执行完上面的步骤之后,我们可以看到我们的数据都在,就说明我们的触发备份是成功的。

使用flushall模拟数据丢失

该操作有一定的风险性,如果是演示练习按照操作来基本不会出现问题,但是生产上慎重操作。我们做该操作之前,一定要注意先备份RDB对应的持久化问题dump.rdb

# 先备份dump.rdbcp dump.rdb dump.rdb.bak

# 备份完成之后我们确定备份成功在进行下一步操作---清空库flushall

# 清空之后我们停止服务器shutdown

# 再次启动服务器,查看之前存储的kyekeys *

再次启动查看的时候,我们发现我们的数据丢失了

恢复丢失的数据

# 停服务器shutdown

# 删除我们现有dump.rdbrm -rf ./dump.rdb

# 删除成功之后,将我们的备份的dump.rdb.bak重新命名成为dump.rdbmv dump.rdb.bak dump.rdb

# 确定之后我们再次启动redis服务redis-server redis.conf

# 检查我们之前丢失的数据是否存在keys *

完成之后我们查看的数据就出现啦!

AOF [Append Only File]

AOF:Redis 默认不开启。AOF采用日志的形式来记录每个写操作,并追加到文件中。开启后,执行更改 Redis 数据的命令时,就会把命令写入到AOF文件中。Redis重启时会根据日志文件的内容把写指令从前到后执行一次以完成数据的恢复工作。

该方式默认关闭,需要使用我们需要修改如下配置

# 开关 Redis 默认只开启 RDB 持久化,开启 AOF 需要修改为 yesappendonly no# 文件名 路径也是通过 dir 参数配置 config get dirappendfilename "appendonly.aof"

数据都是实时持久化到磁盘吗?

由于操作系统的缓存机制,AOF数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。什么时候把缓冲区的内容写入到 AOF 文件?

AOF的保存规则有三种

AOF 持久化策略(硬盘缓存到磁盘),默认 everysec

  • no 表示不执行 fsync,由操作系统保证数据同步到磁盘,速度最快,但是不太安全;

  • always 表示每次写入都执行 fsync,以保证数据同步到磁盘,效率很低;

  • everysec 表示每秒执行一次 fsync,可能会导致丢失这 1s 数据。通常选择 everysec ,兼顾安全性和效率。

文件越来越大,怎么办?

由于 AOF 持久化是 Redis 不断将写命令记录到 AOF 文件中,随着 Redis 不断的进行,AOF 的文件会越来越大,文件越大,占用服务器内存越大以及 AOF恢复要求时间越长。可以使用命令 bgrewriteaof来重写。AOF文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的 AOF 文件。

AOF指定大小开始重写

  • auto-aof-rewrite-percentage:默认值为100。aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。

  • auto-aof-rewrite-min-size:默认64M。设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写。

  • AOF方式的优点

    • AOF 持久化的方法提供了多种的同步频率,即使使用默认的同步频率每秒同步一次,Redis最多也就丢失 1 秒的数据而已。

  • AOF方式的缺点

    • 对于具有相同数据的的Redis,AOF文件通常会比RDF文件体积更大(RDB存的是数据快照)。

    • 虽然 AOF 提供了多种同步的频率,默认情况下,每秒同步一次的频率也具有较高的性能。在高并发的情况下,RDB 比 AOF 具好更好的性能保证。

两种方案比较

那么对于AOF和RDB两种持久化方式,我们应该如何选择呢?如果可以忍受一小段时间内数据的丢失,毫无疑问使用 RDB 是最好的,定时生成RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快。否则就使用AOF重写。但是一般情况下建议不要单独使用某一种持久化机制,而是应该两种一起用,在这种情况下,当 redis 重启的时候会优先载入 AOF文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整。

redis数据丢失_Redis持久化Redis宕机或者出现意外删库导致数据丢失解决方案相关推荐

  1. Redis 日志篇:无畏宕机实现高可用的杀手锏

    " 特立独行是对的,融入圈子也是对的,重点是要想清楚自己向往怎样的生活,为此愿意付出怎样的代价. " 我们通常将 Redis 作为缓存使用,提高读取响应性能,一旦 Redis 宕机 ...

  2. Redis 日志篇:无畏宕机快速恢复的杀手锏

    " 特立独行是对的,融入圈子也是对的,重点是要想清楚自己向往怎样的生活,为此愿意付出怎样的代价. " 我们通常将 Redis 作为缓存使用,提高读取响应性能,一旦 Redis 宕机 ...

  3. Redis的KEYS命令引起宕机事件

    摘要: 使用 Redis 的开发者必看,吸取教训啊! 原文:Redis 的 KEYS 命令引起 RDS 数据库雪崩,RDS 发生两次宕机,造成几百万的资金损失 作者:陈浩翔 Fundebug经授权转载 ...

  4. python redis连接_Redis学习---Redis操作之Python连接

    PyCharm下的Redis连接 连接方式: 1. 操作模式 redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使 ...

  5. goldengate源端意外宕机,传输进程终止,导致OGG-01031报错

    服务器宕机,没有停止dpump进程,启动后处于abend状态,检查ggserr.log报以下错误: 2011-04-01 11:13:19 ERROR OGG-01031 Oracle GoldenG ...

  6. linux 改路由表 宕机,网管宕机,服务停止?别担心,解决方案来了

    本文以LVS + keepalived 实现基于keepalived的LVS的高可用 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项 ...

  7. redis主从结构,主库宕机

    前提:现在有主从结构,主库没有配置持久化,从库配置AOF.(主库用来备份和写服务,从库用来提供读服务) 非常危险的动作:重新启动主库. 要知道这样一来,最坏情况数据将全部丢失.因为主库没有配置持久化, ...

  8. Redis 无畏宕机快速恢复的杀手锏

    " 特立独行是对的,融入圈子也是对的,重点是要想清楚自己向往怎样的生活,为此愿意付出怎样的代价. " 我们通常将 Redis 作为缓存使用,提高读取响应性能,一旦 Redis 宕机 ...

  9. redis分片_Redis的持久化操作

    走过路过不要错过 点击蓝字关注我们 1.Redis持久化策略 1.1 什么是持久化 说明:Redis运行环境在内存中,如果redis服务器关闭,则内存数据将会丢失. 需求: 如何保存内存数据呢? 解决 ...

最新文章

  1. 单片机开发项目全局变量太多怎么管理?
  2. 让AI计算无处不在,华为干了一件大事
  3. 据说这是中途接手别人项目时的场景
  4. Java File类基本操作
  5. 【Flask】url_for函数
  6. BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
  7. HDU 4339 Query
  8. java分隔符算法_《Java数据结构和算法》栈 分隔符分配
  9. python常用模块一览表_python 常用模块
  10. Xamarin 打包生成 Android apk 文件
  11. java替换的程序_Java文本文件批量替换小程序的方法
  12. 《6色荧光笔学习法》——从如何做笔记到高效学习和“战略性思考”
  13. matlab命令查找图片,Matlab 显示图片和SubPlot命令
  14. math: 雅可比矩阵 黑塞矩阵
  15. 平淡人生(一)- 360发展历程及人物杂记
  16. 数据挖掘十大经典算法(详解)
  17. 机器学习中的编码器-解码器结构哲学
  18. 简单了解latex输出矩阵
  19. 虚拟机内连接MotionPro一直处于正在连接状态
  20. Python安装包(3.6和3.8)及Pycharm安装及汉化包

热门文章

  1. day08.4-samba共享网盘服务
  2. hibernate11--Criteria查询
  3. SLG手游Java服务器的设计与开发——架构分析
  4. Andirod——网络连接(HttpURLConnection)
  5. 三极晶体管放大电路实验
  6. Docker容器的数据卷备份与恢复
  7. Ubutnu中ln创建软连接失败
  8. Linux系统中,各种小动物
  9. Linux 中 的 vi 编辑模式 直接对文件进行修改~
  10. 小解系列-解决WebUploader在谷歌浏览器下弹出框打开慢,在Bootstrap模态框内部多次点击才能触发的问题