Redis有兩種持久化的方式:快照(RDB
文件)和追加式文件(AOF
文件):nginx
補充:Redis 的存儲分爲內存存儲、磁盤存儲和log文件三部分,配置文件中有三個參數對其進行配置。redis
save seconds updates:在指定時間內,達到多少次更新操做時,就將數據同步到數據文件。這個能夠多個條件配合,好比默認配置文件中的設置,就設置了三個條件。sql
appendonly yes/no:是否在每次更新操做後進行日誌記錄,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於redis自己同步數據文件是按上面的save條件來同步的,因此有的數據會在一段時間內只存在於內存中。緩存
appendfsyncno/always/everysec:no表示等操做系統進行數據緩存同步到磁盤,always表示每次更新操做後手動調用fsync()將數據寫到磁盤,everysec表示每秒同步一次。安全
1、RDBruby
工做原理服務器
優勢app
缺點工具
fork()
產生子進程進行數據的持久化,若是數據比較大的話可能就會花費點時間,形成Redis中止服務幾毫秒。若是數據量很大且CPU性能不是很好的時候,中止服務的時間甚至會到1秒。文件路徑和名稱性能
默認Redis會把快照文件存儲爲當前目錄下一個名爲dump.rdb
的文件。要修改文件的存儲路徑和名稱,能夠經過修改配置文件redis.conf
實現:
# RDB文件名,默認爲dump.rdb。 dbfilename dump.rdb # 文件存放的目錄,AOF文件一樣存放在此目錄下。默認爲當前工做目錄。 dir ./
保存點(RDB的啓用和禁用)
你能夠配置保存點,使Redis若是在每N秒後數據發生了M次改變就保存快照文件。例以下面這個保存點配置表示每60秒,若是數據發生了1000次以上的變更,Redis就會自動保存快照文件:
save 60 1000
保存點能夠設置多個,Redis的配置文件就默認設置了3個保存點:
# 格式爲:save <seconds> <changes> # 能夠設置多個。 save 900 1 #900秒後至少1個key有變更 save 300 10 #300秒後至少10個key有變更 save 60 10000 #60秒後至少10000個key有變更
若是想禁用快照保存的功能,能夠經過註釋掉全部"save"配置達到,或者在最後一條"save"配置後添加以下的配置:
save ""
錯誤處理
默認狀況下,若是Redis在後臺生成快照的時候失敗,那麼就會中止接收數據,目的是讓用戶能知道數據沒有持久化成功。可是若是你有其餘的方式能夠監控到Redis及其持久化的狀態,那麼能夠把這個功能禁止掉。
stop-writes-on-bgsave-error yes
數據壓縮
默認Redis會採用LZF
對數據進行壓縮。若是你想節省點CPU的性能,你能夠把壓縮功能禁用掉,可是數據集就會比沒壓縮的時候要打。
rdbcompression yes
數據校驗
從版本5的RDB的開始,一個CRC64
的校驗碼會放在文件的末尾。這樣更能保證文件的完整性,可是在保存或者加載文件時會損失必定的性能(大概10%)。若是想追求更高的性能,能夠把它禁用掉,這樣文件在寫入校驗碼時會用0
替代,加載的時候看到0
就會直接跳過校驗。
rdbchecksum yes
手動生成快照
Redis提供了兩個命令用於手動生成快照。
SAVE
SAVE命令會使用同步的方式生成RDB快照文件,這意味着在這個過程當中會阻塞全部其餘客戶端的請求。所以不建議在生產環境使用這個命令,除非由於某種緣由須要去阻止Redis使用子進程進行後臺生成快照(例如調用fork(2)
出錯)。
BGSAVE命令使用後臺的方式保存RDB文件,調用此命令後,會馬上返回OK
返回碼。Redis會產生一個子進程進行處理並馬上恢復對客戶端的服務。在客戶端咱們可使用LASTSAVE命令查看操做是否成功。
127.0.0.1:6379> BGSAVE Background saving started 127.0.0.1:6379> LASTSAVE (integer) 1433936394
配置文件裏禁用了快照生成功能不影響SAVE
和BGSAVE
命令的效果
2、AOF
快照並非很可靠。若是你的電腦忽然宕機了,或者電源斷了,又或者不當心殺掉了進程,那麼最新的數據就會丟失。而AOF文件則提供了一種更爲可靠的持久化方式。每當Redis接受到會修改數據集的命令時,就會把命令追加到AOF文件裏,當你重啓Redis時,AOF裏的命令會被從新執行一次,重建數據。
優勢
redis-check-aof
這個工具很簡單的進行修復。FLUSHALL
命令把全部數據刷掉了,只要文件沒有被重寫,咱們能夠把服務停掉,把最後那條命令刪掉,而後重啓服務,這樣就能把被刷掉的數據恢復回來。缺點
啓用AOF
把配置項appendonly
設爲yes
:
appendonly yes
文件路徑和名稱
# 文件存放目錄,與RDB共用。默認爲當前工做目錄。 dir ./ # 默認文件名爲appendonly.aof appendfilename "appendonly.aof"
可靠性
你能夠配置Redis調用fsync的頻率,有三個選項:
推薦使用每秒fsync一次的方式(默認的方式),由於它速度快,安全性也不錯。相關配置以下:
# appendfsync always appendfsync everysec # appendfsync no
日誌重寫
隨着寫操做的不斷增長,AOF文件會愈來愈大。例如你遞增一個計數器100次,那麼最終結果就是數據集裏的計數器的值爲最終的遞增結果,可是AOF文件裏卻會把這100次操做完整的記錄下來。而事實上要恢復這個記錄,只須要1個命令就好了,也就是說AOF文件裏那100條命令其實能夠精簡爲1條。因此Redis支持這樣一個功能:在不中斷服務的狀況下在後臺重建AOF文件。
工做原理以下:
咱們能夠經過配置設置日誌重寫的條件:
# Redis會記住自從上一次重寫後AOF文件的大小(若是自Redis啓動後還沒重寫過,則記住啓動時使用的AOF文件的大小)。 # 若是當前的文件大小比起記住的那個大小超過指定的百分比,則會觸發重寫。 # 同時須要設置一個文件大小最小值,只有大於這個值文件纔會重寫,以防文件很小,可是已經達到百分比的狀況。 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
要禁用自動的日誌重寫功能,咱們能夠把百分比設置爲0:
auto-aof-rewrite-percentage 0
Redis 2.4以上才能夠自動進行日誌重寫,以前的版本須要手動運行BGREWRITEAOF這個命令。
數據損壞修復
若是由於某些緣由(例如服務器崩潰)AOF文件損壞了,致使Redis加載不了,能夠經過如下方式進行修復:
使用redis-check-aof
命令修復原始的AOF文件:
$ redis-check-aof --fix
diff -u
命令看下兩個文件的差別。從RDB切換到AOF
這裏只說Redis >= 2.2版本的方式:
dump.rdb
的文件,並把備份文件放在一個安全的地方。運行如下兩條命令:
$ redis-cli config set appendonly yes $ redis-cli config set save ""
確保數據跟切換前一致。
第二條命令是用來禁用RDB的持久化方式,可是這不是必須的,由於你能夠同時啓用兩種持久化方式。
記得對配置文件
redis.conf
進行編輯啓用AOF,由於命令行方式修改配置在重啓Redis後就會失效。
Redis 配置文件默認狀況下是開啓 rdb模式的寫入磁盤備份的.
1.默認開啓的狀況下是使用Master傳輸rdb文件到slave進行主從同步。
2.禁用rdb和aof模式在不生成rdb文件的狀況下也能夠實現主從同步,前提是master,slave服務器都在運行中的時候,這個種狀況下master只是把緩衝區中的set 操做傳輸到slave端,slave端再執行set命令實現主從同步。
3.當禁用master,slave rdb模式的狀況下,shutdown slave 端,再重啓時,會去鏈接master端同步數據,master端會生成dump.rdb文件,而後傳給slave端,salve端同時也會生成dump.rdb文件。
總結:master,slvae端能夠在配置文件中能夠禁用rdb模式,這時數據只存在內存中。當slave 端重起時,會鏈接master端,maser端會把內存中數據生成到dump.rdb文件,而後把rdb文件和緩衝區中的set命令而後傳給slave,slave也會生成dump.rdb文件。若是master服務先掛了,那麼就是災難性的了。由於這個時候master端尚未dump.rdb文件,服務啓動後找不到rdb文件載入到內存中。slave端會去鏈接master端同步數據,把空數據同步回來覆蓋原先的已有數據。形成master,slvae端都沒有了緩存數據。