天天看點

Redis學習筆記(2)---持久化

Redis提供了不同級别的持久化方式:

  • RDB:指的是在指定時間間隔内将記憶體的資料進行快照存儲。
  • AOF:以日志的方式來記錄每一次寫的操作,追加到檔案的末尾而不是改寫檔案
  • 在同時開啟兩種持久化方式的時候,Redis優先載入aof檔案來恢複原始的資料,因為aof檔案中的資料集要完整一些。

RDB的優點:

  • RDB是一個非常緊湊的檔案,它儲存了某個時間段的資料集,非常适用于資料集的備份,例如你可以在每個小時儲存過去24小時内的資料,同時也可以每天儲存過去30天的資料。
  • RDB是一個緊湊的單一檔案,可以很友善傳送到另一個資料遠端中心,這樣可以應對于硬體損壞等意外導緻的資料丢失。
  • RDB在儲存RDB檔案時父程序唯一需要做的就是fork(複制)一個子程序,接下來的工作都交給子程序來做,父程序不需要再做其他的IO操作,這樣可以最大化Redis的性能
  • 與AOF相比,在恢複大的資料集是,RDB方式會更快一些。

RDB的缺點:

  • RDB方式在redis意外停止工作時,有可能會丢失最後一次資料。
  • Redis在持久化比較大的資料集,因為父程序要fork一個子程序來進行操作,是以需要雙倍的空間,這個是比較耗時的。

AOF的優點:

  • 可以帶來更高的資料安全性,持久性,有三種不同的同步政策,每秒同步,每修改同步,不同步。預設使用每秒同步
  • AOF是一個隻進行追加的日志檔案,就算在寫入過程中遇到當機或者磁盤滿了等情況,也不會破壞之前日志檔案中已經存在的内容,可以使用Redis-check-aof工具修複這些問題。
  • Redis在AOF檔案變得很大時,會自動的在背景對AOF檔案進行重寫,整個重寫過程中是非常安全的,因為在建立新的AOF檔案過程中,會繼續将指令追加到老的AOF檔案,即使出現停機等狀況,老的AOF檔案也不會丢失。當新的AOF檔案建立成功,Redis會自動切換,并且将指令追加到新的AOF檔案。
  • AOF檔案儲存的寫入操作是以Redis協定的格式儲存,非常容易讓人看懂并且分析。

AOF的缺點:

  • 相同的資料集,AOF檔案的體積要大于RBD檔案的體積,因為資料的完整性要高一些,是以在恢複大資料集時,RDB要比AOF速度快。
  • 根據所使用的同步政策,AOF的速度有可能會比RDB慢,預設的每秒同步效率還是很高的,而不同步的效率和RDB是一樣高的

常用配置:

  • RBD配置:

    Redis預設會将資料集的快照儲存在dump.rdb檔案中,我們可以在配置檔案中配置N秒内資料集有M次改動時自動儲存一次資料集,例如:

    save 120 10  一百二十秒内有十次改動就自動進行儲存。
               

    或者我們可以使用 save 或bgsave指令進行手動儲存。

    這種持久化方式叫做快照(snapshotting)

  • AOF配置:
    appendonly yes  預設是no,我們需要修改配置檔案改成yes才能開啟aof持久化方式
    同步政策:
    		appendfsync always  #每次修改都會同步追加到aof檔案中,最慢,但是非常安全
    		appendfsync everysec #每秒進行同步一次,這是aof預設配置,速度快,兼顧了速度和安全性,出故障也隻會丢失一秒鐘的資料
    		appendfsync no #從不同步,高效,但是資料不會持久化,意味着更快但是不安全
    		auto-aof-rewrite-min-size #aof檔案重寫需要的尺寸,比如到了5G之後進行重寫
    		auto-aof-rewrite-percentage #aof檔案增長率,比如翻一倍了就就進行重寫
               

AOF檔案損壞之後如何進行修複:

1)為現有aof檔案進行備份

2)使用redis-check-aof工具進行修複:

redis-check-aof -fix filename
           

3)重新開機伺服器,等待伺服器載入修複後的aof檔案,并進行資料恢複

RDB和AOF的工作原理:

  • RDB:

    1)Redis fork一個子程序,這個時候同時有父程序和子程序

    2)子程序将資料集寫入到臨時RDB檔案中

    3)子程序完成寫入,Redis會使用這個臨時檔案替換舊的RDB檔案,并删除舊的

    這種工作方式可以從寫時複制(copy-on-write)機制中獲益。

  • AOF:

    1)第一步與RDB相同,fork一個子程序

    2)子程序将新的aof檔案中的内容寫入到臨時檔案中

    3)對于新執行的寫入指令,父程序一邊将它們積累到一個記憶體緩存中,一邊将新的指令追加到現有的aof檔案中,(這樣即使在重寫的過程中出現問題,現有的aof檔案也是安全的)

    4)當子程序完成重寫時,會向父程序發送一個信号,父程序接收到信号後會将記憶體中的緩存資料追加到新的AOF檔案末尾。

    5)使用新的aof檔案替換舊的檔案,資料追加到新檔案的末尾。

繼續閱讀