redis設計與實現讀書筆記-持久化

RDB持久化

RDB持久化功能所生成的RDB文件是一個經過壓縮的二進制文件,通過該文件可以還原生成RDB文件時的數據庫狀態,

RDB文件的創建與載入

有兩個Redis命令可以用於生成RDB文件,一個是SAVE,另一個是BGSAVE。SAVE命令會阻塞Redis服務器進程,直到RDB文件創建完畢爲止,在服務器進程阻塞期間,服務器不能處理任何命令請求,BGSAVE命令會派生出一個子進程,然後由子進程負責創建RDB文件,服務器進程(父進程)繼續處理命令請求

RDB文件的載入工作是在服務器啓動時自動執行的,所以Redis並沒有專門用於載入RDB文件的命令,只要Redis服務器在啓動時檢測到RDB文件存在,它就會自動載入RDB文件。

❑如果服務器開啓了AOF持久化功能,那麼服務器會優先使用AOF文件來還原數據庫狀態。

❑只有在AOF持久化功能處於關閉狀態時,服務器纔會使用RDB文件來還原數據庫狀態。

BGSAVE命令執行時的服務器狀態

BGREWRITEAOF和BGSAVE兩個命令不能同時執行:

❑如果BGSAVE命令正在執行,那麼客戶端發送的BGREWRITEAOF命令會被延遲到BGSAVE命令執行完畢之後執行。

❑如果BGREWRITEAOF命令正在執行,那麼客戶端發送的BGSAVE命令會被服務器拒絕。

RDB文件載入時的服務器狀態

服務器在載入RDB文件期間,會一直處於阻塞狀態,直到載入工作完成爲止。

自動間隔性保存

Redis允許用戶通過設置服務器配置的save選項,讓服務器每隔一段時間自動執行一次BGSAVE命令。

檢查保存條件是否滿足

Redis的服務器週期性操作函數serverCron默認每隔100毫秒就會執行一次,該函數用於對正在運行的服務器進行維護,它的其中一項工作就是檢查save選項所設置的保存條件是否已經滿足,如果滿足的話,就執行BGSAVE命令。

重點回顧

❑RDB文件用於保存和還原Redis服務器所有數據庫中的所有鍵值對數據。

❑SAVE命令由服務器進程直接執行保存操作,所以該命令會阻塞服務器。

❑BGSAVE令由子進程執行保存操作,所以該命令不會阻塞服務器。

❑服務器狀態中會保存所有用save選項設置的保存條件,當任意一個保存條件被滿足時,服務器會自動執行BGSAVE命令。❑RDB文件是一個經過壓縮的二進制文件,由多個部分組成。

❑對於不同類型的鍵值對,RDB文件會使用不同的方式來保存它們。

AOF持久化

AOF持久化是通過保存Redis服務器所執行的寫命令來記錄數據庫狀態的

AOF持久化的實現

AOF持久化功能的實現可以分爲命令追加(append)、文件寫入、文件同步(sync)三個步驟。

命令追加:

當AOF持久化功能處於打開狀態時,服務器在執行完一個寫命令之後,會以協議格式將被執行的寫命令追加到服務器狀態的aof_buf緩衝區的末尾

AOF文件的寫入與同步:

Redis的服務器進程就是一個事件循環(loop),這個循環中的文件事件負責接收客戶端的命令請求,以及向客戶端發送命令回覆,而時間事件則負責執行像serverCron函數這樣需要定時運行的函數。flushAppendOnlyFile函數的行爲由服務器配置的appendfsync選項的值來決定,各個不同值產生的行爲如表11-1所示。

□ 當appendfsync的值爲always時,服務器在每個事件循環都要將aof_buf緩衝區中的所有內容寫入到AOF文件,並且同步AOF文件

□ 當appendfsync的值爲everysec時,服務器在每個事件循環都要將aof_buf緩衝區中的所有內容寫入到AOF文件,並且每隔一秒就要在子線程中對AOF文件進行一次同步

□ 當appendfsync的值爲no時,服務器在每個事件循環都要將aof_buf緩衝區中的所有內容寫入到AOF文件,至於何時對AOF文件進行同步,則由操作系統控制

AOF文件的載入與數據還原

服務器只要讀入並重新執行一遍AOF文件裏面保存的寫命令,就可以還原服務器關閉之前的數據庫狀態。

 AOF重寫

爲了解決AOF文件體積膨脹的問題,Redis提供了AOF文件重寫(rewrite)功能。通過該功能,Redis服務器可以創建一個新的AOF文件來替代現有的AOF文件,新舊兩個AOF文件所保存的數據庫狀態相同,但新AOF文件不會包含任何浪費空間的冗餘命令,所以新AOF文件的體積通常會比舊AOF文件的體積要小得多

AOF文件重寫並不需要對現有的AOF文件進行任何讀取、分析或者寫入操作,這個功能是通過讀取服務器當前的數據庫狀態來實現的。

AOF後臺重寫

Redis決定將AOF重寫程序放到子進程裏執行,這樣做可以同時達到兩個目的:

❑子進程進行AOF重寫期間,服務器進程(父進程)可以繼續處理命令請求。

❑子進程帶有服務器進程的數據副本,使用子進程而不是線程,可以在避免使用鎖的情況下,保證數據的安全性。

爲了解決這種數據不一致問題,Redis服務器設置了一個AOF重寫緩衝區,這個緩衝區在服務器創建子進程之後開始使用,當Redis服務器執行完一個寫命令之後,它會同時將這個寫命令發送給AOF緩衝區和AOF重寫緩衝區,如圖11-4所示。

1)將AOF重寫緩衝區中的所有內容寫入到新AOF文件中,這時新AOF文件所保存的數據庫狀態將和服務器當前的數據庫狀態一致。

2)對新的AOF文件進行改名,原子地(atomic)覆蓋現有的AOF文件,完成新舊兩個AOF文件的替換。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章