共計(jì) 3488 個(gè)字符,預(yù)計(jì)需要花費(fèi) 9 分鐘才能閱讀完成。
這篇文章主要講解了“redis 的持久化怎么理解”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學(xué)習(xí)“redis 的持久化怎么理解”吧!
redis 的持久化:
概念:將內(nèi)存中的數(shù)據(jù)保存到磁盤,在機(jī)器宕機(jī)或重啟時(shí)可以保證數(shù)據(jù)不丟失。
說明:建議 RDB 和 AOF 同時(shí)開啟,若二者同時(shí)開啟,則 redis 在啟動(dòng)時(shí)優(yōu)先使用 aof 文件來恢復(fù)數(shù)據(jù),若讀取 aof 文件失敗,則讀取 rdb 文件來恢復(fù)數(shù)據(jù)。
RDB(Redis DataBase)
概念:
將內(nèi)存中的數(shù)據(jù)進(jìn)行快照并且存儲(chǔ)到磁盤上,即在指定目錄下生成一個(gè) dump.rdb 文件。RDB 是 redis 默認(rèn)的持久化方式。
redis 啟動(dòng)后可用通過讀取 rdb 文件,將數(shù)據(jù)再次載入到內(nèi)存中,一般情況下 1G 的 rdb 文件載入到內(nèi)存的時(shí)間大概為 20~30 秒。
過程:把所有的數(shù)據(jù)都寫到一個(gè)臨時(shí)文件中,然后用這個(gè)臨時(shí)文件替換掉之前的 rdb 文件。
觸發(fā)機(jī)制:
手動(dòng)觸發(fā):
save 命令:阻塞 Redis 當(dāng)前的進(jìn)程,直到 RDB 過程完成為止。若實(shí)例占用的內(nèi)存比較大,則會(huì)造成 redis 服務(wù)長時(shí)間的不可用。(不建議使用)
bgsave 命令:redis 當(dāng)前進(jìn)程執(zhí)行 fork 操作創(chuàng)建子進(jìn)程,RDB 持久化過程由子進(jìn)程負(fù)責(zé),父進(jìn)程繼續(xù)接收并處理客戶端發(fā)出的請(qǐng)求。阻塞只發(fā)生在 fork 階段,一般時(shí)間很短。
注意:fork 一個(gè)進(jìn)程時(shí),子進(jìn)程占用的內(nèi)存空間與父進(jìn)程相同。
自動(dòng)觸發(fā):
達(dá)到配置的條件時(shí),自動(dòng)觸發(fā) bgsave 命令。
在執(zhí)行 shutdown 命令后會(huì)自動(dòng)觸發(fā) bgsave 命令。
配置文件 redis.conf:
# 設(shè)置觸發(fā)快照的條件 (Will save the DB if both the given number of seconds and the given number of write operations against the DB occurred.)
# 格式:save seconds changes
save 900 1 # 900 秒內(nèi),如果有 1 個(gè)以上(包括 1 個(gè)) 的 key 被修改了,則觸發(fā)快照。
save 300 10 # 300 秒內(nèi),如果有 10 個(gè)以上 (包括 10 個(gè)) 的 key 被修改了,則觸發(fā)快照。
save 60 10000 # 60 秒內(nèi),如果有 10000 個(gè)以上 (包括 10000 個(gè)) 的 key 被修改了,則觸發(fā)快照。
# RDB 默認(rèn)會(huì)開啟,關(guān)閉 RDB 方式的持久化
save
# 設(shè)置 rdb 文件的名稱
dbfilename dump.rdb
# 設(shè)置 redis 的工作目錄,即 rdb 文件、aof 文件所在的目錄
# The working directory.
# The DB will be written inside this directory, with the filename specified above using the dbfilename configuration directive.
# The Append Only File will also be created inside this directory.
dir ./
# 設(shè)置 rdb 文件是否進(jìn)行壓縮,默認(rèn)為 yes。注:壓縮 rdb 文件可以減少磁盤空間的占用,但是需要消耗額外的 cpu。
rdbcompression yes
優(yōu)點(diǎn):適合大規(guī)模的數(shù)據(jù)恢復(fù),且數(shù)據(jù)加載的速度比較快。
缺點(diǎn):無法做到數(shù)據(jù)實(shí)時(shí)的(秒級(jí)) 持久化。故數(shù)據(jù)備份的完整性不高。
AOF(Append Only File)
概念:
將發(fā)送到 redis 服務(wù)端的每一條寫操作都存儲(chǔ)到磁盤上,即在指定目錄下生成一個(gè) appendonly.aof 文件,并且將每次的寫操作追加到 aof 文件的末尾。
redis 啟動(dòng)后通過讀取 aof 文件,將 aof 文件中的寫操作依次再執(zhí)行一遍,以此來達(dá)到數(shù)據(jù)恢復(fù)的效果。
過程:命令寫入 (append) 到緩存區(qū)、將緩存區(qū)的數(shù)據(jù)同步到 aof 文件中 (sync)、重新 aof 文件(rewrite)
重寫 aof 文件:
目的:去除數(shù)據(jù)的中間執(zhí)行過程,保留最終數(shù)據(jù)的命令,可大大減小 aof 文件的大小,從而可以加快數(shù)據(jù)恢復(fù)的速度。
過程:redis 當(dāng)前進(jìn)程執(zhí)行 fork 操作創(chuàng)建子進(jìn)程(開銷等同于 bgsave 過程),子進(jìn)程根據(jù)命令合并規(guī)則將內(nèi)存中的數(shù)據(jù)寫入到新的 AOF 文件中,最后用新的 aof 文件替換掉現(xiàn)有的 aof 文件。
觸發(fā)機(jī)制:
手動(dòng)觸發(fā):
BGREWRITEAOF
若 aof 文件格式異常,則需要修復(fù) aof 文件:redis-check-aof –fix appendonly.aof
自動(dòng)觸發(fā):
達(dá)到配置的條件時(shí),自動(dòng)觸發(fā)更新 aof 文件 或 重新 aof 文件 的操作。
3) 配置文件 redis.conf:
# AOF 和 RDB 可以同時(shí)存在,AOF 方式的持久化擁有更好的數(shù)據(jù)完整性和一致性。
# AOF and RDB persistence can be enabled at the same time without problems.
# If the AOF is enabled on startup Redis will load the AOF, that is the file with the better durability guarantees.
# 開啟 AOF (AOF 默認(rèn)是關(guān)閉的 appendonly no)
appendonly yes
# 設(shè)置觸發(fā)更新 aof 文件的條件
# appendfsync always # 同步持久化,即每次執(zhí)行寫操作后都會(huì)去更新 aof 文件。數(shù)據(jù)完整性好,但是性能較差。
appendfsync everysec # 每秒同步一次,是 AOP 默認(rèn)觸發(fā)更新日志的條件。
# appendfsync no # 不主動(dòng)同步,由操作系統(tǒng)來決定什么時(shí)候同步(一般為 30s),性能最好但是持久化得不到保障,故不推薦使用該配置。
# 設(shè)置觸發(fā)重寫 aof 文件的條件,多個(gè)條件是 與 的關(guān)系。
# redis 在重寫 aof 文件后會(huì)將 aof 文件的大小記錄下來(若沒有重寫過 aof 文件,則這個(gè)大小默認(rèn)是 redis 啟動(dòng)時(shí) aof 文件的大小)
auto-aof-rewrite-percentage 100 # 當(dāng)前 aof 文件的大小 超過 上一次重寫后記錄的大小 的 100%。
auto-aof-rewrite-min-size 64mb # 當(dāng)前 aof 文件大于等于 64mb。注一般不會(huì)設(shè)置的這么小,看情況設(shè)為 ngb 比較合理。
# 設(shè)置 aof 文件的名稱
# appendfilename appendonly.aof
# 設(shè)置 redis 的工作目錄,即 rdb 文件、aof 文件所在的目錄
dir ./
優(yōu)點(diǎn):可以做到數(shù)據(jù)實(shí)時(shí)的(秒級(jí)) 持久化,故數(shù)據(jù)備份的完整性很高。
缺點(diǎn):AOF 記錄的內(nèi)容多,文件會(huì)越來越大,數(shù)據(jù)恢復(fù)也會(huì)越來越慢,故 redis 在 AOF 中引入了重寫 aof 文件的機(jī)制。
持久化給 redis 帶來的開銷:
概念:子進(jìn)程在重寫 RDB 文件和重寫 AOF 文件時(shí)會(huì)消耗 cpu、內(nèi)存、硬盤等資源。
cpu:子進(jìn)程負(fù)責(zé)把進(jìn)程內(nèi)的數(shù)據(jù)分批寫入文件,這個(gè)過程屬于 CPU 密集操作,通常子進(jìn)程對(duì)單核 CPU 利用率接近 90%。
內(nèi)存:父進(jìn)程 fork 子進(jìn)程時(shí),子進(jìn)程默認(rèn)占用的內(nèi)存同父進(jìn)程一樣。我們可以修改 Linux 內(nèi)存分配的配置,避免物理內(nèi)存不足導(dǎo)致 fork 進(jìn)程失敗。
硬盤:往 rdb 文件或 aof 文件中寫數(shù)據(jù)的過程中,磁盤 io 的壓力比較大。
說明:開啟 AOF 的 Redis 在高流量寫入時(shí),如果使用普通機(jī)械磁盤,寫入吞吐一般在 100MB/ s 左右,這時(shí) Redis 實(shí)例的瓶頸主要在 AOF 同步硬盤上。
注意:redis 實(shí)例不應(yīng)該和其它對(duì) cpu、內(nèi)存、硬盤敏感的服務(wù)混部。
感謝各位的閱讀,以上就是“redis 的持久化怎么理解”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì) redis 的持久化怎么理解這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!