1. 程式人生 > >關於redis的持久化策略

關於redis的持久化策略

Redis的持久化

Redis雖然是基於記憶體的儲存系統,但是它本身是支援記憶體資料的持久化的,而且提供兩種主要的持久化策略:RDB快照和AOF日誌。

Redis的RDB快照

Redis支援將當前資料的快照存成一個數據檔案的持久化機制,即RDB快照。這種方法是非常好理解的,但是一個持續寫入的資料庫如何生成快照呢?Redis藉助了fork命令的copy on write機制。在生成快照時,將當前程序fork出一個子程序,然後在子程序中迴圈所有的資料,將資料寫成為RDB檔案。

我們可以通過Redis的save指令來配置RDB快照生成的時機,比如你可以配置當10分鐘以內有100次寫入就生成快照,也可以配置當1小時內有1000次寫入就生成快照,也可以多個規則一起實施。這些規則的定義就在Redis的配置檔案中,你也可以通過Redis的CONFIG SET命令在Redis執行時設定規則,不需要重啟Redis。

Redis的RDB檔案不會壞掉,因為其寫操作是在一個新程序中進行的,當生成一個新的RDB檔案時,Redis生成的子程序會先將資料寫到一個臨時檔案中,然後通過原子性rename系統呼叫將臨時檔案重新命名為RDB檔案,這樣在任何時候出現故障,Redis的RDB檔案都總是可用的。同時,Redis的RDB檔案也是Redis主從同步內部實現中的一環。

Redis的AOF日誌

AOF日誌的全稱是append only file,從名字上我們就能看出來,它是一個追加寫入的日誌檔案。

AOF是一個寫檔案操作,其目的是將操作日誌寫到磁碟上,所以它也同樣會遇到我們上面說的寫操作的5個流程。那麼寫AOF的操作安全性又有多高呢。實際上這是可以設定的,在Redis中對AOF呼叫write(2)寫入後,何時再呼叫fsync將其寫到磁碟上,通過appendfsync選項來控制,下面appendfsync的三個設定項,安全強度逐漸變強。

1)appendfsync no

當設定appendfsync為no的時候,Redis不會主動呼叫fsync去將AOF日誌內容同步到磁碟,所以這一切就完全依賴於作業系統的除錯了。對大多數Linux作業系統,是每30秒進行一次fsync,將緩衝區中的資料寫到磁碟上。

2)appendfsync everysec

當設定appendfsync為everysec的時候,Redis會預設每隔一秒進行一次fsync呼叫,將緩衝區中的資料寫到磁碟。但是當這一次的fsync呼叫時長超過1秒時。Redis會採取延遲fsync的策略,再等一秒鐘。也就是在兩秒後再進行fsync,這一次的fsync就不管會執行多長時間都會進行。這時候由於在fsync時檔案描述符會被阻塞,所以當前的寫操作就會阻塞。所以結論就是,在絕大多數情況下,Redis會每隔一秒進行一次fsync。在最壞的情況下,兩秒鐘會進行一次fsync操作。這一操作在大多數資料庫系統中被稱為group commit,就是組合多次寫操作的資料,一次性將日誌寫到磁碟。

3)appednfsync always

當設定appendfsync為always時,每一次寫操作都會呼叫一次fsync,這時資料是最安全的,當然,由於每次都會執行fsync,所以其效能也會受到影響。