Redis(2)---数据持久化
數(shù)據(jù)持久化
Redis有兩種持久化的方式:快照(RDB文件)和追加式文件(AOF文件)
? ? (1)RDB持久化方式是在一個特定的間隔保存某個時間點的一個數(shù)據(jù)快照。(默認模式)
? ? (2)以日志的形式來記錄每個寫操作,將Redis執(zhí)行過的所有寫指令記錄下來(讀操作不記錄),只許追加文件但不可以改寫文件,redis啟動之初會讀取該文件重新構(gòu)建數(shù)據(jù),換言之,redis重啟的話就根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作 。
注意:Redis的持久化是可以禁用的,兩種方式的持久化是可以同時存在的,但是當Redis重啟時,AOF文件會被優(yōu)先用于重建數(shù)據(jù)。
? ?
一、RDB
1、是什么?
? ? ? ? ? ?在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,也就是行話講的Snapshot快照,它恢復(fù)時是將快照文件直接讀到內(nèi)存里。
? ? Redis會單獨創(chuàng)建(fork)一個子進程來進行持久化,會先將數(shù)據(jù)寫入到一個臨時文件中,待持久化過程都結(jié)束了,再用這個臨時文件替換上次持久化好的文件。
? ? 整個過程中,主進程是不進行任何IO操作的,這就確保了如果需要進行大規(guī)模數(shù)據(jù)的恢復(fù)時還能有極高的性能。
2.文件路徑和名稱
默認Redis會把快照文件存儲為當前目錄下一個名為dump.rdb的文件。要修改文件的存儲路徑和名稱,可以通過修改配置文件redis.conf實現(xiàn):
# RDB文件名,默認為dump.rdb。 dbfilename dump.rdb# 文件存放的目錄,AOF文件同樣存放在此目錄下。默認為當前工作目錄。 dir ./3.redis.conf如何配置
保存點可以設(shè)置多個,Redis的配置文件就默認設(shè)置了3個保存點:
# 以下配置表示的條件: # 服務(wù)器在900秒之內(nèi)被修改了1次 save 900 1 # 服務(wù)器在300秒之內(nèi)被修改了10次 save 300 10 # 服務(wù)器在60秒之內(nèi)被修改了10000次 save 60 10000#如果想禁用快照保存的功能,可以通過注釋掉所有"save"配置達到,或者在最后一條"save"配置后添加如下的配置: save ""4、如何啟動快照
有四種方式:
? (1)在配置文件中你配置保存點,而不是save "",當達到要求會進行快照。
? (2)SAVE命令:SAVE命令會使用同步的方式生成RDB快照文件,這意味著在這個過程中會阻塞所有其他客戶端的請求。因此不建議在生產(chǎn)環(huán)境使用這個命令。
? (3)BGSAVE命令:BGSAVE命令使用后臺的方式保存RDB文件,調(diào)用此命令后,會立刻返回OK返回碼。Redis會產(chǎn)生一個子進程進行處理并立刻恢復(fù)對客戶端的服務(wù)。在客戶端我們可以使用LASTSAVE命令查看操作是否成功。
? (4)執(zhí)行flushall命令,也會產(chǎn)生dump.rdb文件,但里面是空的,無意義。
? ?注意:配置文件里禁用了快照生成功能不影響SAVE和BGSAVE命令的效果。
?
二、AOF
1.AOF是什么?
? ? ? ?以日志的形式來記錄每個寫操作,將Redis執(zhí)行過的所有寫指令記錄下來(讀操作不記錄),只許追加文件但不可以改寫文件,redis啟動之初會讀取該文件重新構(gòu)建數(shù)據(jù),換言之,redis重啟的話就根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作 。
? ? ? 注意:Aof保存的是appendonly.aof文件
2、AOF啟動、修復(fù)、恢復(fù)
(1)正常啟動
? ? ? ? 修改默認的appendonly no,改為yes(因為redis默認是RDB持久化,所以這里需要在redis.conf手動開啟)
(2)如果啟動失敗,有可能是你的appendonly.aof有誤(比如因為磁盤滿了,命令只寫了一半到日志文件里,我們也可以用redis-check-aof這個工具很簡單的進行修復(fù)。)
具體做法:
? ? ?redis-check-aof --fix進行修復(fù)
3、同步策略。
它有三種同步策略:appendfsync always(每修改同步), appendfsync everysec(每秒同步), appendfsync no (不同步)
? (1)appendfsync always(每修改同步): 同步持久化 每次發(fā)生數(shù)據(jù)變更會被立即記錄到磁盤 性能較差但數(shù)據(jù)完整性比較好。
? (2)appendfsync everysec(每秒同步):異步操作,每秒記錄. 如果發(fā)生災(zāi)難,您可能會丟失1秒的數(shù)據(jù)。
? ? (3)appendfsync no (不同步):從不同步。
官方建議使用默認配置每秒同步,它既快速又安全。這個always策略在實踐中非常緩慢, 沒有辦法做得fsync比現(xiàn)在更快。
4、AOF重寫
?(1)是什么?
? ? ? AOF采用文件追加方式,文件會越來越大為避免出現(xiàn)此種情況,新增了重寫機制,當AOF文件的大小超過所設(shè)定的閾值時,Redis就會啟動AOF文件的內(nèi)容壓縮,
只保留可以恢復(fù)數(shù)據(jù)的最小指令集.
(2)重寫原理
? ? ? ?AOF文件持續(xù)增長而過大時,會fork出一條新進程來將文件重寫(也是先寫臨時文件最后再rename),遍歷新進程的內(nèi)存中數(shù)據(jù),每條記錄有一條的Set語句。重寫aof文件的操作,并沒有讀取舊的aof文件,
而是將整個內(nèi)存中的數(shù)據(jù)庫內(nèi)容用命令的方式重寫了一個新的aof文件,這點和快照有點類似。
(3)觸發(fā)機制
? ? ? ?Redis會記錄上次重寫時的AOF大小,默認配置是當AOF文件大小是上次rewrite后大小的一倍且文件大于64M時觸發(fā)(redis默認是64M進行重新一次,而實際生產(chǎn)環(huán)境這里至少要2G)
?
三、RDB和AOF優(yōu)缺點
1、RDB的優(yōu)點
(1)比起AOF,在數(shù)據(jù)量比較大的情況下,RDB的啟動速度更快。
(2)RDB文件是一個很簡潔的單文件,它保存了某個時間點的Redis數(shù)據(jù),很適合用于做備份。
(3)RDB很適合用于災(zāi)備。單文件很方便就能傳輸?shù)竭h程的服務(wù)器上。
(4)RDB的性能很好,需要進行持久化時,主進程會fork一個子進程出來,然后把持久化的工作交給子進程,自己不會有相關(guān)的I/O操作。
2、RDB缺點
(1)RDB容易造成數(shù)據(jù)的丟失。假設(shè)每5分鐘保存一次快照,如果Redis因為某些原因不能正常工作,那么從上次產(chǎn)生快照到Redis出現(xiàn)問題這段時間的數(shù)據(jù)就會丟失了。
(2)RDB使用fork()產(chǎn)生子進程進行數(shù)據(jù)的持久化,如果數(shù)據(jù)比較大的話可能就會花費點時間,造成Redis停止服務(wù)幾毫秒。
3、AOF優(yōu)點
(1)該機制可以帶來更高的數(shù)據(jù)安全性,即數(shù)據(jù)持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事實上,每秒同步也是異步完成的,其效率也是非常高的,如果發(fā)生災(zāi)難,您只可能會丟失1秒的數(shù)據(jù)。
(2)AOF日志文件是一個純追加的文件。就算服務(wù)器突然Crash,也不會出現(xiàn)日志的定位或者損壞問題。甚至如果因為某些原因(例如磁盤滿了)命令只寫了一半到日志文件里,我們也可以用redis-check-aof這個工具很簡單的進行修復(fù)。
(3)當AOF文件太大時,Redis會自動在后臺進行重寫。重寫很安全,因為重寫是在一個新的文件上進行,同時Redis會繼續(xù)往舊的文件追加數(shù)據(jù)。
4、AOF缺點
(1)在相同的數(shù)據(jù)集下,AOF文件的大小一般會比RDB文件大。
(2)在某些fsync策略下,AOF的速度會比RDB慢。通常fsync設(shè)置為每秒一次就能獲得比較高的性能,而在禁止fsync的情況下速度可以達到RDB的水平。
?
四、RDB和AOF建議
(1)官方建議:是同時開啟兩種持久化策略。因為有時需要RDB快照是進行數(shù)據(jù)庫備份,更快重啟以及發(fā)生AOF引擎錯誤的解決辦法。(換句話就是通過RDB來多備份一份數(shù)據(jù)總是好的)
(2) 因為RDB文件只用作后備用途,建議只在Slave上持久化RDB文件,而且只要15分鐘備份一次就夠了,只保留save 900 1這條規(guī)則。
(3)如果選擇AOF,只要硬盤許可,應(yīng)該盡量減少AOF rewrite的頻率。因為一是帶來了持續(xù)的IO,二是AOF rewrite的最后將rewrite過程中產(chǎn)生的新數(shù)據(jù)寫到新文件造成的阻塞幾乎是不可避免的。
? ? AOF重寫的基礎(chǔ)大小默認值64M太小了,可以設(shè)到5G以上。
?
?想太多,做太少,中間的落差就是煩惱。想沒有煩惱,要么別想,要么多做。上尉【20】
?
posted on 2018-12-20 01:06 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/10147221.html
總結(jié)
以上是生活随笔為你收集整理的Redis(2)---数据持久化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: extend 与 append 的区别
- 下一篇: Spring boot变量的初始化顺序