原文首更地址,閱讀效果更佳!
Redis進(jìn)階 - Redis持久化 | CoderMast編程桅桿https://www.codermast.com/database/redis/redis-advance-persistence.html
單點(diǎn)Redis的問(wèn)題
- 數(shù)據(jù)丟失問(wèn)題:Redis 是內(nèi)存存儲(chǔ),服務(wù)重啟可能會(huì)丟失數(shù)據(jù)。通過(guò)實(shí)現(xiàn) Redis 數(shù)據(jù)持久化解決。
- 并發(fā)能力問(wèn)題:?jiǎn)喂?jié)點(diǎn) Redis 并發(fā)能力雖然不錯(cuò),但是也無(wú)法滿足如 618 這樣的高并發(fā)場(chǎng)景。搭建主從集群,實(shí)現(xiàn)讀寫(xiě)分離解決。
- 故障恢復(fù)問(wèn)題:如果 Redis 宕機(jī),則服務(wù)不可用,需要一種自動(dòng)的故障恢復(fù)手段。利用 Redis 哨兵,實(shí)現(xiàn)健康檢測(cè)和自動(dòng)恢復(fù)。
- 存儲(chǔ)能力問(wèn)題:Redis 基于內(nèi)存,單點(diǎn)能存儲(chǔ)的數(shù)據(jù)量難以滿足海量數(shù)據(jù)需求。搭建分片集群,利用插槽機(jī)制實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容。
#RDB持久化
RDB 全稱(chēng)為 Redis Database Backup file (Redis 數(shù)據(jù)備份文件),也被叫做 Redis 數(shù)據(jù)快照。簡(jiǎn)單來(lái)說(shuō)就是把內(nèi)存中的所有數(shù)據(jù)都記錄到磁盤(pán)中。當(dāng) Redis 實(shí)例故障重啟后,從磁盤(pán)讀取快照文件,恢復(fù)數(shù)據(jù)。
快照文件稱(chēng)為 RDB 文件,默認(rèn)是保存在當(dāng)前運(yùn)行目錄。
-
save
命令:創(chuàng)建 RDB 快照,由 Redis 主進(jìn)程來(lái)執(zhí)行,會(huì)阻塞所有命令。RDB 是需要寫(xiě)入磁盤(pán)中,IO 操作較慢。 -
bgsave
命令:開(kāi)啟子進(jìn)程執(zhí)行 RDB ,避免主進(jìn)程受到影響。
Redis 停機(jī)時(shí)會(huì)執(zhí)行一次 RDB 。
默認(rèn)情況下會(huì)在當(dāng)前目錄生成一個(gè) dump.rdb 的文件,下一次啟動(dòng) Redis 時(shí),默認(rèn)會(huì)加載這個(gè)文件,恢復(fù) Redis 數(shù)據(jù)。
Redis 內(nèi)部有觸發(fā) RDB 的機(jī)制,可以在 redis.conf 文件中找到,格式如下:
<span style="color:#2c3e50"><code>save 900 1 // 900 秒內(nèi),如果至少有 1 個(gè) key 被修改,則執(zhí)行 bgsave
save 300 10 // 300 秒內(nèi),如果至少有 10 個(gè) key 被修改,則執(zhí)行 bgsave
save 60 10000 // 60 秒內(nèi),如果至少有 10000 個(gè) key 被修改,則執(zhí)行 bgsave
save "" // 表示禁用 RDB
rdbcompression yes // 是否壓縮,建議不開(kāi)啟,壓縮也會(huì)消耗 CPU ,磁盤(pán)空間相對(duì)廉價(jià)
dbfilename dump.rdb // RDB 文件名稱(chēng)
dir ./ // 文件保存的路徑目錄
</code></span>
bgsave 開(kāi)始時(shí)會(huì) fork 主進(jìn)程得到子進(jìn)程,子進(jìn)程共享主進(jìn)程的內(nèi)存數(shù)據(jù)。完成 fork 后讀取內(nèi)存數(shù)據(jù)并寫(xiě)入 RDB 文件。
fork 過(guò)程是阻塞的,此時(shí) Redis 無(wú)法響應(yīng)客戶端請(qǐng)求。fork 的速度是非??斓模?yàn)?fork 只復(fù)制了對(duì)應(yīng)的頁(yè)表,而不是復(fù)制真實(shí)的數(shù)據(jù),類(lèi)似于只復(fù)制數(shù)據(jù)的索引。
fork 采用的是 copy-on-write 技術(shù):
- 當(dāng)主進(jìn)程執(zhí)行讀操作時(shí),訪問(wèn)共享內(nèi)存
- 當(dāng)主進(jìn)程執(zhí)行寫(xiě)操作時(shí),則會(huì)拷貝一份數(shù)據(jù),執(zhí)行寫(xiě)操作。
?
極端情況
當(dāng)子進(jìn)程寫(xiě)新的 RDB 文件時(shí),此時(shí)主進(jìn)程大量修改數(shù)據(jù),則需要對(duì)數(shù)據(jù)進(jìn)行拷貝,當(dāng)主進(jìn)程需要對(duì)所有的數(shù)據(jù)都進(jìn)行修改時(shí),則需要兩倍原來(lái)的內(nèi)存,故我們?cè)谂渲?Redis 服務(wù)時(shí),不能將所有的實(shí)際內(nèi)存分配給 Redis ,需要預(yù)留一部分緩沖空間。
RDB 持久化小結(jié):
RDB 方式 bgsave 的流程:
- fork 主進(jìn)程得到一個(gè)子進(jìn)程,共享內(nèi)存空間
- 子進(jìn)程讀取內(nèi)存數(shù)據(jù)并寫(xiě)入新的 RDB 文件
- 用新的 RDB 文件替換舊的 RDB 文件
RDB 會(huì)在什么時(shí)候執(zhí)行?save 60 1000代表什么含義?
- 默認(rèn)是在 Redis 服務(wù)停止時(shí)執(zhí)行 RDB。
- save 60 10000代表60秒內(nèi)至少執(zhí)行 1000 次修改則觸發(fā) RDB
RDB 的缺點(diǎn)?
- RDB 執(zhí)行間隔時(shí)間長(zhǎng),兩次 RDB 之間寫(xiě)入數(shù)據(jù)有丟失的風(fēng)險(xiǎn)
- fork 子進(jìn)程、壓縮、寫(xiě)出 RDB 文件都比較耗時(shí)
#AOF持久化
AOF 全稱(chēng)為 Append Only File(追加文件)。Redis 處理的每一個(gè)寫(xiě)命令都會(huì)記錄在 AOF 文件,可以看做是命令日志文件。
AOF 默認(rèn)是關(guān)閉的,需要修改 redis.conf 配置文件來(lái)開(kāi)啟 AOF
<span style="color:#2c3e50"><code>appendonly yes // 是否開(kāi)啟 AOF 功能,默認(rèn)是關(guān)閉的
appendfilename "appendonly.aof" // AOF 的文件名稱(chēng)
</code></span>
AOF 的命令記錄的頻率也可以通過(guò) redis.conf 文件來(lái)進(jìn)行配置:
<span style="color:#2c3e50"><code>appendfsync always // 表示每執(zhí)行一次寫(xiě)命令,立刻記錄到 AOF 文件中
appendfsync everysec // 寫(xiě)命令執(zhí)行完先放入 AOF 緩沖區(qū),然后每隔 1 秒將緩沖區(qū)數(shù)據(jù)寫(xiě)入到 AOF 文件,是默認(rèn)方案
appendfsync no // 寫(xiě)命令執(zhí)行完先放入 AOF 緩沖區(qū),由操作系統(tǒng)決定何時(shí)將緩沖區(qū)內(nèi)容寫(xiě)回磁盤(pán)
</code></span>
配置項(xiàng) | 刷盤(pán)時(shí)機(jī) | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|---|
Always | 同步刷盤(pán) | 可靠性高,幾乎不丟數(shù)據(jù) | 性能影響大 |
everysec | 每秒刷盤(pán) | 性能適中 | 最多丟失1秒數(shù)據(jù) |
no | 操作系統(tǒng)控制 | 性能最好 | 可靠性差,可能丟失大量數(shù)據(jù) |
AOF 是記錄命令,AOF 文件會(huì)比 RDB 文件大很多。而且 AOF 會(huì)記錄對(duì)同一個(gè) key 的 多次寫(xiě)操作,但只有最后一次寫(xiě)操作才有意義。通過(guò)執(zhí)行 bgrewriteaof 命令,可以讓 AOF 文件執(zhí)行重寫(xiě)功能,用最少的命令達(dá)到相同效果。
?
Redis 也會(huì)在觸發(fā)閾值時(shí)自動(dòng)去重寫(xiě) AOF 文件。閾值也可以在 redis.conf 中配置:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-499926.html
<span style="color:#2c3e50"><code>auto-aof-rewrite-percentage 100 // AOF 文件比上次文件增長(zhǎng)多少百分比,則觸發(fā)重寫(xiě)
auto-aof-rewrite-min-size 64mb // AOF 文件體積最小多大以上才觸發(fā)重寫(xiě)
</code></span>
#RDB與AOF對(duì)比
RDB和AOF各有自己的優(yōu)缺點(diǎn),如果對(duì)數(shù)據(jù)安全性要求較高,在實(shí)際開(kāi)發(fā)中往往會(huì)結(jié)合兩者來(lái)使用。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-499926.html
持久化方式 | 數(shù)據(jù)完整性 | 文件大小 | 宕機(jī)恢復(fù)速度 | 數(shù)據(jù)恢復(fù)優(yōu)先級(jí) | 系統(tǒng)資源占用 | 使用場(chǎng)景 |
---|---|---|---|---|---|---|
RDB | 定時(shí)對(duì)整個(gè)內(nèi)存做快照 | 不完整,兩次備份之間會(huì)丟失 | 會(huì)有壓縮,文件體積小 | 很快 | 低,因?yàn)閿?shù)據(jù)完整性不如AOF | 高,大量CPU和內(nèi)存消耗 |
AOF | 記錄每一次執(zhí)行的命令 | 相對(duì)完整,取決于刷盤(pán)策略 | 記錄命令,文件體積很大 | 慢 | 高,因?yàn)閿?shù)據(jù)完整性更高 | 低,主要是磁盤(pán)IO資源但AOF重寫(xiě)時(shí)會(huì)占用大量CPU和內(nèi)存資源 |
到了這里,關(guān)于Redis進(jìn)階 - Redis持久化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!