標籤:color 而且 動作記錄 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,所以其效能也會受到影響。
關於redis的持久化策略