目錄
- 一、RDB
- 1.1 觸發機制
- 1.2 流程說明
- 1.3 RDB優缺點
- 二、AOF
- 2.1 開啟AOF
- 2.2 AOF流程
- 三、重啟加載流程
持久化即備份,這是單機高可用的策略之一,有了備份,就可以在Redis故障通過備份進行恢復,redis持久化主要有RDB和AOF,
-
RDB
RDB(Redis DataBase),基于策略定時將redis記憶體中的資料保存到硬碟,需要時可以通過這個備份檔案進行恢復,
-
AOF
AOF(Append Only File),是把每次redis執行的命令記錄到日志檔案中(類似于MySql的Bin log),當Redis啟動時可以通過執行log中的命令來恢復資料
一、RDB
1.1 觸發機制
save命令:阻塞當前redis服務器,直到RDB程序完成,服務器在阻塞期間不能處理如何客戶端請求,原則上save命令已經廢棄,
bgsave命令:會fork一個子行程,RDB的持久化由這個子行程來完成,阻塞只發生在fork階段,耗時較短,子行程執行rdb期間redis服務器不會阻塞,正常處理客戶端請求,
自動觸發機制:在redis.conf 配置:
save m n
代表如果在m秒記憶體在n次的修改時,則執行bgsave命令
1.2 流程說明

- 執行bgsave命令,redis父行程判斷如果當前存在正在執行的子行程,則直接回傳,比如AOF或者RDB子行程,
- 父行程fork一個子行程,fork程序父行程是阻塞,無法回應客戶端請求
- fork結束后,bgsave回傳“background saving started”資訊,并且不再阻塞父行程,父行程可以繼續回應客戶端請求,
- 子行程根據父行程的記憶體快照創建RDB檔案,完成后對原有檔案進行原子替換,
- 子行程發送信號給父行程表示RDB完成
1.3 RDB優缺點
優點
- RDB是一個壓縮的二進制檔案,代表Redis在某個時間點上的資料快照,適合備份,全量復制等場景
- Redis加載RDB恢復資料遠遠快于AOF
缺點
- RDB無法做到實時持久化
- 兼容性問題,新版本的redis可能無法兼容老版本的RDB
為了解決實時持久化問題,redis引入了AOF,
二、AOF
2.1 開啟AOF
AOF默認是關閉的,通過如下命令開啟:
appendonly yes
2.2 AOF流程

AOF作業基本流程:
- 命令寫入(append):redis所有的寫入命令會追加到aof_buf(緩沖區)中
- 檔案同步(sync):AOF緩沖區根據對應的策略向硬碟做同步操作
- 檔案重寫(rewrite):隨著AOF檔案越來越大,需要定期對AOF檔案進行重寫,達到壓縮的目的
- 重啟加載(load):redis啟動后可以加載AOF檔案進行資料恢復,
命令寫入
對于每一條redis寫入命令,在AOF中會追加一條文本,文本格式是redis文本協議格式(RESP),直接采用協議格式,以來兼容性和可讀性高,二來避免了二次處理的開銷,
如果直接把命令寫入硬碟會影響到redis的性能,先寫入aof_buf,然后后期通過同步策略寫入硬碟,避免直接的IO影響到redis的性能,
檔案同步
redis提供了多種AOF緩沖區檔案同步策略,同步策略分別使用了作業系統的wirte函式和fsync函式,說明如下:
write: 會觸發延遲寫(delayed write)操作,為了性能,linux在內核提供了頁緩沖區用來提高硬碟的IO性能,write操作在寫入系統緩沖區后直接回傳,后期同步硬碟操作依賴于作業系統調度(比如按時,或者緩沖區慢等),如果在同步前出現系統宕機故障,緩沖區的資料會丟失,
fsync: 強制作業系統將緩沖區的操作同步到硬碟,
由appendfsync引數控制:
| 可配置的值 | 說明 |
|---|---|
| always | 命令寫入buf后呼叫系統呼叫fsync同步AOF檔案,fsync完成后執行緒回傳 |
| no | 命令寫入buf后呼叫系統呼叫write操作,后續fsync同步操作由作業系統來完成,一般為30秒一次, |
| everysec | 命令寫入buf后呼叫系統呼叫write操作,后續fsync同步操作專門執行緒每一秒呼叫一次, |
everysec是always和no的折中,是性能和安全性的這種,是redis默認的配置,也是比較推薦的配置,
檔案重寫
檔案重寫就是把Redis行程里面的最新資料轉化為寫命令然后同步到aof檔案的程序,通過重寫不但可以減小aof檔案的體積,從而進一步提高aof檔案在恢復程序中的加載速度,
由以下原因可以通過aof重寫減少aof檔案的體積:
- 舊的apf包含過期的資料不再寫入aof,比如 set k1 aaa,這條命令已經過期,但是已經在aof檔案中存在,通過重寫這條命令將移除aof檔案,
- 舊的aof中存在無效的命令,比如set k1 111,set k1 222,aof中存在兩條命令,其實第一條已經失效,通過重寫,可以變成一條,
- 多條命令命令合并,
觸發機制:
-
手動觸發:執行bgrewriteaof命令
-
自動觸發:根據auto-aof-rewrite-min-size和auto-aof-rewrite-percentage引數確定自動觸發時機:
-
auto-aof-rewrite-min-size:表示運行aof重寫時檔案的最小體積,默認為64MB
-
auto-aof-rewrite-percentage:表示當前aof檔案的size(aof_current_size)和上一次重寫后aof檔案的size(aof_base_size)的比值,
只有當以上兩個條件同時滿足時,才會觸發自動aof
-
aof重寫流程:

- 執行aof重寫請求
- 父行程fork一個子行程,開銷等同于bgsave時候fork的程序
- aof緩沖區寫入
- fork結束后,主行程繼續回應客戶端請求,所有修改命令都會寫入aof_buf,后續基于appendfsync策略寫入硬碟
- 由于fork操作運用寫時復制技術,子行程只能共享fork操作時的的記憶體資料,在執行bgrewrite期間,主行程依然在回應命令,redis用aof_rewrite_buf來保存這部分資料,防止在新的aof檔案生成期間丟失這部分資料,
- 寫入新的AOF,子行程基于fork后的aof_buf(快照)生成新的aof檔案
- 后續操作
- 子行程發送信號通知父行程aof生成完成,父行程更新相關統計資訊
- 父行程把aof_rewrite_buf的資料寫入到新的aof檔案
- 使用最新的aof檔案替換老檔案,完成最終的AOF重寫,
三、重啟加載流程

- 優先加載AOF
- AOF關閉時加載RDB
- 加載成功后redis才能成功啟動
- 加載失敗,則redis啟動失敗
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/235955.html
標籤:NoSQL
上一篇:[求助第一次發帖]登陸驗證
下一篇:redis-持久化(1)
