持久化
1.redis持久化:redis所有數(shù)據(jù)保存在內(nèi)存中殃恒,對(duì)數(shù)據(jù)的更新將異步保存到磁盤(pán)中
2.主流數(shù)據(jù)庫(kù)持久化:快照套硼;寫(xiě)日志
RDB
1.redis對(duì)當(dāng)前數(shù)據(jù)進(jìn)行快照,生成RDB文件(二進(jìn)制)保存到磁盤(pán)中讹俊,redis重啟后載入RDB文件缓待,以恢復(fù)數(shù)據(jù)
2.觸發(fā)機(jī)制
save(同步找御,會(huì)造成阻塞) O(N)
命令行直接輸入save锦秒,執(zhí)行時(shí)會(huì)生成RDB文件畦粮,執(zhí)行完畢會(huì)將老的文件替換
save
#返回OK 表示執(zhí)行成功
不會(huì)消耗額外內(nèi)存
bgsave(異步,生成子進(jìn)程操作,阻塞發(fā)成在子進(jìn)程) O(N)
命令行直接輸入bgsave
bgsave
#返回Background saving started 表示操作開(kāi)始
需要子進(jìn)程fork,需要消耗額外內(nèi)存
間接觸發(fā)機(jī)制
1.全量復(fù)制
2.debug reload
3.shutdown
自動(dòng)生成策略
900s內(nèi)有1條數(shù)據(jù)變化
300s內(nèi)有10條數(shù)據(jù)變化
60s內(nèi)有10000條數(shù)據(jù)發(fā)生變化
以上3中滿(mǎn)足1個(gè)條件就會(huì)觸發(fā)自動(dòng)生成散址,自動(dòng)生成本質(zhì)是bgsave
默認(rèn)配置
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb # 名字叫dump.rdb
dir ./ # 默認(rèn)存在當(dāng)前文件
stop-writes-ob-bgsave-error yes # 當(dāng)bgsave發(fā)生錯(cuò)誤,默認(rèn)停止寫(xiě)入
rdbcompression yes # 是否采用壓縮宣赔,默認(rèn)是
rdbchecksum yes # 是否進(jìn)行校驗(yàn)预麸,默認(rèn)是
最佳配置
# 建議不適用save
dbfilename ${port}.rdb # 一般開(kāi)啟多個(gè),適用其端口號(hào)
dir /diskpath #專(zhuān)門(mén)存放數(shù)據(jù)的文件夾
stop-writes-ob-bgsave-error yes
rdbcompression yes
rdbchecksum yes
RDB 總結(jié)
1.RDB 是Redis內(nèi)存到硬盤(pán)的快照,用于持久化
2.save通常會(huì)阻塞Redis
3.bgsave不會(huì)阻塞Redis儒将,但是會(huì)生成fork新進(jìn)程消耗內(nèi)存
4.save自動(dòng)配置滿(mǎn)足任意就會(huì)被執(zhí)行
5.有些觸發(fā)機(jī)是間接的
缺點(diǎn)
耗時(shí)吏祸、耗性能、耗內(nèi)存
不可控椅棺、丟失數(shù)據(jù):
AOF
類(lèi)似于數(shù)據(jù)庫(kù)的日志,每寫(xiě)入一個(gè)命令就同時(shí)會(huì)保存到AOF文件,當(dāng)發(fā)生宕機(jī)后,將AOF文件導(dǎo)入到redis
策略
always:每寫(xiě)一條命令就寫(xiě)入AOF犁罩。不丟失數(shù)據(jù)齐蔽;I/O開(kāi)銷(xiāo)大
everysec:每秒將redis緩沖區(qū)的命令寫(xiě)入到AOF。I/O開(kāi)銷(xiāo)相對(duì)較写补馈含滴;丟失1秒數(shù)據(jù)
no:OS決定。完全由系統(tǒng)決定,不可控
AOF重寫(xiě)
將過(guò)期的丐巫、沒(méi)有用的谈况、冗余的命令進(jìn)行化簡(jiǎn)成很小的AOF
作用:加速恢復(fù)速度,減少磁盤(pán)占用
AOF重寫(xiě)的兩種方式
bgrewriteaof:執(zhí)行此命令,redis會(huì)創(chuàng)建一個(gè)子進(jìn)程,將緩沖區(qū)的所有命令回溯,替換原有的AOF
AOF重寫(xiě)配置:
建議配置
appendonly yes # AOF的所有功能打開(kāi)
appendfilename "appendongly-${port}.aof" #aof文件名
appendfsync everysec
dir /diskpath
no-appendfsync-on-rewrite yes
動(dòng)態(tài)更改配置
config set name value
持久化運(yùn)維
fork操作
1.同步操作
2.與內(nèi)存量息息相關(guān):內(nèi)存越大,耗時(shí)越長(zhǎng)(與機(jī)器類(lèi)型有關(guān))
3.info:latest_fork_usec (最近一次fork操作的時(shí)常递胧,微秒)
改善fork
1.優(yōu)先使用物理機(jī)或者高效支持fork操作的虛擬化技術(shù)
2.控制Redis實(shí)例最大的可用內(nèi)存:maxmemory
3.合理配置Linux內(nèi)存分配策略:vm.overcommit_memory=1
4.降低fork頻率:例如放寬AOF重寫(xiě)自動(dòng)觸發(fā)時(shí)機(jī),不必要的全量復(fù)制
子進(jìn)程開(kāi)銷(xiāo)和優(yōu)化
1.CPU:
開(kāi)銷(xiāo):RDB和AOF文件生成,屬于CPU密集型
優(yōu)化:不做CPU綁定,不和CPU密集型部署
2.內(nèi)存
開(kāi)銷(xiāo):fork內(nèi)存開(kāi)銷(xiāo),copy-on-write
優(yōu)化:不允許單機(jī)多部署時(shí)進(jìn)行大量的重寫(xiě)碑韵;linux優(yōu)化策略 echo never > /sys/kernel/mm/transparent_hugepage/enabled
3.硬盤(pán)
開(kāi)銷(xiāo):AOF和RDB文件寫(xiě)入
優(yōu)化:不要和高硬盤(pán)負(fù)載服務(wù)部署一起:存儲(chǔ)服務(wù),消息隊(duì)列等;
no-annpendfsync-on-rewrite=yes;
根據(jù)寫(xiě)入量決定磁盤(pán)類(lèi)型:例如ssd;
單機(jī)多實(shí)例持久化文件目錄可以考慮分盤(pán)
AOF追加阻塞
AOF阻塞定位