记一次生产环境redis故障处理--无法持久化到磁盘

概述

记一次生产环境故障,运行Redis时发生错误,无法持久化到磁盘以及解决的过程,记录如下:


01

问题报错

记一次生产环境redis故障处理--无法持久化到磁盘

ERR Error running script (call to f_286dd696309f4ab2005d9df55e2410a1170fe3b3): @user_script:1: @user_script: 1: -MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error. . channel: [id: 0xc3478197, L:/127.0.0.1:49527 - R:/127.0.0.1:6379] command: CommandData [promise=org.redisson.misc.RedissonPromise@ad2aa3[Not completed], command=(EVAL), params=[local value = redis.call('hget', KEYS[1], ARGV[2]); if value == false then return nil; end; local t,..., 3, t01:EVENT, redisson__timeout__set:{t01:EVENT}, redisson__idle__set:{t01:EVENT}, 1558606013597, [-84, -19, 0, 5, 116, 0, 13, 83, 69, 76, ...]], codec=org.redisson.codec.SerializationCodec@15b63ff]

02

思路

Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。

这里是因为强制关闭Redis快照导致不能持久化。


03

解决方案

运行config set stop-writes-on-bgsave-error no命令后,关闭配置项stop-writes-on-bgsave-error解决该问题。

$ ./redis-cli
127.0.0.1:6379> config set stop-writes-on-bgsave-error no

记一次生产环境redis故障处理--无法持久化到磁盘


04

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

一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 应该同时使用两种持久化功能。如果非常关心数据, 但仍然可以承受数分钟以内的数据丢失, 那么可以只使用 RDB 持久化。有很多用户都只使用 AOF 持久化, 但并不推荐这种方式, 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免AOF 程序的 一些bug 。

1、快照

在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中。我们也可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。也可以通过调用 SAVE或者 BGSAVE , 手动让 Redis 进行数据集保存操作。

记一次生产环境redis故障处理--无法持久化到磁盘

比如以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:

save 60 1000

这种持久化方式被称为快照 snapshotting.

2、工作方式

当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:

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

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

3、只追加操作的文件(Append-only file,AOF)

快照功能并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。

可以在配置文件中打开AOF方式:

appendonly yes

从现在开始, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件的末尾。这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。


后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下!

记一次生产环境redis故障处理--无法持久化到磁盘

相关推荐