亞寵展、全球?qū)櫸锂a(chǎn)業(yè)風(fēng)向標(biāo)——亞洲寵物展覽會(huì)深度解析
858
2022-05-28
Redis 持久化 RDB、AOF
RDB持久化方式: 指定的時(shí)間間隔對(duì)數(shù)據(jù)進(jìn)行快照存儲(chǔ)
AOF 持久化方式:記錄每次對(duì)服務(wù)器的寫(xiě)操作,服務(wù)宕機(jī)時(shí)會(huì)rewrite這些操作恢復(fù)數(shù)據(jù),AOF命令以Redis協(xié)議追加保存每次寫(xiě)的操作添加到文件末尾,
Redis還支持AOF后臺(tái)重寫(xiě), 讓AOF體積不易過(guò)大
如果同時(shí)開(kāi)啟, AOF 優(yōu)先級(jí)更高, 優(yōu)先使用AOF來(lái)進(jìn)行恢復(fù), AOF完整性更高
Redis序列化協(xié)議(RESP Redis Serialization Protocol)
一種文本協(xié)議 將結(jié)構(gòu)數(shù)據(jù)分為5中最小單元類(lèi)型,單元結(jié)束時(shí)統(tǒng)一加回車(chē)換行符 \r\n
1 單行字符串以”+” 字符開(kāi)頭
2 多行字符串以”$” 符號(hào)開(kāi)頭, 后跟字符串長(zhǎng)度
3 整數(shù)值以”;” 符號(hào)開(kāi)頭,后跟證書(shū)的字符串形式
4 錯(cuò)誤消息以”-” 符號(hào)開(kāi)頭
5 數(shù)組以”*” 號(hào)開(kāi)頭, 后跟數(shù)組的長(zhǎng)度
例 客戶端- 服務(wù)端
127.0.0.1:6379> set newkey3 n3
OK
*3\r\n\r\nset\r\n\r\nnewkey3\r\n\r\nn3
*3
$3
set
$7
newkey3
$2
n3
1? RDB
在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫(xiě)入磁盤(pán),恢復(fù)時(shí)是將快照文件直接讀到內(nèi)存里。
Redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來(lái)進(jìn)行持久化
會(huì)先將數(shù)據(jù)寫(xiě)入到一個(gè)臨時(shí)文件中,待持久化過(guò)程 都結(jié)束了,再用這個(gè)臨時(shí)文件替換上次持久化好的文件。
整個(gè)過(guò)程中,主進(jìn)程是不進(jìn)行任何IO操作的。 這就確保了極高的性能。
如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù),且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那 RDB方式要比AOF方式更加的高效。
RDB的缺點(diǎn)是最后一次持久化后的數(shù)據(jù)可能丟失。
2 RDB 持久化核心思想COW
RDB 持久化會(huì)調(diào)用glibc函數(shù)fork出一個(gè)子進(jìn)程,子進(jìn)程完成持久化工作, 子進(jìn)程做持久化不會(huì)修改內(nèi)存的數(shù)據(jù)結(jié)構(gòu),僅會(huì)遍歷, 父進(jìn)程會(huì)繼續(xù)相應(yīng)客戶端請(qǐng)求
然后子進(jìn)程利用操作系統(tǒng)的 COW (copy-on-write) 來(lái)持久化數(shù)據(jù)
3 COW 概述:
父進(jìn)程 子進(jìn)程都指向相同的數(shù)據(jù)頁(yè)(共享內(nèi)存)
數(shù)據(jù)段有很多系統(tǒng)數(shù)據(jù)頁(yè)組成
父進(jìn)程對(duì)某個(gè)數(shù)據(jù)頁(yè)進(jìn)行修改, 會(huì)將共享的數(shù)據(jù)頁(yè)復(fù)制一份,在復(fù)制頁(yè)上進(jìn)行修改
子進(jìn)程仍指向舊數(shù)據(jù)頁(yè)(備份時(shí)刻的數(shù)據(jù)頁(yè)), 由于數(shù)據(jù)沒(méi)有變化, Redis持久化也被稱(chēng)為”快照” 子進(jìn)程繼續(xù)遍歷,序列化到磁盤(pán)
即使內(nèi)存里數(shù)據(jù)頁(yè)全部被修改,內(nèi)存大小也不會(huì)超過(guò)原數(shù)據(jù)內(nèi)存的2倍 (Redis里大部分?jǐn)?shù)據(jù)都是冷數(shù)據(jù))
4 優(yōu)點(diǎn)
RDB是緊湊文件, 保存了某個(gè)時(shí)間點(diǎn)數(shù)據(jù)集
RDB 是緊湊單一文件, 方便傳遞, 例: 傳給備機(jī)或者云上Redis
RDB 保存文件時(shí), 父進(jìn)程會(huì)fork/clone出一個(gè)子進(jìn)程, 子進(jìn)程完成備份工作,父進(jìn)程繼續(xù)其它I/0操作 保證Redis性能
RDB與 AOF比,恢復(fù)大數(shù)據(jù)集時(shí), 速度更快
5 缺點(diǎn)
RDB 無(wú)法100%保證數(shù)據(jù)不丟, 會(huì)丟失一段區(qū)間內(nèi)的數(shù)據(jù)(save 900 1) 可能會(huì)丟900秒/15分鐘內(nèi)數(shù)據(jù)
RDB 經(jīng)常fork子進(jìn)程來(lái)保存數(shù)據(jù)集到磁盤(pán), 數(shù)據(jù)集較大時(shí), 父進(jìn)程創(chuàng)建fork子進(jìn)程也需要時(shí)間, 肯能會(huì)有毫秒級(jí)的阻塞(無(wú)法響應(yīng)客戶端請(qǐng)求)
RDB持久化 涉及到臨時(shí)文件, 磁盤(pán)空間應(yīng)該2倍于 數(shù)據(jù)空間
RDB持久化配置
rdb持久化核心配置參數(shù): vim /data/6379/redis.conf dir /data/6379 #路徑 dbfilename dump.rdb #文件名 #save 其實(shí)觸發(fā)的是bgsave save 900 1 # 900秒(15分鐘)內(nèi)有1個(gè)更改 save 300 10 #300秒(5分鐘)內(nèi)有10個(gè)更改 save 60 10000 #60秒內(nèi)有10000個(gè)更改 stop-writes-on-bgsave-error yes # bgsave 失敗之后,是否停止持久化數(shù)據(jù)到磁盤(pán),yes 表示停止持久化,no 表示忽略錯(cuò)誤繼續(xù)寫(xiě)文件。 rdbchecksum yes # 寫(xiě)入文件和讀取文件時(shí)是否開(kāi)啟 RDB 文件檢查,檢查是否有無(wú)損壞,如果在啟動(dòng)是檢查發(fā)現(xiàn)損壞,則停止啟動(dòng)。 rdbcompression yes # 是否壓縮 redis會(huì)采用LZF算法進(jìn)行壓縮, 會(huì)有cpu消耗
補(bǔ)充
Save 會(huì)阻塞正常操作
bgsave 異步方式 提示Background saving started? # 提示開(kāi)始后臺(tái)保存
flushall 命令用于清空 Redis 數(shù)據(jù)庫(kù),生產(chǎn)環(huán)境慎用,當(dāng)執(zhí)行flushall,則會(huì)觸發(fā)自動(dòng)持久化,把 RDB清空
流程
2 AOF 持久化(append-only log file)?? 優(yōu)先級(jí)較高
記錄服務(wù)器執(zhí)行的所有寫(xiě)操作命令(增量保存),只許追加文件但不可以改寫(xiě)文件并在服務(wù)器啟動(dòng)時(shí),通過(guò)重新執(zhí)行這些命令來(lái)還原數(shù)據(jù)集。
AOF是先執(zhí)行指令后寫(xiě)入日志(不同于mysql Hbase等WAL)
優(yōu)點(diǎn):
AOF可以使用不同的fsync策略, 無(wú)fsync(操作系統(tǒng)決定), 每秒fsync,每次寫(xiě)的時(shí)候fsync;依舊是后臺(tái)線程進(jìn)行處理,主線程處理客戶端請(qǐng)求
AOF文件是日志追加,如果寫(xiě)過(guò)程中出現(xiàn)宕機(jī)未完整寫(xiě)入日志, 可以使用redis-check-aof工具修復(fù)
AOF 文件體積過(guò)大,自動(dòng)在后臺(tái)進(jìn)行重寫(xiě)(bgrewriteaof)進(jìn)而縮小體積(過(guò)程是安全的,重寫(xiě)一個(gè)新AOF文件,就AOP依舊寫(xiě)入,重新完進(jìn)行切換)
AOF 文件保存了所有寫(xiě)操作, 更加易讀,分析parse更加容易。例 手動(dòng)FLUSHALL,把a(bǔ)of文件尾flushall去掉,重啟Redis可以恢復(fù)
AOF 文件中的命令全部以 Redis 協(xié)議的格式來(lái)保存,新命令會(huì)被追加到文件的末尾
缺點(diǎn):
AOF體積大于 RDB 導(dǎo)致日志記錄量級(jí)比較大
AOF 根據(jù)不同appendfsync 策略,速度慢于RDB
AOF持久化配置
AOF持久化配置 vim /data/6379/redis.conf appendonly yes #是否打開(kāi)aof日志功能 appendfsync always #每1個(gè)命令,都立即同步到 aofappendfsync everysec # 每秒每秒寫(xiě)1次 appendfsync no # 取決于操作系統(tǒng) 寫(xiě)入工作交給操作系統(tǒng),由操作系統(tǒng)判斷緩沖區(qū)大小,統(tǒng)一寫(xiě)入到aof. appendfilename "appendonly.aof" auto-aof-rewrite-percentage 100 # 指當(dāng)前aof文件比上次重寫(xiě)的增長(zhǎng)比例大小 原來(lái)64M 達(dá)到128M,達(dá)到這個(gè)大小就進(jìn)行 aof 重寫(xiě) auto-aof-rewrite-min-size 64mb # 最開(kāi)始aof文件必須要達(dá)到這個(gè)文件時(shí)才觸發(fā),后面的每次重寫(xiě)就不會(huì)根據(jù)這個(gè)變量 例 127.0.0.1:6379> set newkey3 n3 OK *3 $3 set $7 newkey3 $2 n3
如遇到AOF文件損壞,通過(guò)/usr/local/bin/redis-check-aof --fix appendonly.aof進(jìn)行恢復(fù)
AOF 持久化流程-AOF重寫(xiě)
子進(jìn)程在進(jìn)行AOF重寫(xiě)期間,服務(wù)器進(jìn)程還要繼續(xù)處理命令請(qǐng)求,而新的命令可能對(duì)現(xiàn)有的數(shù)據(jù)進(jìn)行修改,這會(huì)讓當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)和重寫(xiě)后的AOF文件中的數(shù)據(jù)不一致
AOF文件重寫(xiě)過(guò)程與RDB快照bgsave工作過(guò)程相似,都是通過(guò)fork子進(jìn)程,由子進(jìn)程完成相應(yīng)的操作 同樣的在fork子進(jìn)程簡(jiǎn)短的時(shí)間內(nèi),redis是阻塞的 (1)開(kāi)始bgrewriteaof,判斷當(dāng)前有沒(méi)有bgsave命令(RDB持久化)/bgrewriteaof在執(zhí)行,倘若有,則這些命令執(zhí)行完成以后在執(zhí)行。 (2)主進(jìn)程fork出子進(jìn)程,在這一個(gè)短暫的時(shí)間內(nèi),redis是阻塞的。 (3)主進(jìn)程fork完子進(jìn)程繼續(xù)接受客戶端請(qǐng)求。此時(shí),客戶端的寫(xiě)請(qǐng)求不僅僅寫(xiě)入aof_buf緩沖區(qū),還寫(xiě)入aof_rewrite_buf重寫(xiě)緩沖區(qū)。COW原理 一方面是寫(xiě)入aof_buf緩沖區(qū)并根據(jù)appendfsync策略同步到磁盤(pán),保證原有AOF文件完整和正確。 另一方面寫(xiě)入aof_rewrite_buf重寫(xiě)緩沖區(qū),保存fork之后的客戶端的寫(xiě)請(qǐng)求,防止新AOF文件生成期間丟失這部分?jǐn)?shù)據(jù)。 (4.1)子進(jìn)程寫(xiě)完新的AOF文件后,向主進(jìn)程發(fā)信號(hào),父進(jìn)程更新統(tǒng)計(jì)信息。 (4.2)主進(jìn)程把a(bǔ)of_rewrite_buf中的數(shù)據(jù)寫(xiě)入到新的AOF文件。 (5)使用新的AOF文件覆蓋舊的AOF文件,標(biāo)志AOF重寫(xiě)完成。
AOF-混合持久化
4.X 版本整合策略-混合持久化 AOF重寫(xiě)策略
AOF 重寫(xiě)策略做了優(yōu)化, 舊版本吧內(nèi)存數(shù)據(jù)集的操作指令落地, 新版本是把內(nèi)存的數(shù)據(jù)集以rdb追加到aof頭部,所以新版本重寫(xiě)后的AOF依舊是追加日志,但恢復(fù)時(shí)先rdb恢復(fù) 在做增量的日志恢復(fù),類(lèi)似混合持久化
混合持久化同樣也是通過(guò)bgrewriteaof完成的,不同的是當(dāng)開(kāi)啟混合持久化時(shí),fork出的子進(jìn)程先將共享的內(nèi)存副本全量的以RDB方式寫(xiě)入aof文件
然后在將aof_rewrite_buf重寫(xiě)緩沖區(qū)的增量命令以AOF方式寫(xiě)入到文件
寫(xiě)入完成后通知主進(jìn)程更新統(tǒng)計(jì)信息,并將新的含有RDB格式和AOF格式的AOF文件替換舊的的AOF文件
混合持久化配置:
aof-use-rdb-preamble yes? # yes:開(kāi)啟,no:關(guān)閉
簡(jiǎn)單的說(shuō):新的AOF文件前半段是RDB格式的全量數(shù)據(jù)后半段是AOF格式的增量數(shù)據(jù),如下圖:
AOF日志中 關(guān)于 RDB部分頭寫(xiě)入
Redis 任務(wù)調(diào)度
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。