Redis的快照


博客鏈接:http://www.cnblogs.com/zhenghongxin/p/8669913.html

redis 本地持久化到硬盤有兩種方式,一是快照(snapshotting),二是只追加文件(append-only file AOF)

快照

快照,顧名思義可以理解為拍照一樣,把整個內存數據映射到硬盤中,保存一份到硬盤,因此恢復數據起來比較快,把數據映射回去即可,不像AOF,一條條的執行操作命令。產生快照的過程:

1 執行bgsave命令(此時redis會fork一個子進程,子進程負責生成硬盤文件,父進程負責繼續接受命令)

2 或執行save命令(和bgsave命令不同,發送save命令后,到系統創建快照完成之前系統不會再接收新的命令,換句話說save命令會阻塞后面的命令,而bgsave不會)

3 用戶在配置文件了配置了類似這樣的命令
    save 900 1 // 900內,有1條寫入,則產生快照

   save 300 1000 // 如果300秒內有1000次寫入,則產生快照

   save 60 10000 // 如果60秒內有10000次寫入,則產生快照

   (這3個選項都屏蔽,則rdb禁用)

4 用戶發送shutdown,系統會先導員save命令阻塞客戶端,然后關閉服務器
5 當有主從架構時,從服務器向主服務器發送sync命令來執行復制操作時,只有主服務器當時沒有進行bgsave操作,那么主服務器就會執行bgsave操作。

我們可以在redis目錄下查看redis.conf配置,其中某些重要配置:

stop-writes-on-bgsave-error yes // 后台備份進程出錯時,主進程停不停止寫入?

rdbcompression yes // 導出的rdb文件是否壓縮

Rdbchecksum yes // 導入rbd恢復時數據時,要不要檢驗rdb的完整性

dbfilename dump.rdb //導出來的rdb文件名

dir ./ //rdb的放置路徑

快照的優勢

1) 通過合理的配置,可以讓Redis每隔一段時間就保存一次數據庫副本,也可以很方便地將數據還原到特定的時間點。

2)RDB文件相比AOF占用的空間更小,恢復數據的速度也更快。

3)如果創建RDB文件時出現了錯誤,Redis不會將它用於替換原來的文件,所以出錯時不會影響到之前保存的版本。

快照的缺點

1) 如果硬件、系統、Redis三者其中之一出現問題而崩潰,Redis會丟失全部數據,保留下來的數據只有上一個時間點創建的快照。如果數據對於應用程序來說非常重要,那么出現錯誤時的損失會非常大。

2)fork子進程占用的內存隨着數據庫中數據的增加而增加,耗費的時間也會越來越多

一些問答:

: 在dump rdb過程中,aof如果停止同步,會不會丟失?

答: 不會,所有的操作緩存在內存的隊列里, dump完成后,統一操作.

: aof重寫是指什么?

答: aof重寫是指把內存中的數據,逆化成命令,寫入到.aof日志里.以解決 aof日志過大的問題.

問: 如果rdb文件,和aof文件都存在,優先用誰來恢復數據?

答: aof

問: 2種是否可以同時用?

答: 可以,而且推薦這么做

一般來說,如果想達到足以媲美 PostgreSQL 的數據安全性, 你應該同時使用兩種持久化功能。如果你非常關心你的數據,但仍然可以承受數分鍾以內的數據丟失, 那么你可以只使用 RDB 持久化。有很多用戶都只使用 AOF 持久化, 但我們並不推薦這種方式: 因為定時生成 RDB 快照(snapshot)非常便於進行數據庫備份, 並且 RDB 恢復數據集的速度也要比 AOF 恢復的速度要快, 除此之外, 使用 RDB 還可以避免之前提到的 AOF 程序的 bug 。因為以上提到的種種原因, 未來我們可能會將 AOF 和 RDB 整合成單個持久化模型。 (這是一個長期計划。)

問: 恢復時rdb和aof哪個恢復的快

答: rdb快,因為其是數據的內存映射,直接載入到內存,而aof是命令,需要逐條執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM