1. 程式人生 > >Redis深入學習筆記(三)RDB及AOF流程

Redis深入學習筆記(三)RDB及AOF流程

del 每秒調用 查看 單個 一個 重寫 use 物理內存 深入學習

RDB是Redis持久化數據的一種方式,是執行時間點的Redis內存快照,redis數據還原時加載rdb文件,Redis的主從數據同步也是基於RDB實現的。

RDB流程:

技術分享圖片

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)進程發送信號給父進程表示完成,父進程更新統計信息,具體見info Persistence下的rdb_*相關選項。

AOF是Redis持久化數據的另一種方式,這種方式以日誌形式記錄每一條操作,當redis恢復數據時,還原所有操作。

AOF流程:

技術分享圖片

1)所有的寫入命令會追加到aof_buf中。

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

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

4)當Redis服務器重啟時,可以加載AOF文件進行數據恢復。

AOF緩沖區同步文件策略(配置appendfsync參數)說明:

  always:命令寫入aof_buf後調用系統fsync操作同步到AOF文件,fsync完成後線程返回

  everysec:命令寫入aof_buf後調用系統write操作,write完成後線程返回。fsync同步文件操作由專門線程每秒調用一次

  no:命令寫入aof_buf後調用系統write操作,不對AOF文件做fsync同步,同步硬盤操作由操作系統負責,通常同步周期最長30s

  配置為always時,每次寫入都要同步AOF文件,在一般的SATA硬盤上,Redis只能支持大約幾百TPS寫入,顯然跟Redis高性能特性背道而馳,不建議配置。

  配置為no,由於操作系統每次同步AOF文件的周期不可控,而且會加大每次同步硬盤的數據量,雖然提升了性能,但數據安全性無法保證。

  配置為everysec,是建議的同步策略,也是默認配置,做到兼顧性能和數據安全性。理論上只有在系統突然宕機的情況下丟失1秒的數據。

(策略選擇根據業務不同進行選擇)

系統調用write和fsync說明:

  write操作會觸發延遲寫(delayed write)機制,Linux在內核提供頁緩沖區用來提高硬盤IO性能,write操作在寫入系統緩沖區後直接返回,同步硬盤操作依賴於系統調度機制,例如:

緩沖區頁空間寫滿或達到特定時間周期。同步文件之前,如果此時系統故障宕機,緩沖區內數據將丟失。

  fsync針對單個文件操作(比如AOF文件),做強制硬盤同步,fsync將阻塞直到寫入硬盤完成後返回,保證了數據持久化。  

  子進程通過fork操作產生,占用內存大小等同於父進程,理論上需要兩倍的內存來完成持久化操作,但Linux有寫時復制機制(copy-on-write)。父子進程會共享相同的物理內存頁,當父進程處理寫請求時會把要修改的頁創建副本,而子進程在fork操作過程中共享整個父進程內存快照。避免在大量寫入時做子進程重寫操作,這樣將導致父進程維護大量頁副本,造成內存消耗。

  Linux kernel在2.6.38內核增加了Transparent Huge Pages(THP),支持huge page(2MB)的頁分配,默認開啟。當開啟時可以降低fork創建子進程的速度,但執行fork之後,如果開啟THP,復制頁單位從原來4KB變為2MB,會大幅增加重寫期間父進程內存消耗。建議設置“sudo echonever>/sys/kernel/mm/transparent_hugepage/enabled”關閉THP。

RDB和AOF對比:

RDB文件緊湊小巧,RDB文件生成又子進程完成,不會阻塞主進程,並且可以利用多核CPU資源,數據的恢復速度也比AOF快,但是RDB方式容易丟失數據,有些公司為了充分利用CPU資源,將Redis進程與cpu核心進行綁定,進行RDB時子進程與父進程會發生資源競爭,影響服務吞吐。

AOF更加安全,可以將數據更加及時的同步到文件中,但是AOF需要較多的磁盤IO開支,AOF文件尺寸較大,文件內容恢復數度相對較慢。

註:文中圖片皆來自書中。

下一篇會介紹主從復制流程

Redis深入學習筆記(三)RDB及AOF流程