Redis宕机或者出现意外删库导致数据丢失--解决方案

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文件当中的一个 , 位置如下图:
Redis宕机或者出现意外删库导致数据丢失--解决方案

文章插图
 
RDB是怎么实现持久化的RDB是按照规则来触发持久化存储的 , 在我们的redis.conf中我们可以看到如下的几个配置:
save 900 1 # 900 秒内至少有一个 key 被修改(包括添加)save 300 10 # 300 秒内至少有 10 个 key 被修改save 60 10000 # 60 秒内至少有 10000 个 key 被修改
Redis宕机或者出现意外删库导致数据丢失--解决方案

文章插图
 
这几个配置是不冲突的 , 只要满足任意一个都会触发 。
  • 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 *
执行完上面的步骤之后 , 我们可以看到我们的数据都在 , 就说明我们的触发备份是成功的 。


推荐阅读