1. 程式人生 > >redis如何做持久化

redis如何做持久化

(資料遷移和資料備份)
持久化的概念:把資料放到斷電也不會丟失的裝置上。
Redis實現持久化有兩種方法:RDB快照和AOF

redis是預設做資料持久化的,預設的方式是快照(snapshotting),把記憶體的資料寫入本地的二進位制檔案dump.rdb檔案中。

RDB快照

快照持久化實現原理:
Redis是由C語言實現的,redis藉助了fork命令的copy on write機制。在生成快照時,將當前程序fork複製出一個子程序,然後在子程序中迴圈所有的資料,將資料依次遍歷出來,存放配置指定的二進位制檔案dump.rdb中,寫成為RDB檔案,使用redis的save命令呼叫這個過程。

快照的配置有下面三個級別,配置是在redis的配置檔案中。

RDB快照持久化的優點:

  1. RDB是一個非常緊湊的檔案,它儲存了某個時間點得資料集,非常適用於資料集的備份,比如您可以在每個小時報儲存一下過去24小時內的資料,同時每天儲存過去30天的資料,這樣即使出了問題您也可以根據需求恢復到不同版本的資料集.
  2. RDB是一個緊湊的單一檔案,很方便傳送到另一 個遠端資料中心或者亞馬遜的S3(可能加密),非常適用於災難恢復.
  3. RDB在儲存RDB檔案時父程序唯一需要做的就是fork出一個子程序,接下來的工作全部由子程序來做,父程序不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的效能。
  4. 與AOF相比,檔案以二進位制形式存放,讀寫很快,在恢復大的資料集的時候,RDB方式會更快一些.
  5. 使用起來簡單,只要修改配置檔案,把所有的資料存放到一個檔案中。

RDB快照持久化的缺點:
斷電容易造成資料丟失,斷電時間段內的資料不能備份。即一旦資料庫出現問題,那麼我們的RDB檔案中儲存的資料並不是全新的,從上次RDB檔案生成到Redis停機這段時間的資料全部丟掉了。

AOF

AOF日誌的全稱是append only file,從名字上我們就能看出來,它是一個追加寫入的日誌檔案.
實現原理:
在使用aof時,redis會將記憶體中資料(每一個收到的寫命令)都通過write函式追加到日誌檔案中,當redis重啟時會通過重新執行檔案中儲存的寫命令來在記憶體中重建整個資料庫的內容.Redis還能對AOF檔案通過BGREWRITEAOF 重寫,使得AOF檔案的體積不至於過大.

由於AOF是把操作日誌寫入日誌檔案中,那麼AOF的操作安全性如何保證?可以在配置檔案中通過配置告訴redis我們想要使用fsync函式強制寫入到磁碟的時間。
配置分為三種:

  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,所以其效能也會受到影響。

AOF的優點:

  1. 使用起來簡單,只要修改配置檔案,日誌檔案是單獨檔案,使用AOF會更加持久化資料。
  2. 缺點是有大小的限制,但是可以修改日誌檔案的大小,redis可以在aof檔案過大時使用BGREWRITEAOF 進行重寫
  3. 儲存的aof日誌格式檔案是按照redis協議的格式儲存,很容易讀取。

AOF的缺點:

  1. 對於相同的資料集來說,AOF 檔案的體積通常要大於 RDB 檔案的體積
  2. 速度沒有RDB速度快。
  3. 在寫入記憶體資料的同時將操作命令儲存到日誌檔案,在一個併發更改上萬的系統中,命令日誌是一個非常龐大的資料,管理維護成本非常高,恢復重建時間會非常長,這樣導致失去aof高可用性本意。另外更重要的是Redis是一個記憶體資料結構模型,所有的優勢都是建立在對記憶體複雜資料結構高效的原子操作上,這樣就看出aof是一個非常不協調的部分。其實aof目的主要是資料可靠性及高可用性.