Redis(七)持久化(Persistence)

來源:互聯網
上載者:User

標籤:子進程   檔案   cpu   features   工作流程   不同   兩種   檔案中   命令   

前言

  前文中介紹到Redis時記憶體的K-V資料結構儲存伺服器。Redis的高效能原因之一在於其讀寫資料都是在記憶體中進行。它的架構實現方式決定了Redis的資料存放區具有不可靠性,易丟失,因為RAM記憶體在硬體問題或者斷電情況下都會被擦除。
  基於以上問題,為了防止資料在特殊情況下丟失,Redis支援記憶體資料持久化至磁碟的功能——Redis Persistence。
  

Redis持久化方式

Redis提供了兩種持久化方式:

  • RDB持久化方式:在特定的時間間隔儲存Redis鍵空間的某一時刻的快照。
  • AOF持久化方式:當有資料寫入Redis時,將以日誌的形式記錄寫入的命令。以追加的方式寫入AOF檔案尾部,寫入的內容遵循Redis協議的命令格式。

兩種持久化方式完全不同。第一種是以完整的資料角度進行持久化,第二種是以日誌的形式記錄完整的寫入操作。Redis使用者可以在這兩種方式之間進行trade off,也可以綜合使用這兩種方式。

Redis持久化比較

RDB的優點:

  • RDB是某一時刻的Redis鍵空間的快照檔案,是經過高度壓縮的單個檔案,所以RDB檔案對於備份非常合適。根據不同的時刻,有不同版本的檔案。
  • 因為其實高度壓縮的單個檔案,所以對於資料擷取,容災都是非常不錯的選擇,可以將其轉移至資料中心。
  • Redis是單進程的方式work,所以在進行持久化時正在work的父進程會fork子進程進行很持久化操作,父進程仍然可以正常的服務使用者client的請求,對效能影響微乎其微。
  • 因為RDB持久化方式儲存的是鍵空間的資料,所以對於Redis重啟,恢複資料相對於AOF要更迅速。

AOF優點:

  • AOF方式對於Redis的持久化更耐用,因為AOF提供了多種持久化策略可供選擇:無同步持久化, 每秒同步持久化, 每次操作時同步持久化。預設策略是每秒持久化,這種方式寫效能很好且只會丟失一秒間隔的資料(可容忍)。
  • AOF方式只僅僅是追加的log形式,所以持久化時無需尋找鍵空間資料且不會出現因為斷電問題出現AOF檔案損壞的問題。因為是追加的方式,只會局部影響最後的檔案內容,Redis提供了redis-check-aof工具用於修複AOF檔案。
  • 當出現AOF檔案過大時,Redis會自動後台重寫AOF檔案。
  • 因為AOF是追加命令+資料的格式log,所以AOF檔案具有易讀性。

RDB的缺點:

  • RDB方式是一段時間間隔後持久化資料快照,所以存在資料丟失風險。即使你將間隔控制在每5分鐘,仍然存在最近幾分鐘內資料丟失的可能。
  • RDB持久化方式是工作的父進程fork持久化的子進程。如果鍵空間資料很大,fork可能需要耗費很長時間,在fork過程中,父進程停止對client請求服務。如果資料集很大且cpu效能不是很好,可能造成Redis秒級停止服務。

AOF缺點:

  • 相同鍵空間的資料,AOF檔案的體積比RDB檔案更大。
  • 根據不同的fsycn策略,AOF方式可能比RDB更慢。雖然每秒的fsycn效能非常好,但是在巨大的寫入是RDB的效能比AOF更好。
Redis持久化工作流程

  上述比較了兩種持久化方式的各自優缺點,兩者的選擇需要trade off。但是通常,綜合使用兩種持久化方式是不粗的選擇。
單獨使用RDB存在資料丟失風險,單獨使用AOF對於重啟和資料備份來說不是好的idea。基於以上兩種原因,綜合使用RDB和AOF,能滿足資料備份和快速重啟,也能將資料丟失的風險降到最低。

  預設情況,Redis是將快照儲存在一個二進位的dump.rdb檔案中。可以配置Redis在最近間隔多少秒內發生多少變化時進行RDB持久化。或者可以使用SAVE或者BGSAVE命令。
例如:save 60 1000,如果每60秒發生1000次變化,則進行RDB持久化。

RDB的工作流程:

  1. Redis fork用於持久化的子進程。
  2. 子進程將鍵空間資料寫入到臨時的rdb檔案中。
  3. 當子進程完成寫入,將替換舊的RDB檔案。

   對於AOF方式,需要在設定檔中開啟AOF,配置:appendonly yes。當有寫入命令時,Redis會將其追加到AOF檔案末尾。
   可以配置AOF的fsycn策略:

  1. 每當一個新命令執行時,即追加。很慢但是很安全
  2. 每秒追加一次,足夠快且只丟失一秒的資料
  3. 從不fsync,依賴作業系統,非常快但是缺少安全性

建議的策略是每秒追加一次。

使用AOF方式有時可能出現檔案損壞的問題,比如正在寫入AOF檔案時出現斷電情況。這時可以使用redis-check-aof工具修複AOF檔案

redis-check-aof --fix "filename",然後使用修複後的AOF檔案啟動Redis即可恢複資料。

AOF重寫方式的工作流程:

  1. Redis的工作父進程fork子進程。
  2. 子進程開始寫一個新的臨時AOF檔案
  3. 父進程將新發生的操作全部寫入記憶體緩衝區
  4. 當子進程重寫完畢,父進程會受到訊號,並將記憶體緩衝區的內容追加到子進程重寫後的AOF檔案中
  5. Redis再重新命名舊的AOF檔案名稱至新的檔案,Redis並將新的操作追加到檔案中。
Redis持久化配置

觸發RDB持久化配置需要在redis.conf中配置:

dir /usr/local/var/redis/dbfilename dump.rdbsave 60 5

觸發AOF持久化配置需要在redis.cong中配置:

appendonly yesappendfilename "appendonly.aof"appendfsync everysec
參考

Redis Persistence
Redis Persistence

Redis(七)持久化(Persistence)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.