RDB工作原理:
每隔N分鐘或N次寫的操作後,Redis將數據庫快照保存在名字爲dump.rdb的二進制文件中。壓縮,然後放到備份目錄中。
比如說,一下設置會讓Redis在滿足“60秒內有至少1000個鍵被改動”這一條件時,自己保存數據集:
save 60 1000
這種方法持久化方式被稱爲快照。
RDB相關參數:
save 900 1 #刷新快照到磁盤中,必須滿足2個要求才會觸發,即900秒之後只是有1個關鍵字發生變化
stop-wrties-on-bgsave-error yes #後臺存儲錯誤停止寫
rebcompression yes #使用LZF壓縮rdb文件
rebchecksum yes #存儲和加載rdb文件時校驗
dbfilename dump.rdb #設置rdb文件名
dir ./ #設置工作目錄,rdb文件會寫入該目錄。
RDB的優點:
1.RDB是一個非常緊湊的文件,它保存了Redis在某個時間段的數據集。這種文件非常適合備份,比如說,你可以在最近24小時內,每小時備份一次RDB文件,並且在每個月的每一天,也備份一次RDB文件。這樣的話,即使遇到了問題,也可以還原到不同的版本。
2.RDB在恢復大數據集時比aof恢復速度快
3.RDB可以最大化Redis性能:父進程在保存RDB文件時唯一要做的就是fork出一個子進行,然後這個子進程就會處理接下來所有保存工作,父進程無須操作I/O操作
4.RDB保存的是一個鏡像文件,可以將它直接傳送到別人數據模塊中
RDB的缺點:
如果在2個保存點之後保存數據,可能會丟失1-N分鐘的數據;如果你需要儘量在服務器故障時丟失數據,那麼RDB不適合你。雖然RDB允許你設置不同的保存點來控制保存RDB文件的頻率。但是,因爲RDB文件需要保存的是整個數據集的狀態,所以它並不是一個輕鬆的操作。因爲你可能需要5分鐘才保存一次RDB文件。在這種情況下,可能會丟失好幾分鐘的數據。
AOF工作原理:
也就是使用日誌文件來記錄所有的寫操作命令,並在服務器啓動時,重新啓動這次命令來還原數據集。
AOF相關參數:
appendonly no #是否打開aof日誌功能
appendfsync always #每一個命令都立即寫入到aof,安全,速度慢
appendfsync everysec #每秒寫1次
appendfsync no #寫入功能讓操作系統判斷緩存區大小統一寫入到aof,同步速率慢,速度快
no-appendfasy-on-rewrite yes #正在導入rdb快照過程中,需不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重寫時的大小,增長率100%時,重寫
auto-aof-rewrite-min-size 60mb #aof文件超過60M時才進行重寫
注:在dump.rdb過程中 ,aof如果停止同步,會不會丟失?
答:不會,所有的操作緩存在內存的隊列裏,dump完成後,統一操作
注:aof重寫是指什麼?
答:aof重寫是指把內存中命令,逆話命令,寫入到aof日誌裏。
問:如果rdb文件與aof文件同時存在,優先用誰來恢復數據?
答:aof
問:恢復時rdb與aof哪個恢復的快?
答:rdb,因爲其是數據的內存映射,直接載入到內存。而aof是命令,需要逐條執行
AOF的重寫的執行步驟:
1.Redis執行fork(),現在同時擁有父進程和子進程
2.子進程開始將新AOF文件的內容寫入到臨時文件
3.對於所有新執行的寫入命令,父進程一邊將它們累計到一個內存緩存中,一邊將這些改動追加到現有AOF文件的末尾;這樣即使在重寫的過程中發生停機,現有的aof文件也是安全的
AOF的優點
1.aof默認的策略是每秒鐘執行一次,在這種配置下,Redis仍然可以保持良好的性能,並且就算髮生了故障,也是丟失一秒鐘的數據
2.Redis可以在AOF文件過大的情況自動進行重寫:重寫後的新aof文件包含了恢復當前數據集所需的最小命令集合,因爲Redis在創建新的aof文件時,會繼續將命令追加到現有的aof文件裏面,即使重寫過程發生了停機,而aof文件而不會丟失。而一旦新aof文件創建完畢,Redis就會從舊的aof文件中切換到新的aof文件,並開始對新的aof文件進行追加操作。
AOF的缺點
1對於相同數據集的文件,aof文件的體積通常比rdb文件大
2.根據fasy策略,aof的速度比rdb慢
3.aof在國慶曾經發生了這樣的問題,因爲個別命令的原因,導入aof文件重新載入時,無法將數據集恢復到保存時的原樣。
4.當子線程完成重寫工作時,它給父進程發送一個信號,父進程在接收信號之後,將內存中所有數據追加到新aof文件的末尾。
備份Redis數據
磁盤故障,節點失效,衆多的問題都可能讓你的數據消失不見,不進行備份是非常危險的
Redis對於數據備份是非常友好的。比如它可以在服務器運行的時候對數據進行備份的:RDB文件一旦創建之後,就不會進行任何修改。當服務器創建了一個新的RDB文件時,它先將文件的內容保存在一個臨時的文件裏,當臨時文件寫完之後,纔會用臨時文件去替換原來的RDB文件