3.redis持久化策略

1.持久化概念:

redis支持 將內(nèi)存中的數(shù)據(jù)持久化到磁盤中,在下次啟動(dòng)redis時(shí)可以將磁盤中的數(shù)據(jù)加載到內(nèi)存中

2.持久化通用的兩種方式:

  • 快照(某一時(shí)刻對(duì)數(shù)據(jù)的備份)
    例如:mmysql dump redis RDB
  • 記錄日志()
    例如:Mysql binlog Hbase Hlog redis AOF

3.redis持久化之 RDB(redis database)

①RDB概念:

這里寫圖片描述

②觸發(fā)機(jī)制-主要三種方式:
(1) save(同步)
(2)bgsave(異步)
(3)自動(dòng)(符合配置文件中 save滿足條件)

image.png

save與bgsave

\命令 save bgsave
IO類型 同步 異步
阻塞 否(阻塞僅僅會(huì)發(fā)生在fork出子進(jìn)程)
復(fù)雜度 O(n) O(n)
優(yōu)點(diǎn) 不消耗額外內(nèi)存 不阻塞客戶端命令

自動(dòng)生成RDB

save <seconds> <changes>
save 900 1
save 300 10
save 60 10000

釋義:
60秒改變10000次,會(huì)采用bgsave方式生成RDB文件
300秒改變10次,會(huì)自動(dòng)生成RDB文件

③RDB配置相關(guān)

# 每多少秒 數(shù)據(jù)改變幾次 
# 滿足下面任一條件進(jìn)行RDB文件生成
#如果線上環(huán)境數(shù)據(jù)量很大時(shí),可以關(guān)閉RDB持久化方式 只需要注釋下面三個(gè)save即可
save 900 1
save 300 10
save 60 10000
#bgsave生成RDB文件出錯(cuò)時(shí)是否停止
stop-writes-on-bgsave-error yes
#RDB文件是否采用壓縮
rdbcompression yes
#是否對(duì)rdb文件校驗(yàn)和校驗(yàn)
#redis 5之后采用CRC64校驗(yàn)方式
rdbchecksum yes
# rdb文件名字
#  目錄位置 采用 dir設(shè)置
dbfilename dump-6379.rdb
#指定目錄路徑非文件名
# rdb文件aof文件均采用此目錄
dir ./

④可能忽略RDB觸發(fā)機(jī)制
(1)全量復(fù)制
從節(jié)點(diǎn)執(zhí)行全量復(fù)制操作的時(shí)候,主節(jié)點(diǎn)會(huì)自動(dòng)觸發(fā)bgsave命令生存rdb文件并發(fā)送給從節(jié)點(diǎn)
(2)debug reload
Redis中的debug reload提供debug級(jí)別的重啟,不清空內(nèi)存的一種重啟,這種方式也會(huì)觸發(fā)RDB文件的生成。

image.png

(3)shutdown

RDB存在問(wèn)題:
① 耗時(shí)、耗性能

復(fù)雜度為o(n),save時(shí)內(nèi)存數(shù)據(jù)dump到磁盤:耗時(shí)
bgsave時(shí),fork()階段采用copy-on-write策略,會(huì)比較耗內(nèi)存
dump到文件造成io開銷
②不可控,丟失數(shù)據(jù)

時(shí)間戳 save、bgsave
T1 執(zhí)行多個(gè)命令
T2 滿足RDB自動(dòng)創(chuàng)建條件
T3 再次執(zhí)行多個(gè)命令
T4 宕機(jī)

在T4時(shí)刻redis出現(xiàn)宕機(jī),會(huì)導(dǎo)致T3-T4時(shí)刻的數(shù)據(jù)丟失
如何解決? 請(qǐng)看下一節(jié)AOF持久化方式吧

4.redis持久化之AOF(Append-only file)

client每次請(qǐng)求redis,都會(huì)將寫請(qǐng)求的命令保存到文件中,

①AOF三種策略

aof三種策略

① always
只要緩沖區(qū)有數(shù)據(jù) 立馬寫入文件中
②everysec
每隔一秒將數(shù)據(jù)從緩沖區(qū)寫入文件中
③no
寫文件的操作交由操作系統(tǒng)控制
AOF三種策略比較

命令 always everysec no
優(yōu)點(diǎn) 不丟失數(shù)據(jù) 每秒一次fsync只丟失1秒數(shù)據(jù) 交由操作系統(tǒng)fsync,不用管
缺點(diǎn) 磁盤開銷較大,一般sata磁盤一秒只有幾百TPS 丟失1秒數(shù)據(jù) 交由操作系統(tǒng)fsync,不可控

總結(jié):
是業(yè)務(wù)情況,場(chǎng)景而定,一般可以使用everysec,在磁盤開銷及數(shù)據(jù)丟失情況取個(gè)折中

aof相關(guān)配置

#是否啟用AOF持久化方式
appendonly no
#AOF文件名
#目錄受Dir控制
appendfilename "appendonly-6379.aof"
#AOF持久化策略
#默認(rèn)值 everysec
# 有三種 no everysec always
#no        寫文件的操作交由操作系統(tǒng)控制
#always    只要緩沖區(qū)有數(shù)據(jù) 立馬寫入文件中
#everysec  每隔一秒將數(shù)據(jù)從緩沖區(qū)寫入文件中
appendfsync everysec
#aof重寫期間主進(jìn)程是否繼續(xù)講日志從緩沖區(qū)刷新到舊日志文件(上圖aof_buf-<舊aof文件)
no-appendfsync-on-rewrite no

#以下兩個(gè)配置同時(shí)滿足即可觸發(fā)AOF重寫
#文件增長(zhǎng)率
auto-aof-rewrite-percentage 100
#aof重寫需要的文件
auto-aof-rewrite-min-size 64mb

②AOF重寫
引入原因:
隨著數(shù)據(jù)的不斷寫入,會(huì)造成AOF文件不斷增大,重復(fù)的命令會(huì)額外占用磁盤空間,而是增加redis重啟速度
AOF重寫定義:

AOF重寫

AOF文件重寫不是對(duì)原有AOF文件進(jìn)行讀取分析,而是讀取最新的數(shù)據(jù)進(jìn)行分析實(shí)現(xiàn)的。

AOF重寫作用:
1.減少磁盤占用量
2.加速啟動(dòng)速度
AOF重寫觸發(fā)機(jī)制
1.bgrewriteaof

bgrewriteaof

2.AOF重寫配置(同時(shí)滿足配置文件中auto-aof-rewrite-percentage auto-aof-rewrite-min-size兩個(gè)配置)
bgwriteaof命令

這里寫圖片描述

AOF重寫流程

這里寫圖片描述

注:
aof_rewrite是在子進(jìn)程執(zhí)行,子進(jìn)程帶有主進(jìn)程數(shù)據(jù)副本,不會(huì)阻塞客戶端請(qǐng)求
子進(jìn)程在AOF重寫期間,主進(jìn)程依然需要會(huì)記錄數(shù)據(jù)變化日志,就會(huì)出現(xiàn)當(dāng)前數(shù)據(jù)與AOF重寫之后的數(shù)據(jù)不一致
解決方案:
redis增加了一個(gè)aof_rewrite_buf(aof重寫緩沖區(qū)),當(dāng)主進(jìn)程fork出子進(jìn)程后開始啟用,此時(shí)主進(jìn)程需要將日志同時(shí)記錄到aof_buf(aof緩沖區(qū))與aof_ewrite_aof(aof重寫緩沖區(qū)),當(dāng)子進(jìn)程重寫完數(shù)據(jù)后給主進(jìn)程發(fā)送信號(hào),此時(shí) 主進(jìn)程通過(guò)信號(hào)處理函數(shù)將aof_rewrite_buf數(shù)據(jù)追加到新aof文件后,替換舊aof文件

5.混合持久化

重啟 Redis 時(shí),我們很少使用 rdb 來(lái)恢復(fù)內(nèi)存狀態(tài),因?yàn)闀?huì)丟失大量數(shù)據(jù)。我們通常使用 AOF 日志重放,但是重放 AOF 日志性能相對(duì) rdb 來(lái)說(shuō)要慢很多,這樣在 Redis 實(shí)例很大的情況下,啟動(dòng)需要花費(fèi)很長(zhǎng)的時(shí)間。 Redis 4.0 為了解決這個(gè)問(wèn)題,帶來(lái)了一個(gè)新的持久化選項(xiàng)——混合持久化。AOF在重寫(aof文件里可能有太多沒(méi)用指令,所以aof會(huì)定期根據(jù)內(nèi)存的最新數(shù)據(jù)生成aof文件)時(shí)將重寫這一刻之前的內(nèi)存rdb快照文件的內(nèi)容和增量的 AOF修改內(nèi)存數(shù)據(jù)的命令日志文件存在一起,都寫入新的aof文件,新的文件一開始不叫appendonly.aof,等到重寫完新的AOF文件才會(huì)進(jìn)行改名,原子的覆蓋原有的AOF文件,完成新舊兩個(gè)AOF文件的替換;
AOF根據(jù)配置規(guī)則在后臺(tái)自動(dòng)重寫,也可以人為執(zhí)行命令bgrewriteaof重寫AOF。 于是在 Redis 重啟的時(shí)候,可以先加載 rdb 的內(nèi)容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重啟效率因此大幅得到提升。
相關(guān)配置:

#redis 4.0引入
# 是否開啟混合持久化
aof-use-rdb-preamble yes

6.總結(jié)

①redis存在AOF與RDB兩種持久化方式
如果redis宕機(jī)或重啟時(shí)想要恢復(fù)數(shù)據(jù),會(huì)優(yōu)先采用哪種方式恢復(fù)數(shù)據(jù)呢?
AOF與RDB同時(shí)開啟時(shí),會(huì)優(yōu)先使用AOF恢復(fù)數(shù)據(jù),如果采用RDB恢復(fù)數(shù)據(jù),可以先將AOF關(guān)閉,appendonly no,重啟完成后,執(zhí)行config set appendonly yes動(dòng)態(tài)開啟AOF

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從這篇文章開始,將依次介紹Redis高可用相關(guān)的知識(shí)——持久化、復(fù)制(及讀寫分離)、哨兵、以及集群。 本文將先說(shuō)明...
    不變甄心閱讀 737評(píng)論 0 4
  • 前言 在上一篇文章中,介紹了Redis內(nèi)存模型,從這篇文章開始,將依次介紹Redis高可用相關(guān)的知識(shí)——持久化、復(fù)...
    Java架構(gòu)閱讀 2,503評(píng)論 3 21
  • 一、Redis高可用概述 在介紹Redis高可用之前,先說(shuō)明一下在Redis的語(yǔ)境中高可用的含義。 我們知道,在w...
    空語(yǔ)閱讀 1,681評(píng)論 0 2
  • 企業(yè)級(jí)redis集群架構(gòu)的特點(diǎn) 海量數(shù)據(jù) 高并發(fā) 高可用 要達(dá)到高可用,持久化是不可減少的,持久化主要是做災(zāi)難恢復(fù)...
    lucode閱讀 2,283評(píng)論 0 7
  • 李莉是一個(gè)插畫師,從十八歲開始就為許多雜志畫插畫,她的畫洋溢著青春與活力。 可隨著時(shí)間流逝,李莉已到了結(jié)婚的年齡,...
    余子妍閱讀 326評(píng)論 1 0

友情鏈接更多精彩內(nèi)容