redis 持久化 RDB + AOF
1.redis持久化----兩種方式
RDB(Redis DataBase)和AOF(Append Only File)
RDB,簡而言之,就是在不同的時(shí)間點(diǎn),將redis存儲(chǔ)的數(shù)據(jù)生成快照并存儲(chǔ)到磁盤等介質(zhì)上
AOF,那就是將redis執(zhí)行過的所有寫指令記錄下來,在下次redis重新啟動(dòng)時(shí),只要把這些寫指令從前到后再重復(fù)執(zhí)行一遍,就可以實(shí)現(xiàn)數(shù)據(jù)恢復(fù)了。
RDB + AOF 如果redis重啟的話,則會(huì)優(yōu)先采用AOF方式來進(jìn)行數(shù)據(jù)恢復(fù),這是因?yàn)锳OF方式的數(shù)據(jù)恢復(fù)完整度更高。
2.RDB快照(Redis DataBase snapshot)
在默認(rèn)情況下,Redis 將內(nèi)存數(shù)據(jù)庫快照保存在名字為 dump.rdb 的二進(jìn)制文件中。你可以對 Redis 進(jìn)行設(shè)置, 讓它在“下秒內(nèi)數(shù)據(jù)集至少有M個(gè)改動(dòng)”這一條件被滿足時(shí),自動(dòng)保存一次數(shù)據(jù)集。比如說,以下設(shè)置會(huì)讓 Redis 在滿足“60 秒內(nèi)有至少有 1000 個(gè)鍵被改動(dòng)”這一條件時(shí),自動(dòng)保存一次數(shù)據(jù)集:
# save 60 1000 //關(guān)閉RDB只需要將所有的save保存策略注釋掉即可 save會(huì)阻塞其他命令
還可以手動(dòng)執(zhí)行命令生成RDB快照,進(jìn)入redis客戶端執(zhí)行命令save或bgsave可以生成dump.rdb文件,每次命令執(zhí)行都會(huì)將所有redis內(nèi)存快照到一個(gè)新的rdb文件里,并覆蓋原有rdb快照文件。
2.1bgsave的寫時(shí)復(fù)制(COW)機(jī)制
Redis 借助操作系統(tǒng)提供的寫時(shí)復(fù)制技術(shù) (Copy-0n-Wite,COW),在生成快照的同時(shí),依然可以正常處理寫命令。簡單來說ogsave 子進(jìn)程是由主線程 fok 生成的,可以共享主線程的所有內(nèi)存數(shù)據(jù)。bgsave 子進(jìn)程運(yùn)行后,開始讀取主線程的內(nèi)存數(shù)據(jù),并把它們寫入 RDB 文件。此時(shí),如果主線程對這些數(shù)據(jù)也都是讀操作,那么,主線程和 basave 子進(jìn)程相互不影響。但是,如果主線程要修改塊數(shù)據(jù),那么,這塊數(shù)據(jù)就會(huì)被復(fù)制一份,生成該數(shù)據(jù)的副本,然后,bgsave 子進(jìn)程會(huì)把這個(gè)副本數(shù)據(jù)寫入 RDB 文件,而在這個(gè)過程中,主線程仍然可以直接修改原來的數(shù)據(jù)
Save 會(huì)阻塞redis的其他命令,bgsave 不會(huì)阻塞會(huì)在一段時(shí)間內(nèi)完成對redis的內(nèi)容的復(fù)制,在這段時(shí)間內(nèi)也會(huì)有redis的命令會(huì)同步到這個(gè)RDB文件當(dāng)中
2.2 RDB的會(huì)出現(xiàn)的問題
2.2.1 sava和bgsave會(huì)出現(xiàn)的問題
Save 會(huì)阻塞redis的其他命令,bgsave 不會(huì)阻塞會(huì)在一段時(shí)間內(nèi)完成對redis的內(nèi)容的復(fù)制,在這段時(shí)間內(nèi)也會(huì)有redis的命令會(huì)同步到這個(gè)RDB文件當(dāng)中
2.2.2 save 會(huì)出現(xiàn)的問題
save 是在間隔一點(diǎn)時(shí)間的某個(gè)時(shí)間點(diǎn)、每n次操作,去記錄redis的全部數(shù)據(jù),但是在這段時(shí)間內(nèi)某個(gè)數(shù)據(jù)可能已經(jīng)唄修改過很多次,如果redis宕機(jī) 也會(huì)丟失文件,AOF可以解決這個(gè)問題
開啟appendonly yes 記錄每次redis操作的命令
appendfsync always: 每次有新命令追加到 AOF 文件時(shí)就執(zhí)行一次 fsync ,非常慢,也非常安全 「對redis性能有很大影響」
appendfsync everysec:(默認(rèn))每秒 fsync 一次,足夠快,并且在故障時(shí)只會(huì)丟失 1 秒鐘的數(shù)據(jù)。
appendfsync no: 從不 fsync ,將數(shù)據(jù)交給操作系統(tǒng)來處理。更快,也更不安全的選擇。
執(zhí)行的命令 set lakers KB
*3 //三個(gè)參數(shù)
$3 //第一個(gè)參數(shù)的長度3
set //第一個(gè)參數(shù)的值
$6
lakers
$2
KB
AOF中有很多的文件沒有實(shí)際的被存儲(chǔ)的價(jià)值,比如累加等命令,AOF中會(huì)記錄n條記錄,實(shí)際上在回復(fù)的時(shí)候只需要set 為n 一條命令就可以恢復(fù),于是提出了AOF重寫的優(yōu)化
# auto-aof-rewrite-min-size 64mb //aof文件至少要達(dá)到64M才會(huì)自動(dòng)重寫,文件太小恢復(fù)速度本來就很快,重寫的意義不大
# auto-aof-rewrite-percentage 100 //aof文件自上一次重寫后文件大小增長了100%則再次觸發(fā)重寫
達(dá)到64mb會(huì)優(yōu)化一次,對AOF的命令進(jìn)行重寫,減少?zèng)]有必要的命令
redisRDB和AOF都可以開啟,當(dāng)redis宕機(jī)的時(shí)候redis默認(rèn)使用AOF回復(fù)數(shù)據(jù),因?yàn)锳OF數(shù)據(jù)會(huì)更安全一點(diǎn)
3.Redis 4.0 混合持久化
重啟Redis時(shí),我們很少使用RDB來恢復(fù)內(nèi)存狀態(tài),因?yàn)闀?huì)丟失大量數(shù)據(jù)。我們通常使用AOF 日志重放,但是重放 AOF日志性能相對RDB來說要慢很多,這樣在Redis實(shí)例很大的情況下,啟動(dòng)需要花費(fèi)很長的時(shí)間。Redis4.0為了解決這個(gè)問題,帶來了一個(gè)新的持久化選項(xiàng)–混合持久化。
通過如下配置可以開啟混合持久化(必須先開啟aof):
aof-use-rdb-preamble yes
如果開啟了混合持久化,AOF在重寫時(shí),不再是單純將內(nèi)存數(shù)據(jù)轉(zhuǎn)技換為RESP命令寫入AOF文件,而是將重寫這一刻之前的內(nèi)存做RDB快照處理,并且將RDB快照內(nèi)容和增量的AOF修改內(nèi)存數(shù)據(jù)的命令有存在一起,都寫入新的AOF文件,新的文件一開始不叫 appendonlyaof,等到重寫完新的AOF文件才會(huì)進(jìn)行改名,覆蓋原有的AOF文件,完成新舊兩個(gè)AOF文件的替換。
于是在Redis重啟的時(shí)候,可以先加載RDB的內(nèi)容,然后再重放增量AOF日志就可以完全替代之前的AOF全量文件重放,因此重啟效率大幅得到提升。
混合持久化AOF文件結(jié)構(gòu)如下
每AOF重寫一次就會(huì)將AOF文件轉(zhuǎn)化為RDB文件
混合持久化必須開啟AOF可以關(guān)掉RDB,實(shí)質(zhì)是使用AOF方式在重寫的過程中將之前的AOF文件優(yōu)化成RDB
4.redis文件恢復(fù)
只要啟動(dòng)的時(shí)候存儲(chǔ)數(shù)據(jù)的aof文件或者rdb文件存在就可以主動(dòng)的恢復(fù)redis
4.1Redis數(shù)據(jù)備份策略:
1.寫crontab定時(shí)調(diào)度腳本,每小時(shí)都copy一份rdb或aof的備份到一個(gè)目錄中去,僅僅保留最近48小時(shí)的備份文章來源:http://www.zghlxwxcb.cn/news/detail-436843.html
2.每天都保留一份當(dāng)日的數(shù)據(jù)備份到一個(gè)目錄中去,可以保留最近1個(gè)月的備份
3.每次copy備份的時(shí)候,都把太舊的備份給刪了
4.每天晚上將當(dāng)前機(jī)器上的備份復(fù)制一份到其他機(jī)器上,以防機(jī)器損壞文章來源地址http://www.zghlxwxcb.cn/news/detail-436843.html
到了這里,關(guān)于redis 持久化 RDB + AOF的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!