Redis(五)持久化
Redis持久化
Redis持久化指的是將redis中的資料寫入硬碟的過程。
1 RDB
簡介
在指定的時間間隔內,將記憶體中的資料集快照寫入磁碟,也就是snapshot,它恢復的時候是將快照檔案直接讀到記憶體。
怎麼樣進行的持久化?
RDB持久化採用了Linux常用的寫時複製技術
:
Redis會單獨建立(fork)一個子程序來進行持久化,會先將資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個持久化檔案替換上次持久化好的檔案dump.rdb,整個過程中主程序是不進行任何IO操作的,這樣一方面保證了主程序的效能不受影響,第二點是處於安全性考慮,防止持久化過程出現宕機導致資料不完整。
如果需要大規模的資料恢復,而且對於資料的完整性不是特別敏感,那麼RDB方式比AOF方式更加高效。
RDB唯一的缺點是最後一次持久化的資料可能會丟失。原因是父程序結束子程序也會被撤銷。
RDB配置
stop-writes-on-bgsave-error
yes:當Redis無法寫入硬碟時,直接關閉Redis的寫操作
rdbchecksum 完整性檢查
yes:儲存快照時,讓redis使用CRC64演算法來校驗
save 在指定時間內發生了指定的次數就會執行持久化操作
EDB的備份與恢復
將臨時檔案(路徑由redis.conf指定,預設在啟動路徑下生成)替換dump.rdb然後啟動redis即可。
2 AOF (Append Only File)
2.1 簡介
以日誌的形式來記錄每個寫操作(增量儲存),將Redis執行過的所有寫命令
如果同時開啟AOF和RDB,系統會預設獲取AOF的資料(資料不會存在丟失)
2.2 AOF配置
append only 是否開啟aof
appendfilename 生成的aof檔名
appendfsync 設定AOF同步頻率
-
always:始終同步,每次redis都會立刻寫入日誌,效能較差但資料完整性比較好
-
everysec:每秒同步一次,如果宕機則本秒資料可能會丟失
-
no:redis不主動進行同步,而是交給作業系統
2.3 redis修復
redis-check-aof -fix
aof檔案受損會導致redis啟動失敗,這時候可以使用該命令進行檔案修復
2.4 Rewrite壓縮
AOF採取檔案追加的方式,檔案會越來越大,為了避免此種情況,新增了重寫機制
觸發機制:當AOF檔案的大小設定超過了給定的閾值,Redis就會啟動檔案的內容壓縮,只保留可以恢復資料的最小指令集,可以使用命令bgrewriteaof
redis會記錄上次aof檔案的大小,預設是變為了上次檔案大小的兩倍並且大於64MB才會觸發重寫
auto-aof-rewrite-percentage : 設定重寫的基準值,預設為100%,即檔案達到原來的兩倍的時候才進行重寫
auto-aof-rewrite-min-size:設定重寫的基準值,預設為64MB
例如檔案70MB開始重寫,然後降到50,下次會從100MB開始重寫
重寫雖然可以節省大量的磁碟空間,減少回覆時間,但是還是有一定負擔的
重寫的原理:會fork一個子程序來將檔案重寫(也是先寫臨時檔案再rename),redis4.0版本後的重寫,就是把rdb的快照,以二進位制的形式附在aof的頭部,作為已有的歷史資料,替換掉原來的流水賬操作。