ok,今天我們來(lái)整理下Redis持久化這個(gè)知識(shí)點(diǎn),Redis的持久化對(duì)于分布式緩存來(lái)說(shuō)是必不可少的一個(gè)部分,試想,一個(gè)高流量的系統(tǒng)乖杠,如果突然某些原因?qū)е孪到y(tǒng)宕機(jī),那么怎么樣才能將緩存中的數(shù)據(jù)重新找回呢澄成?這時(shí)Redis的持久化就派上用場(chǎng)了滑黔。
在了解Redis持久化之前笆包,我們還是帶著問(wèn)題去學(xué)習(xí):
- Redis持久化有什么意義,為什么需要持久化
- Redis持久化的方式略荡,以及各個(gè)方式的特點(diǎn)和使用方法
- 持久化方式的區(qū)別
- 企業(yè)級(jí)的持久化方案
Redis持久化
對(duì)于生產(chǎn)數(shù)據(jù)而言,在系統(tǒng)服務(wù)的過(guò)程中歉胶,由于某些原因系統(tǒng)宕機(jī)汛兜,從而導(dǎo)致系統(tǒng)數(shù)據(jù)丟失,這絕對(duì)是一次生成事故通今,是大災(zāi)難粥谬,那么有沒(méi)有一種方法能在不影響系統(tǒng)性能的前提下,能將生產(chǎn)數(shù)據(jù)實(shí)時(shí)備份下來(lái)呢辫塌?答案肯定是有的漏策,而且Redis進(jìn)行很好的支持這個(gè)方法。
Redis通過(guò)持久化這個(gè)功能將生產(chǎn)數(shù)據(jù)有計(jì)劃臼氨、實(shí)時(shí)的保存到磁盤(pán)中掺喻,等Redis服務(wù)端重啟的時(shí)候,將數(shù)據(jù)再重新寫(xiě)入到Redis中储矩,這樣能最大限度的保證生產(chǎn)數(shù)據(jù)的完整性感耙;So,總結(jié)來(lái)說(shuō)持隧,Redis的持久化就是為了數(shù)據(jù)備份即硼,數(shù)據(jù)備份也是為了數(shù)據(jù)恢復(fù)。
Redis持久化的方式
Redis提供兩種持久化的方式:RDB和AOF屡拨,這兩種方式是可以同時(shí)使用的
RDB
RDB是Redis默認(rèn)支持的持久化方式只酥,就是當(dāng)前進(jìn)程的數(shù)據(jù)生產(chǎn)快照存入到磁盤(pán)中。RDB保存到文件中的數(shù)據(jù)是二進(jìn)制數(shù)據(jù)流呀狼,RDB提供配置固定的時(shí)間間隔對(duì)數(shù)據(jù)進(jìn)行快照存儲(chǔ)裂允。
## RDB主要涉及redis.conf下的幾個(gè)配置項(xiàng)
## 1.持久化時(shí)間間隔設(shè)置,多條配置只要有一條滿足就會(huì)執(zhí)行持久化操作
## 每900秒鐘里redis數(shù)據(jù)庫(kù)有1條數(shù)據(jù)被修改則觸發(fā)RDB
save 900 1
## 每300秒鐘里redis數(shù)據(jù)庫(kù)有10條數(shù)據(jù)被修改則觸發(fā)RDB
save 300 10
## 每60秒鐘里redis數(shù)據(jù)庫(kù)有10000條數(shù)據(jù)被修改則觸發(fā)RDB
save 60 10000
## 持久化文件名稱(chēng)
dbfilename "dump.rdb"
## 持久化數(shù)據(jù)文件保存路徑赠潦,默認(rèn)是/usr/local/redis-5.0.5/src下叫胖,實(shí)際生產(chǎn)過(guò)程中需要配置其他的目錄下
dir ./
這里有必要說(shuō)明下RDB的原理:
Redis在觸發(fā)持久化后,會(huì)fork一個(gè)子進(jìn)程她奥,此時(shí)父進(jìn)程和子進(jìn)程同在
子進(jìn)程將目前Redis進(jìn)程的全部數(shù)據(jù)寫(xiě)入到一個(gè)臨時(shí)文件RDB中
當(dāng)子進(jìn)程完成對(duì)新RDB文件的寫(xiě)入時(shí)瓮增,Redis用新的RDB的文件覆蓋舊的RDB文件
- 觸發(fā)RDB機(jī)制有兩種:手動(dòng)觸發(fā)和自動(dòng)觸發(fā)
- 手動(dòng)觸發(fā):通過(guò)命令來(lái)觸發(fā)持久化
- 直接輸入save命令就可以持久化,也可以查看通過(guò)命令查看當(dāng)前的持久化方式:
- bgsave:使用該命令Redis會(huì)fork一個(gè)子進(jìn)程來(lái)負(fù)責(zé)RDB的持久化哩俭,完成持久化后自動(dòng)結(jié)束子進(jìn)程绷跑,相當(dāng)于異步的,所以阻塞只發(fā)生在fork的階段
## 查看redis持久化配置
CONFIG GET save
## 修改redis持久化配置
CONFIG SET save "60 10000"
注意:一般不使用save方法來(lái)持久化凡资,我們知道Redis是單線程的砸捏,所以一旦執(zhí)行save命令谬运,則Redis就會(huì)調(diào)用主進(jìn)程來(lái)執(zhí)行內(nèi)存數(shù)據(jù)持久化到文件中,這里為什么使用主進(jìn)程垦藏,主要是后面介紹的bgsave正好相反梆暖,主進(jìn)程被調(diào)用,則會(huì)阻塞進(jìn)程掂骏,特別是數(shù)據(jù)量特別大的時(shí)候更是如此轰驳。
- 自動(dòng)觸發(fā):自動(dòng)觸發(fā)是在redis.conf中配置持久化的策略來(lái)生效的,其實(shí)默認(rèn)調(diào)用的也是命令機(jī)制里的bgsave機(jī)
- RDB持久化的優(yōu)點(diǎn):
- RDB會(huì)生成一個(gè)數(shù)據(jù)文件弟灼,這個(gè)數(shù)據(jù)文件都代表某個(gè)特定時(shí)間段的文件级解,可以在linux服務(wù)其中采用定時(shí)備份的機(jī)制來(lái)實(shí)現(xiàn)數(shù)據(jù)的冷備。
- RDB通過(guò)bgsave來(lái)執(zhí)行持久化對(duì)Redis的對(duì)外服務(wù)影響比較小田绑,因?yàn)槭峭ㄟ^(guò)fork一個(gè)子進(jìn)程來(lái)實(shí)現(xiàn)數(shù)據(jù)的持久化勤哗,所以對(duì)主進(jìn)程的影響就比較小了,這也是為什么Redis默認(rèn)提供RDB的持久化方式
- 相對(duì)于AOF的持久化機(jī)制來(lái)說(shuō)掩驱,直接一句RDB來(lái)持久化的數(shù)據(jù)來(lái)重啟和恢復(fù)Redis數(shù)據(jù)的速度更快
- RDB持久化的缺點(diǎn):
- RDB持久化是基于時(shí)間間隔的機(jī)制的芒划,也就意味著,如果Redis突然暫停服務(wù)了昙篙,則數(shù)據(jù)的丟失程度比較大腊状,比如在企業(yè)生產(chǎn)過(guò)程中一般按照五分鐘一次的持久化數(shù)據(jù)(這個(gè)按照不同的業(yè)務(wù)需求來(lái)配置持久化的時(shí)間間隔),如果一旦Redis服務(wù)宕機(jī)苔可,則會(huì)丟失5分鐘的數(shù)據(jù)
- RDB每次在fork子進(jìn)程缴挖,每次持久化的是當(dāng)前Redis中的全部的數(shù)據(jù),如果當(dāng)數(shù)據(jù)量比較大的時(shí)候焚辅,可能會(huì)導(dǎo)致對(duì)客戶(hù)端數(shù)提供的服務(wù)暫停數(shù)毫秒甚至是數(shù)秒
AOF
AOF持久化就是以獨(dú)立的日志來(lái)記錄每次的寫(xiě)命令映屋,然后Redis重啟的時(shí)候 ,重新執(zhí)行AOF的命令來(lái)完成Redis數(shù)據(jù)的恢復(fù)同蜻,這里的日志記錄是每次的寫(xiě)命令而不是二進(jìn)制數(shù)據(jù)流
這里有必要說(shuō)明下AOF的實(shí)現(xiàn)原理:
所有的命令都會(huì)被追加到aof_buf這個(gè)緩沖區(qū)中
接著AOF緩沖區(qū)根據(jù)對(duì)應(yīng)的同步策略想磁盤(pán)中做同步操作棚点,此處的同步策略可以通過(guò)redis.conf中的appendfsync進(jìn)行配置
隨著AOF文件變大,可以通過(guò)rewrite機(jī)制來(lái)壓縮Redis中的數(shù)據(jù)
Redis服務(wù)器重啟會(huì)加載AOF文件用來(lái)恢復(fù)數(shù)據(jù)
- AOF必須手動(dòng)開(kāi)啟湾蔓,在redis.conf中設(shè)置如下參數(shù)
## 開(kāi)啟AOF持久化瘫析,默認(rèn)關(guān)閉
appendonly yes
## AOF文件名稱(chēng)(默認(rèn))
appendfilename "appendonly.aof"
## AOF持久化策略 有三個(gè)值 always、everysec和no 默認(rèn)是everysec 建議設(shè)置成everysec
appendfsync everysec
## AOF自動(dòng)重寫(xiě)的文件大小跟上一次重寫(xiě)的文件的百分比
auto-aof-rewrite-percentage 100
## AOF自動(dòng)重寫(xiě)的文件的最小值
auto-aof-rewrite-min-size 64mb
其中appendfsync
的配置如下:
可配置的值 | 配置說(shuō)明 |
---|---|
always | 服務(wù)器會(huì)在每執(zhí)行一個(gè)事件就把AOF緩沖區(qū)的內(nèi)容強(qiáng)制性的寫(xiě)入硬盤(pán)上的AOF文件里默责, 可以看成你每執(zhí)行一個(gè)redis寫(xiě)入命令就往AOF文件里記錄這條命令贬循, 這保證了數(shù)據(jù)持久化的完整性,但效率是最慢的桃序,卻也是最安全的 |
everysec | 服務(wù)端每執(zhí)行一次寫(xiě)操作(如set杖虾、sadd、rpush)也會(huì)把該條命令追加到一個(gè)單獨(dú)的AOF緩沖區(qū)的末尾媒熊, 并將AOF緩沖區(qū)寫(xiě)入AOF文件奇适,然后每隔一秒才會(huì)進(jìn)行一次文件同步把內(nèi)存緩沖區(qū)里的AOF緩存數(shù)據(jù)真正 寫(xiě)入AOF文件里坟比,這個(gè)模式兼顧了效率的同時(shí)也保證了數(shù)據(jù)的完整性, 即使在服務(wù)器宕機(jī)也只會(huì)丟失一秒內(nèi)對(duì)redis數(shù)據(jù)庫(kù)做的修改 |
no | redis數(shù)據(jù)庫(kù)里的數(shù)據(jù)就算丟失你也可以接受嚷往, 它也會(huì)把每條寫(xiě)命令追加到AOF緩沖區(qū)的末尾葛账,然后寫(xiě)入文件, 但什么時(shí)候進(jìn)行文件同步真正把數(shù)據(jù)寫(xiě)入AOF文件里則由系統(tǒng)自身決定皮仁, 即當(dāng)內(nèi)存緩沖區(qū)的空間被填滿或者是超過(guò)了設(shè)定的時(shí)限后系統(tǒng)自動(dòng)同步注竿。 這種模式下效率是最快的,但對(duì)數(shù)據(jù)來(lái)說(shuō)也是最不安全的 |
- AOF的優(yōu)點(diǎn)
- 通過(guò)配置同步策略就能實(shí)現(xiàn)實(shí)時(shí)持久化數(shù)據(jù)魂贬,可以同時(shí)兼顧性能和數(shù)據(jù)安全
- AOF只進(jìn)行文件追加操作,并且redis官方提供redis-check-aof修復(fù)命令裙顽,這樣當(dāng)系統(tǒng)突然宕機(jī)付燥,寫(xiě)入命令不完整時(shí),可以修復(fù)數(shù)據(jù)愈犹,最大程度的保證數(shù)據(jù)的完整性
- AOF是有序的將寫(xiě)入的命令保存起來(lái)键科,數(shù)據(jù)文件可以清晰的讀懂,對(duì)于數(shù)據(jù)分析對(duì)比來(lái)說(shuō)比較有優(yōu)勢(shì)
- AOF日志文件以append-only模式寫(xiě)入漩怎,所以沒(méi)有任何磁盤(pán)尋址的開(kāi)銷(xiāo)勋颖,寫(xiě)入性能非常高
- AOF的缺點(diǎn)
- 相對(duì)于RDB來(lái)說(shuō),AOF的文件通常比較大
- AOF恢復(fù)數(shù)據(jù)的速度比RDB的要慢
- AOF開(kāi)啟后勋锤,支持的寫(xiě)QPS會(huì)比RDB支持的寫(xiě)QPS低饭玲,因?yàn)锳OF一般會(huì)配置成每秒fsync一次日志文件,當(dāng)然叁执,每秒一次fsync茄厘,性能也還是很高的
Redis持久化操作
我們通過(guò)上面的redis.conf配置文件的修改,開(kāi)啟RDB和AOF持久化的機(jī)制谈宛,然后再Redis中設(shè)置好對(duì)應(yīng)的鍵值
為了測(cè)試RDB的持久化效果次哈,我們可以設(shè)置1秒內(nèi)有1條數(shù)據(jù)變化就執(zhí)行RDB持久化
首先添加數(shù)據(jù)
查看是否生成備份文件
查看AOF的備份數(shù)據(jù)文件
查看RDB的備份數(shù)據(jù)文件
RDB和AOF的區(qū)別
比較項(xiàng) | RDB | AOF |
---|---|---|
文件大小 | 小 | 大 |
備份頻率 | 低 | 高 |
數(shù)據(jù)恢復(fù)速度 | 快 | 慢 |
寫(xiě)QPS | 高 | 低 |
支持重寫(xiě) | 否 | 是 |
Redis企業(yè)級(jí)數(shù)據(jù)持久化
- 不要僅僅使用RDB,因?yàn)槟菢訒?huì)導(dǎo)致你丟失很多數(shù)據(jù)
- 也不要僅僅使用AOF吆录,因?yàn)槟菢佑袃蓚€(gè)問(wèn)題窑滞,第一,你通過(guò)AOF做冷備恢筝,沒(méi)有RDB做冷備哀卫,來(lái)的恢復(fù)速度更快; 第二,RDB每次簡(jiǎn)單粗暴生成數(shù)據(jù)快照滋恬,更加健壯聊训,可以避免AOF這種復(fù)雜的備份和恢復(fù)機(jī)制的bug
- 綜合使用AOF和RDB兩種持久化機(jī)制,用AOF來(lái)保證數(shù)據(jù)不丟失恢氯,作為數(shù)據(jù)恢復(fù)的第一選擇; 用RDB來(lái)做不同程度的冷備带斑,在AOF文件都丟失或損壞不可用的時(shí)候鼓寺,還可以使用RDB來(lái)進(jìn)行快速的數(shù)據(jù)恢復(fù)
AOF的重寫(xiě)機(jī)制
AOF重寫(xiě)的原理:
- 先是將當(dāng)前Redis數(shù)據(jù)庫(kù)中的數(shù)據(jù)讀取出來(lái),然后fork一個(gè)子進(jìn)程勋磕,子進(jìn)程會(huì)攜帶主進(jìn)程的數(shù)據(jù)(數(shù)據(jù)為主進(jìn)程上的所有的數(shù)據(jù))副本將數(shù)據(jù)寫(xiě)入到新的AOF備份數(shù)據(jù)文件妈候。
- 對(duì)于新執(zhí)行的寫(xiě)入命令,主進(jìn)程會(huì)將其寫(xiě)入到一個(gè)緩存中挂滓,一邊將改動(dòng)追加到現(xiàn)有的AOF文件中苦银,這個(gè)緩存在fork出子進(jìn)程之后開(kāi)始啟用
- 當(dāng)子進(jìn)程完成重寫(xiě)工作時(shí),他會(huì)給主進(jìn)程發(fā)送一個(gè)信號(hào)赶站,主進(jìn)程收到這個(gè)信號(hào)后幔虏,會(huì)將緩存中的所有的數(shù)據(jù)寫(xiě)入到新的AOF文件中,同時(shí)將該AOF文件重新替換原有的AOF文件
流程圖表示