1. 程式人生 > >Redis總結(四)——持久化

Redis總結(四)——持久化

前言:

Redis支援RDB和AOF兩種持久化機制,持久化功能有效地避免因程序退出造成的資料丟失問題,當下次啟動時利用之前持久化的檔案即可實現資料恢復。

RDB:

RDB持久化是把當前程序資料生成快照儲存到硬碟的過程,觸發RDB持久化過程分手動觸發和自動觸發。

手動觸發:

手動觸發分別對應save和bgsave命令。

save命令:阻塞當前Redis伺服器,直到RDB過程完成為止,對於記憶體比較大的例項會造成長時間阻塞,線上環境不建議使用。

bgsave命令:Redis程序執行fork操作建立子程序,RDB持久化過程由子程序負責,完成後自動結束。阻塞只發生在fork階段,一般時間很短。bgsave命令是針對save阻塞問題做的優化。因為Redis內容所有的涉及RDB的操作都採用bgsave的方式,而save命令已經廢棄。

流程說明:

bgsave是主流的觸發RDB持久化方式,它的運作流程大致可分為5步。


1)執行bgsave命令,Redis父程序判斷當前是否存在正在執行的子程序,如RDB/AOF子程序,如果存在bgsave命令直接返回。

2)父程序執行fork操作建立子程序,fork操作過程中父程序會阻塞,通過info stats 命令檢視latest_fork_usec選項,可以獲取最近一個fork操作的耗時,單位為微秒。

3)父程序fork完成後,bgsave命令返回“Background saving started”資訊並不再在阻塞父程序,可以繼續響應其他命令。

4)在子程序建立RDB檔案,根據父程序記憶體生成臨時快照檔案,完成後對原有檔案進行原子替換。執行lastsave命令可以獲取最後一次生成RDB的時間,對應info統計的rdb_last_save_time選項。

5)程序傳送訊號給父程序表示完成,父程序更新統計資訊。

RDB的優缺點:

RDB的優點:

1)RDB是一個緊湊壓縮的二進位制檔案,代表Redis在某個時間上的資料快照。

2)Redis載入RDB恢復資料遠遠快於AOF方式。

RDB的缺點:

1)RDB方式資料沒辦法做到實時持久化/秒級持久化。因為bgsave每次執行都要執行fork操作建立子程序,屬於重量級操作,頻繁成本過高。

2)RDB檔案使用特定二進位制格式儲存,Redis版本演進過程中有多個格式的RDB版本,存在老版本Redis服務無法相容新版RDB格式的問題。

AOF:

AOF(append only file)持久化以獨立日誌的方式記錄每次寫命令,重啟時再重新執行AOF檔案中的命令達到恢復資料的目的。AOF的主要作用是解決了資料持久化的實時性,目前已經是Redis持久化的主流方式。

AOF工作流程:

AOF工作流程可以大致分為4步,命令寫入(append)、檔案同步(sync)、檔案重寫(rewrite)、重新載入(load)。


1)所有的寫命令會追加到aof_buf(緩衝區)中。

2)AOF緩衝區根據對應的策略向硬碟做同步操作。

3)隨著AOF檔案越來越大,需要定期對AOF檔案進行重寫,達到壓縮的目的。

4)當Redis伺服器重啟時,可以載入AOF檔案進行資料恢復。

AOF重寫可以通過auto-aof-rewrite-min-size和auto-aof-rewrite-percentage引數控制自動觸發,也可以使用bgrewriteaof命令手動觸發。子程序執行期間使用copy-on-write機制與父程序共享記憶體,避免記憶體消耗翻倍。AOF重寫期間還需要維護重寫緩衝區,儲存新的寫入命令避免資料丟失。

總結:

Redis持久化功能一直是影響Redis效能的高發地,可以在理解了Redis持久的基本內容以後,逐漸的深入學習,結合常見的持久化問題進行分析定位和優化。