redis數據可持久化
1.快照(snapshats)
1-1:配置文件
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb (存儲文件)
含義:指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
1-2:可以自己手動存儲
save 命令執行一個同步保存操作,將當前 Redis 實例的所有數據快照(snapshot)以 RDB 文件的形式保存到硬盤。
一般來說,在生產環境很少執行 SAVE 操作,因為它會阻塞所有客戶端,保存數據庫的任務通常由 BGSAVE 命令異步地執行。
然而,如果負責保存數據的後臺子進程不幸出現問題時,SAVE 可以作為保存數據的最後手段來使用。
原理
- Redis forks.
- 子進程開始將數據寫到臨時RDB文件中。
- 當子進程完成寫RDB文件,用新文件替換老文件。
- 這種方式可以使Redis使用copy-on-write技術。
特點
快照易恢復,文件也小,但是如果遇到宕機等情況的時候快照的數據可能會不完整。此時可能需要啟用另一種持久化方式AOF
2.append only mode (aof)
配置
appendonly yes
appendfsync everysec (可選參數:
appendfsync always #always 表示每次有寫操作都進行同步,非常慢,非常安全。
appendfsync everysec #everysec表示對寫操作進行累積,每秒同步一次
官方的建議的everysec,安全,就是速度不夠快,如果是機器出現問題可能會丟失1秒的數據。
也可以手動執行bgrewriteaof進行AOF備份: bgrewriteaof
)
AOF重寫
AOF文件是可識別的純文本,它的內容就是一個個的Redis標準命令,
AOF日誌也不是完全按客戶端的請求來生成日誌的,比如命令 INCRBYFLOAT 在記AOF日誌時就被記成一條SET記錄,
因為浮點數操作可能在不同的系統上會不同,所以為了避免同一份日誌在不同的系統上生成不同的數據集,所以這裏只將操作後的結果通過SET來記錄。
每一條寫命令都生成一條日誌,AOF文件會很大。
AOF重寫是重新生成一份AOF文件,新的AOF文件中一條記錄的操作只會有一次
其生成過程和RDB類似,也是fork一個進程,直接遍歷數據,寫入新的AOF臨時文件。
在寫入新文件的過程中,所有的寫操作日誌還是會寫到原來老的 AOF文件中,同時還會記錄在內存緩沖區中。
當重完操作完成後,會將所有緩沖區中的日誌一次性寫入到臨時文件中。然後調用原子性的rename命令用新的 AOF文件取代老的AOF文件
原理:
AOF重寫並不需要對原有AOF文件進行任何的讀取,寫入,分析等操作,這個功能是通過讀取服務器當前的數據庫狀態來實現的。
命令:
BGREWRITEAOF, 我們應該經常調用這個命令來來重寫
當redis服務器掛掉時,重啟時將按照以下優先級恢復數據到內存:
- 如果只配置AOF,重啟時加載AOF文件恢復數據;
- 如果同時 配置了RBD和AOF,啟動是只加載AOF文件恢復數據;
- 如果只配置RBD,啟動是講加載dump文件恢復數據。
恢復時需要註意,要是主庫掛了不能直接重啟主庫,否則會直接覆蓋掉從庫的AOF文件,一定要確保要恢復的文件都正確才能啟動,否則會沖掉原來的文件。
redis數據可持久化