1、概述
redis支持兩種持久化方式,rdb和aof。rdb是數據庫某一時刻的快照,aof是Append Only File,aof通過寫命令記錄數據庫的狀態。目前我們線上沒開rdb,主從redis都開啟了aof everysec。
2、RDB
有兩個命令可以生成RDB文件,一個是save,另一個是bgsave。
save命令會阻塞redis進程,直到生成rdb文件,阻塞期間不能處理任何命令,一般線上很少使用。
bgsave命令的保存工作是由子進程執行的,子進程生成rdb文件的過程中,主進程仍然可以處理客戶端的命令。
用戶可以通過redis配置來設置rdb的保存頻率,服務器是通過執行bgsave來生成rdb文件的。
save? 900? 1:服務器在900秒之內,對數據庫至少進行了1次修改
save? 300? 10:服務器在300秒之內,對數據庫至少進行了10次修改
save? 60? 10000:服務器在60秒之內,對數據庫至少進行了10000次修改
3、aof
aof記錄的是redis接收到的客戶端寫請求,當redis接收到寫命令時,會先記錄到內存的aof_buf緩沖區的末尾,當滿足配置的aof持久化策略時,就會寫入或同步到磁盤中。
always:每個事件循環將aof_buf緩沖區中的內容寫入并同步到aof文件。
everysec:每個事件循環將aof_buf緩沖區中的內容寫入到aof文件,每1秒同步一次。
no:每個事件循環將aof_buf緩沖區中的內容寫入到aof文件,但并不對aof文件進行同步,同步交給系統處理。
aof文件里面有很多失效的數據,會占用大量的空間,redis會根據配置對aof文件進行重寫。
no-appendfsync-on-rewrite no 在aof文件重寫時appendfsync選項是否設置成no,如果設置成no將會將同步磁盤的工作交給系統,如果redis掛了有一些寫記錄是沒有同步到aof文件中的,會丟失部分數據,如果設置不設置成no將會根據appendfsync同步數據,兩個進程同時向磁盤同步數據會出現寫抖動。
auto-aof-rewrite-percentage 100 當前aof文件大小是上次日志重寫得到aof文件大小的二倍時,自動啟動新的日志重寫過程。
auto-aof-rewrite-min-size 64mb? 當前aof文件啟動重寫過程的最小值,避免剛剛啟動reids時由于文件尺寸較小導致頻繁的重寫。
aof重寫是通過子進程進行的,重寫過程中如果redis收到新的寫命令將會記錄到重寫緩沖區中,主進程定期調用wait3函數等待子進程退出,并將重寫緩沖區中的日志記錄到新的aof文件中。
4、其它
redis啟動的時候,優先加載aof文件,如果aof沒有aof文件,再加載rdb文件。