詳解Redis強制關閉Redis快照導致不能持久化錯誤的解決辦法

Redis 數據庫 PostgreSQL 波波說運維 2019-05-29

概述

記一次生產環境故障,運行Redis時發生錯誤,無法持久化到磁盤以及解決的過程,記錄如下:


01

問題報錯

詳解Redis強制關閉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強制關閉Redis快照導致不能持久化錯誤的解決辦法


04

如何選擇使用哪種持久化方式?

一般來說, 如果想達到足以媲美 PostgreSQL 的數據安全性, 應該同時使用兩種持久化功能。如果非常關心數據, 但仍然可以承受數分鐘以內的數據丟失, 那麼可以只使用 RDB 持久化。有很多用戶都只使用 AOF 持久化, 但並不推薦這種方式, 因為定時生成 RDB 快照(snapshot)非常便於進行數據庫備份, 並且 RDB 恢復數據集的速度也要比 AOF 恢復的速度要快, 除此之外, 使用 RDB 還可以避免AOF 程序的 一些bug 。

1、快照

在默認情況下, Redis 將數據庫快照保存在名字為 dump.rdb的二進制文件中。我們也可以對 Redis 進行設置, 讓它在“ N 秒內數據集至少有 M 個改動”這一條件被滿足時, 自動保存一次數據集。也可以通過調用 SAVE或者 BGSAVE , 手動讓 Redis 進行數據集保存操作。

詳解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強制關閉Redis快照導致不能持久化錯誤的解決辦法

相關推薦

推薦中...