Redis線上救命丸:01---誤操作AOF、RDB恢復數據

  • Redis的flushall/flushdb命令可以做數據清除,對于Redis的開發和運維人員有一定幫助,然而一旦誤操作,它的破壞性也是很明顯的。怎么才能快速恢復數據,讓損失達到最小呢?本文我們將結合之前學習的Redis相關知識進行分析,最后給出一個合理的方案

  • 注意:為了方便說明,下文中除了AOF文件中的flushall/flushdb以外,其他所有的flushall/flushdb都用flush代替

  • 本文假設進行flush操作的Redis是一對主從結構的主節點,其中鍵值對的個數是100萬,每秒寫入量是1000

一、緩存與存儲

  • 被誤操作flush后,根據當前Redis是緩存還是存儲使用策略有所不同:

    • 緩存:對于業務數據的正確性可能造成損失還小一點,因為緩存中的數據可以從數據源重新進行構建,但是在前面文章介紹了緩存雪崩和緩存穿透的相關知識,當前場景也有類似的地方,如果業務方并發量很大,可能會對 后端數據源造成一定的負載壓力,這個問題也是不容忽視

    • 存儲:對業務方可能會造成巨大的影響,也許flush操作后的數據是重要配置,也可能是一些基礎數據,也可能是業務上的重要一環,如果沒有提 前做業務降級操作,那么最終反饋到用戶的應用可能就是報錯或者空白頁面 等,其后果不堪設想。即使做了相應的降級或者容錯處理,對于用戶體驗也有一定的影響

  • 所以Redis無論作為緩存還是作為存儲,如何能在flush操作后快速恢復數據才是至關重要的。持久化文件肯定是恢復數據的媒介,下面將對AOF和RDB文件進行分析

二、借助AOF機制恢復

  • 關于AOF語法可以參閱:之前我發表的Redis使用篇里關于AOF的介紹

  • Redis執行了flush操作后,AOF持久化文件會受到什么影響呢?如下所示:

    • appendonly no:對AOF持久化沒有任何影響,因為根本就不存在AOF文 件

    • appendonly yes:只不過是在AOF文件中追加了一條記錄,例如下面就是AOF文件中的flush操作記錄:

*1
$8
flushall
  • 雖然Redis中的數據被清除掉了,但是AOF文件還保存著flush操作之前完整的數據,這對恢復數據是很有幫助的。注意問題如下:

    • 調大AOF重寫參數auto-aof-rewrite-percentage和auto-aof-rewrite-minsize,讓Redis不能產生AOF自動重寫

    • 拒絕手動bgrewriteaof

    • 1)如果發生了AOF重寫,Redis遍歷所有數據庫重新生成AOF文件,并會覆蓋之前的AOF文件。所以如果AOF重寫發生了,也就意味著之前的數據就丟掉了,那么利用AOF文件來恢復的辦法就失效了。所以當誤操作后,需要考慮如下兩件事:

    • 2)如果要用AOF文件進行數據恢復,那么必須要將AOF文件中的flushall相關操作去掉,為了更加安全,可以在去掉之后使用redis-check-aof這個工具去檢驗和修復一下AOF文件,確保AOF文件格式正確,保證數據恢復正常

三、RDB有什么變化?

  • Redis執行了flushall操作后,RDB持久化文件會受到什么影響呢?

  • 1)如果沒有開啟RDB的自動策略:那么除非手動執行過save、bgsave或者發生了主從的全量復制,否則RDB文件也會保存flush操作之前的數據,可以作為恢復數據的數據源。注意問題如下:

    • RDB文件中的數據可能沒有AOF實時性高,也就是說,RDB文件很可能很久以前主從全量復制生成的,或者之前用save、bgsave備份的

    • 防止手動執行save、bgsave,如果此時執行save、bgsave,新的RDB文件就不會包含flush操作之前的數據,被老的RDB文件進行覆蓋

  • 2)如果開啟了RDB的自動策略:由于flush涉及鍵值數量較多,RDB文件會被清除,意味著使用RDB恢復基本無望

  • 綜上所述,如果AOF已經開啟了,那么用AOF來恢復是比較合理的方式,但是如果AOF關閉了,那么RDB雖然數據不是很實時,但是也能恢復部分數據,完全取決于RDB是什么時候備份的。當然RDB并不是一無是處,它 的恢復速度要比AOF快很多,但是總體來說對于flush操作之后不是最好的恢復數據源

四、從節點有什么變化

  • Redis從節點同步了主節點的flush命令,所以從節點的數據也是被清除了,從節點的RDB和AOF的變化與主節點沒有任何區別

五、快速恢復數據

  • 下面使用AOF作為數據源進行恢復演練

  • 1)防止AOF重寫。快速修改Redis主從的auto-aof-rewrite-percentage和 auto-aof-rewrite-min-size變為一個很大的值,從而防止了AOF重寫的發生, 例如:

config set auto-aof-rewrite-percentage 1000
config set auto-aof-rewrite-min-size 100000000000
  • 2)去掉主從AOF文件中的flush相關內容:

*1
$8
flushall
  • 3)重啟Redis主節點服務器,恢復數據

六、總結

  • 本文通過flush誤操作的數據恢復,重新梳理了持久化、復制的相關知識,這里建議運維人員提前準備shell腳本或者其他自動化的方式處理,因為故障不等人,對于flush這樣的危險操作,應該通過有效的方式進行規避,下節將介紹具體的方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444427.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Log4j使用總結

一、介紹Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務 器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日志的輸出格式;通過定…

C語言: GDB調試技術(一)

啟動GDB的方法有以下幾種: 1、gdb <program> program也就是你的執行文件,一般在當然目錄下。’ 例如我寫了一個簡單的helloword程序 #include <stdio.h> int main(){int a = 1;char* ch = "hello world";printf("%s\n",ch);return 0; }那么我…

C語言: ---windows下VS Debug調試

首先我先列出來常用的一些命令或者鍵盤控制: F5 開始調試,執行到斷點 Shift + F5 停止調試 F9 在光標所在行添加斷點 Shift + F9 QuickWatch Shift Ctrl F9 delete all 斷點 F10 單步執行 F11 進入調用的函數 Shift F11 跳出這次調用的函數 另外還可以用Disable all breakpoi…

leetcode350. 兩個數組的交集 II

給定兩個數組&#xff0c;編寫一個函數來計算它們的交集。 示例 1: 輸入: nums1 [1,2,2,1], nums2 [2,2] 輸出: [2,2] 示例 2: 輸入: nums1 [4,9,5], nums2 [9,4,9,8,4] 輸出: [4,9] 說明&#xff1a; 輸出結果中每個元素出現的次數&#xff0c;應與元素在兩個數組中出…

C語言: ---Linux下ulimit是什么鬼

其實ulimit的講解不屬于C或者C++ 語言范疇,他只是在我們日常開發或者線上linux運行環境不可缺少的工具。 比如我們要查看服務器崩潰的core文件,允許core文件產生,都需要ulimit -c命令調整。 比如我們設置的當前運行環境的棧空間過小,容易產生棧溢出,那么我們…

C語言: ---gdb查看內存和寄存器內容

gdb沒有CodeWarrior強大,但是也提供了查看寄存器的命令:(gdb) info register r1r1 0xbffffb40 3221224256(gdb) info registersr0 0x1000052c 268436780r1 0xbffffb40 3221224256r2 0x48026ea0 1208118944r3 …

leetcode52. N皇后 II 最強解法直接秒殺100%

n 皇后問題研究的是如何將 n 個皇后放置在 nn 的棋盤上&#xff0c;并且使皇后彼此之間不能相互攻擊。 上圖為 8 皇后問題的一種解法。 給定一個整數 n&#xff0c;返回 n 皇后不同的解決方案的數量。 示例: 輸入: 4 輸出: 2 解釋: 4 皇后問題存在如下兩個不同的解法。 [ […

C語言:---gdb多線程調試

1)恢復程序運行和單步調試 當程序被停住了,你可以用continue命令恢復程序的運行直到程序結束,或下一個斷點到來。也可以使用step或next命令單步跟蹤程序。 continue [ignore-count] c [ignore-count] fg [ignore-count] 恢復程序運行,直到程序結束,或是下一個斷點到來。ig…

leetcode145. 二叉樹的后序遍歷 意想不到的騷操作

給定一個二叉樹&#xff0c;返回它的 后序 遍歷。 示例: 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [3,2,1] 進階: 遞歸算法很簡單&#xff0c;你可以通過迭代算法完成嗎&#xff1f; 思路&#xff1a;前序遍歷左右交換&#xff0c;然后倒序輸出 原因&am…

C++:29 --- C++繼承關系下的內存布局(下)

1 單繼承 C++ 提供繼承的目的是在不同的類型之間提取共性。比如,科學家對物種進行分類,從而有種、屬、綱等說法。有了這種層次結構,我們才可能將某些具備特定性質的東西歸入到最合適的分類層次上,如“懷孩子的是哺乳動物”。由于這些屬性可以被子類繼承,所以,我們只要知道…

C++:30 ---C++類成員,成員函數的內存布局

前面兩篇文章我相信大家反復讀了之后對這節不陌生了: 首先來看代碼: class Demo { public://靜態成員變量static const int sx = 0;//靜態函數static void SF1() {} public://成員變量int x; public://成員函數void F1() {cout << "Im from Demo::F1()" <…

leetcode119. 楊輝三角 II 你能比我代碼更短嗎?

給定一個非負索引 k&#xff0c;其中 k ≤ 33&#xff0c;返回楊輝三角的第 k 行。 示例: 輸入: 3 輸出: [1,3,3,1]按照定義寫即可。 class Solution:def getRow(self, rowIndex: int) -> List[int]:l[1]for i in range(rowIndex):l[1][l[j]l[j1] for j in range(len(l)-1…

C++:28 --- C++內存布局(上)

了解你所使用的編程語言究竟是如何實現的,對于C++程序員可能特別有意義。 首先,我們順次考察C兼容的結構(struct)的布局,單繼承,多重繼承,以及虛繼承;接著,我們講成員變量和成員函數的訪問,當然,這里面包含虛函數的情況;再接下來,我們考察構造函數,析構函數,以…

leetcode114. 二叉樹展開為鏈表

給定一個二叉樹&#xff0c;原地將它展開為鏈表。 例如&#xff0c;給定二叉樹 1 / \ 2 5 / \ \ 3 4 6 將其展開為&#xff1a; 1 \ 2 \ 3 \ 4 \ 5 \ 6 思路&#xff1a;所有左子樹的最右節點接上右子…

C++:26---動態內存管理new、delete

實在不好意思,到這里才給大家分享new和delete。 對于非內部數據類型的對象而言,光用malloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。 由于malloc/free是庫函數而不是運算符,不在編譯器控制權限…

使用Log4j為項目配置日志輸出應用詳細總結及示例演示.

Log4j組件構成 Log4j由三個重要的組件構成&#xff1a; 1.日志信息的優先級(Logger) 2.日志信息的輸出目的地(Appender) 3.日志信息的輸出格式(Layout)。 概要: 日志信息的優先級從高到低有ERROR、WARN、INFO、DEBUG&#xff0c;分別用來指定這條日志信息的重要程度&…

C++:27---new delete malloc free

上一節我講了new和delete,有人問這不是和C語言的malloc/free為C的標準庫函數差不多么 void* malloc(size_t size)//參數代表字節個數 void free(void* pointer)//參數代表內存地址new、delete則為C++的操作運算符,它調用的分別為賦值運算符重載operator new()和operator del…

C++:33---類成員指針

成員指針概述: 當初始化一個這樣的指針時,我們令其指向類的某個成員,但是不指定該成員所屬的對象直到使用成員指針時,才提供成員所屬的對象成員指針是指可以指向類的非靜態成員的指針一般情況下,指針指向一個對象,但是成員指針指向的是類的成員,而不是類的所創建出的對象…

C++:31---對象引用和賦值

一、對象移動概述 C++11標準引入了“對象移動”的概念對象移動的特性是:可以移動而非拷貝對象在C++舊標準中,沒有直接的方法移動對象。因此會有很多不必要的資源拷貝標準庫容器、string、share_ptr類既支持移動也支持拷貝。IO類和unique_ptr類可以移動但不能拷貝對象移動的特…

C++:34---union:聯合/共用體,一種節省空間的類

一、聯合(union)概述 聯合(union)是一種特殊的類一個union可以有多個數據成員,但是在任意時刻只有一個數據成員可以有值。當我們給union的某個成員賦值之后,該union的其它成員就變成未定義的狀態了。分配給一個union對象的存儲空間至少要能容納它的最大的數據成員類的某些…