天天看點

Redis---持久化 ( RDB AOF )

1). rdb持久化:

該機制是指在指定的時間間隔内将記憶體中的資料集快照寫入磁盤。

2). aof持久化:

機制将以日志的形式記錄伺服器所處理的每一個寫操作,在redis伺服器啟動之初會讀取該檔案來重新建構資料庫,以保證啟動後資料庫中的資料是完整的。比如,一直在執行自加一的指令,然後我們可以直接用一個set來代替n個自加啊,自減的指令,意思就是直接記錄結果。

3). 無持久化:

我們可以通過配置的方式禁用redis伺服器的持久化功能,這樣我們就可以将redis視為一個功能加強版的memcached了。

4). 同時應用aof和rdb。

我是這樣做的,先把之前的服務殺死,然後就進連上去,發現所有的key都不在了,然後我現在就去體驗rdb的持久化機制,在配置檔案裡配置多長時間寫過一次就刷一次什麼的。

這就是快照的頻率

Redis---持久化 ( RDB AOF )

這個是快照的路徑

Redis---持久化 ( RDB AOF )

仔細看配置檔案

<a href="http://download.csdn.net/detail/bug_moving/9740667">配置檔案csdn下載下傳位址</a>

Redis---持久化 ( RDB AOF )

可以看到開始我們設定的/var/redis這個檔案夾裡面是沒有内容的,然後我們用redis自帶的性能測試工具,模拟10w條資料。

Redis---持久化 ( RDB AOF )

然後再去看,/var/redis 這個檔案夾裡面多了dump.rdb快照檔案

Redis---持久化 ( RDB AOF )

然後再去查,keys,本來是沒有的,就會有,而且你如果不删除那個/var/redis裡面的檔案,這個keys就算是你重新開機伺服器,也不會丢失,這就是一種持久化的方式。

Redis---持久化 ( RDB AOF )

1). 一旦采用該方式,那麼你的整個redis資料庫将隻包含一個檔案,這對于檔案備份而言是非常完美的。比如,你可能打算每個小時歸檔一次最近24小時的資料,同時還要每天歸檔一次最近30天的資料。通過這樣的備份政策,一旦系統出現災難性故障,我們可以非常容易的進行恢複。

2). 對于災難恢複而言,rdb是非常不錯的選擇。因為我們可以非常輕松的将一個單獨的檔案壓縮後再轉移到其它存儲媒體上。

3). 性能最大化。對于redis的服務程序而言,在開始持久化時,它唯一需要做的隻是fork出子程序,之後再由子程序完成這些持久化的工作,這樣就可以極大的避免服務程序執行io操作了。

4). 相比于aof機制,如果資料集很大,rdb的啟動效率會更高。

1). 如果你想保證資料的高可用性,即最大限度的避免資料丢失,那麼rdb将不是一個很好的選擇。因為系統一旦在定時持久化之前出現當機現象,此前沒有來得及寫入磁盤的資料都将丢失。

2). 由于rdb是通過fork子程序來協助完成資料持久化工作的,是以,如果當資料集較大時,可能會導緻整個伺服器停止服務幾百毫秒,甚至是1秒鐘。

1). 該機制可以帶來更高的資料安全性,即資料持久性。redis中提供了3中同步政策,即每秒同步、每修改同步和不同步。事實上,每秒同步也是異步完成的,其效率也是非常高的,所差的是一旦系統出現當機現象,那麼這一秒鐘之内修改的資料将會丢失。而每修改同步,我們可以将其視為同步持久化,即每次發生的資料變化都會被立即記錄到磁盤中。可以預見,這種方式在效率上是最低的。至于無同步,無需多言,我想大家都能正确的了解它。

2). 由于該機制對日志檔案的寫入操作采用的是append模式,是以在寫入過程中即使出現當機現象,也不會破壞日志檔案中已經存在的内容。然而如果我們本次操作隻是寫入了一半資料就出現了系統崩潰問題,不用擔心,在redis下一次啟動之前,我們可以通過redis-check-aof工具來幫助我們解決資料一緻性的問題。

3). 如果日志過大,redis可以自動啟用rewrite機制。即redis以append模式不斷的将修改資料寫入到老的磁盤檔案中,同時redis還會建立一個新的檔案用于記錄此期間有哪些修改指令被執行。是以在進行rewrite切換時可以更好的保證資料安全性。

4). aof包含一個格式清晰、易于了解的日志檔案用于記錄所有的修改操作。事實上,我們也可以通過該檔案完成資料的重建。

aof的劣勢有哪些呢?

1). 對于相同數量的資料集而言,aof檔案通常要大于rdb檔案。

2). 根據同步政策的不同,aof在運作效率上往往會慢于rdb。總之,每秒同步政策的效率是比較高的,同步禁用政策的效率和rdb一樣高效。

snapshotting:

預設情況下,redis會将資料集的快照dump到dump.rdb檔案中。此外,我們也可以通過配置檔案來修改redis伺服器dump快照的頻率,在打開6379.conf檔案之後,我們搜尋save,可以看到下面的配置資訊:

save 900 1 #在900秒(15分鐘)之後,如果至少有1個key發生變化,則dump記憶體快照。

save 300 10 #在300秒(5分鐘)之後,如果至少有10個key發生變化,則dump記憶體快照。

save 60 10000 #在60秒(1分鐘)之後,如果至少有10000個key發生變化,則dump記憶體快照。

dump快照的機制:

1). redis先fork子程序。

2). 子程序将快照資料寫入到臨時rdb檔案中。

3). 當子程序完成資料寫入操作後,再用臨時檔案替換老的檔案。

aof檔案:

上面已經多次講過,rdb的快照定時dump機制無法保證很好的資料持久性。如果我們的應用确實非常關注此點,我們可以考慮使用redis中的aof機制。對于redis伺服器而言,其預設的機制是rdb,如果需要使用aof,則需要修改配置檔案中的以下條目:

将appendonly no改為appendonly yes

從現在起,redis在每一次接收到資料修改的指令之後,都會将其追加到aof檔案中。在redis下一次重新啟動時,需要加載aof檔案中的資訊來建構最新的資料到記憶體中。

aof的配置:

在redis的配置檔案中存在三種同步方式,它們分别是:

appendfsync always #每次有資料修改發生時都會寫入aof檔案。

appendfsync everysec #每秒鐘同步一次,該政策為aof的預設政策。

appendfsync no #從不同步。高效但是資料不會被持久化。

如何修複壞損的aof檔案:

1). 将現有已經壞損的aof檔案額外拷貝出來一份。

2). 執行”redis-check-aof –fix ”指令來修複壞損的aof檔案。

3). 用修複後的aof檔案重新啟動redis伺服器。

redis的資料備份:

在redis中我們可以通過copy的方式線上備份正在運作的redis資料檔案。這是因為rdb檔案一旦被生成之後就不會再被修改。redis每次都是将最新的資料dump到一個臨時檔案中,之後在利用rename函數原子性的将臨時檔案改名為原有的資料檔案名。是以我們可以說,在任意時刻copy資料檔案都是安全的和一緻的。鑒于此,我們就可以通過建立cron job的方式定時備份redis的資料檔案,并将備份檔案copy到安全的磁盤媒體中。