溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Redis數(shù)據(jù)庫(kù)持久化

發(fā)布時(shí)間:2020-07-16 13:31:14 來(lái)源:網(wǎng)絡(luò) 閱讀:369 作者:一二毛錢(qián) 欄目:系統(tǒng)運(yùn)維

Redis數(shù)據(jù)庫(kù)持久化

一、數(shù)據(jù)庫(kù)概述;
二、持久化的作用以及實(shí)現(xiàn)方式;
三、RDB持久化方式配置;
四、AOF持久化方式配置;

一、數(shù)據(jù)庫(kù)概述:

Redis是一種高級(jí)key-value數(shù)據(jù)庫(kù)。它跟memcached類(lèi)似,不過(guò)數(shù)據(jù)可以持久化,而且支持的數(shù)據(jù)類(lèi)型很豐富。有字符串,鏈表,集 合和有序集合。支持在服務(wù)器端計(jì)算集合的并,交和補(bǔ)集(difference)等,還支持多種排序功能。所以Redis也可以被看成是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器。
Redis數(shù)據(jù)庫(kù)持久化

二、持久化的作用以及實(shí)現(xiàn)方式:

作用:
Redis的所有數(shù)據(jù)都是保存在內(nèi)存中,如果沒(méi)有配置持久化,redis重啟后數(shù)據(jù)就全丟失了,于是需要開(kāi)啟redis的持久化功能,將數(shù)據(jù)保存到磁盤(pán)上,當(dāng)redis重啟后,可以從磁盤(pán)中恢復(fù)數(shù)據(jù)。那么不定期的通過(guò)異步方式保存到磁盤(pán)上(半持久化模式);也可以把每一次數(shù)據(jù)變化都寫(xiě)入到一個(gè)append only file里面(全持久化模式)。?如若在服務(wù)器中開(kāi)啟了兩種持久化的方式,默認(rèn)執(zhí)行AOF持久化方式;
實(shí)現(xiàn)方式:
RDB持久化:將Reids在內(nèi)存中的數(shù)據(jù)庫(kù)記錄定時(shí)dump到磁盤(pán)上,類(lèi)似于快照功能。
AOF持久化:append only file--原理是將Reids的操作日志以追加的方式寫(xiě)入文件,近似實(shí)時(shí)性。
二者的區(qū)別:
RDB持久化是指在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫(xiě)入磁盤(pán),實(shí)際操作過(guò)程是fork一個(gè)子進(jìn)程,先將數(shù)據(jù)集寫(xiě)入臨時(shí)文件,寫(xiě)入成功后,再替換之前的文件,用二進(jìn)制壓縮存儲(chǔ)。
Redis數(shù)據(jù)庫(kù)持久化
?
AOF持久化是以日志的形式記錄服務(wù)器所處理的每一個(gè)寫(xiě)、刪除操作,查詢操作不會(huì)記錄,以文本的方式記錄,可以打開(kāi)文件看到詳細(xì)的操作記錄。

?Redis數(shù)據(jù)庫(kù)持久化
RDB的優(yōu)勢(shì):
1). 一旦采用該方式,那么你的整個(gè)Redis數(shù)據(jù)庫(kù)將只包含一個(gè)文件,這對(duì)于文件備份而言是非常完美的。比如,你可能打算每個(gè)小時(shí)歸檔一次最近24小時(shí)的數(shù)據(jù),同時(shí)還要每天歸檔一次最近30天的數(shù)據(jù)。通過(guò)這樣的備份策略,一旦系統(tǒng)出現(xiàn)災(zāi)難性故障,我們可以非常容易的進(jìn)行恢復(fù)。
2). 對(duì)于災(zāi)難恢復(fù)而言,RDB是非常不錯(cuò)的選擇。因?yàn)槲覀兛梢苑浅]p松的將一個(gè)單獨(dú)的文件壓縮后再轉(zhuǎn)移到其它存儲(chǔ)介質(zhì)上。
3). 性能最大化。對(duì)于Redis的服務(wù)進(jìn)程而言,在開(kāi)始持久化時(shí),它唯一需要做的只是fork出子進(jìn)程,之后再由子進(jìn)程完成這些持久化的工作,這樣就可以極大的避免服務(wù)主進(jìn)程執(zhí)行IO操作了。
4). 相比于AOF機(jī)制,如果數(shù)據(jù)集很大,RDB的啟動(dòng)效率會(huì)更高。
RDB的劣勢(shì):
1). 如果你想保證數(shù)據(jù)的高可用性,即最大限度的避免數(shù)據(jù)丟失,那么RDB將不是一個(gè)很好的選擇。因?yàn)橄到y(tǒng)一旦在定時(shí)持久化周期之內(nèi)出現(xiàn)宕機(jī)現(xiàn)象,此前沒(méi)有來(lái)得及寫(xiě)入磁盤(pán)的數(shù)據(jù)都將丟失。
2). 由于RDB是通過(guò)fork子進(jìn)程來(lái)協(xié)助完成數(shù)據(jù)持久化工作的,因此,如果當(dāng)數(shù)據(jù)集較大時(shí),可能會(huì)導(dǎo)致整個(gè)服務(wù)器停止服務(wù)幾百毫秒,甚至是1秒鐘。

AOF的優(yōu)勢(shì):
1). 該機(jī)制可以帶來(lái)更高的數(shù)據(jù)安全性,即數(shù)據(jù)持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事實(shí)上,每秒同步也是異步完成的,其效率也是非常高的,所差的是一旦系統(tǒng)出現(xiàn)宕機(jī)現(xiàn)象,那么這一秒鐘之內(nèi)修改的數(shù)據(jù)將會(huì)丟失。而每修改同步,我們可以將其視為同步持久化,即每次發(fā)生的數(shù)據(jù)變化都會(huì)被立即記錄到磁盤(pán)中??梢灶A(yù)見(jiàn),這種方式在效率上是最低的。
2). 由于該機(jī)制對(duì)日志文件的寫(xiě)入操作采用的是append模式,因此在寫(xiě)入過(guò)程中即使出現(xiàn)宕機(jī)現(xiàn)象,也不會(huì)破壞日志文件中已經(jīng)存在的內(nèi)容。然而如果我們本次操作只是寫(xiě)入了一半數(shù)據(jù)就出現(xiàn)了系統(tǒng)崩潰問(wèn)題,不用擔(dān)心,在Redis下一次啟動(dòng)之前,我們可以通過(guò)redis-check-aof工具來(lái)幫助我們解決數(shù)據(jù)一致性的問(wèn)題。
3). 如果日志過(guò)大,Redis可以自動(dòng)啟用rewrite機(jī)制。即Redis以append模式不斷的將修改數(shù)據(jù)寫(xiě)入到老的磁盤(pán)文件中,同時(shí)Redis還會(huì)創(chuàng)建一個(gè)新的文件用于記錄此期間有哪些修改命令被執(zhí)行。因此在進(jìn)行rewrite切換時(shí)可以更好的保證數(shù)據(jù)安全性。
4). AOF包含一個(gè)格式清晰、易于理解的日志文件用于記錄所有的修改操作。事實(shí)上,我們也可以通過(guò)該文件完成數(shù)據(jù)的重建。
AOF的劣勢(shì):
1). 對(duì)于相同數(shù)量的數(shù)據(jù)集而言,AOF文件通常要大于RDB文件。RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比 AOF 的恢復(fù)速度要快。
2). 根據(jù)同步策略的不同,如果在數(shù)據(jù)量比較大的情況下,AOF在運(yùn)行效率上往往會(huì)慢于RDB。

應(yīng)用場(chǎng)景:
1). 愿意犧牲一些性能(選擇AOF);
2). 換取更高的緩存一致性,保證數(shù)據(jù)庫(kù)最高可能的完整性(選擇AOF);
3). 愿意寫(xiě)操作頻繁的時(shí)候,不啟用備份來(lái)?yè)Q取更高的性能,待手動(dòng)運(yùn)行save的時(shí)候,再做備份(RDB);

三、RDB持久化方式配置;

環(huán)境準(zhǔn)備:根據(jù)“Redis高性能數(shù)據(jù)庫(kù)”安裝Redis服務(wù);

[root@redis ~]# vi /usr/local/redis/redis.conf
218 save 900 1                  ##開(kāi)啟RDB快照功能,在900秒內(nèi)完成一個(gè)key值得變動(dòng)觸發(fā)快照功能,如若將所有save配置項(xiàng)都注釋掉,那么則將關(guān)閉RDB快照功能
219 save 300 10
220 save 60 10000
235 stop-writes-on-bgsave-error yes ##當(dāng)RDB快照后臺(tái)進(jìn)程失敗,不影響用戶得寫(xiě)操作
241 rdbcompression yes              ##是否將RDB快照文件壓縮,關(guān)閉后會(huì)增加性能
250 rdbchecksum no              ##關(guān)閉RDB快照文件的檢查校驗(yàn),增加性能
253 dbfilename dump.rdb         ##快照文件的名稱
263 dir ./                          ##快照文件的存儲(chǔ)路徑,./為redis的安裝目錄下
[root@redis redis]# /etc/init.d/redis restart
[root@redis redis]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> set haha hehe
OK
192.168.100.101:6379> set name 111
OK
192.168.100.101:6379> keys *
1) "haha"
2) "name"
192.168.100.101:6379> exit
[root@redis redis]# reboot              ##重啟后驗(yàn)證key值是否還是存在
[root@redis redis]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> keys *
1) "haha"
2) "name"
192.168.100.101:6379> exit

四、AOF持久化方式配置;

[root@redis ~]# vi /usr/local/redis/redis.conf
218 #save 900 1
219 #save 300 10
220 #save 60 10000
672 appendonly yes ##開(kāi)啟AOF持久化方式
676 appendfilename "appendonly.aof" ##指定持久化的文件
702 appendfsync everysec ##頻率,具體參數(shù)見(jiàn)下方表一
724 no-appendfsync-on-rewrite no ##如若設(shè)置為yes,則redis執(zhí)行的命令會(huì)存放到緩沖區(qū),待系統(tǒng)自動(dòng)同步到硬盤(pán)
743 auto-aof-rewrite-percentage 100 ##若當(dāng)前寫(xiě)入的AOF文件達(dá)到了上次rewrite文件大小的100%,則觸發(fā)rewrite操作
744 auto-aof-rewrite-min-size 64mb ##設(shè)置AOF持久化重寫(xiě)文件的最小值,當(dāng)達(dá)到60M并且符合100%的條件時(shí),則觸發(fā)rewrite操作
Redis數(shù)據(jù)庫(kù)持久化
AOF 文件的生成過(guò)程具體包括命令追加,文件寫(xiě)入,文件同步三個(gè)步驟。?
Redis 打開(kāi) AOF 持久化功能后,Redis 在執(zhí)行完一個(gè)寫(xiě)命令后,都會(huì)將執(zhí)行的寫(xiě)命令追回到 Redis 內(nèi)部的緩沖區(qū)的末尾。這個(gè)過(guò)程是命令的追加過(guò)程。?接下來(lái),緩沖區(qū)的寫(xiě)命令會(huì)被寫(xiě)入到 AOF 文件,這一過(guò)程是文件寫(xiě)入過(guò)程。對(duì)于操作系統(tǒng)來(lái)說(shuō),調(diào)用write函數(shù)并不會(huì)立刻將數(shù)據(jù)寫(xiě)入到硬盤(pán),為了將數(shù)據(jù)真正寫(xiě)入硬盤(pán),還需要調(diào)用fsync函數(shù),調(diào)用fsync函數(shù)即是文件同步的過(guò)程。只有經(jīng)過(guò)文件同步過(guò)程,AOF 文件才在硬盤(pán)中真正保存了 Redis 的寫(xiě)命令。appendfsync 配置選項(xiàng)正是用來(lái)配置將寫(xiě)命令同步到文件的頻率的,各個(gè)選項(xiàng)的值的含義如表 1 所示。而值為no的話表示為寫(xiě)入AOF文件,但是不進(jìn)行磁盤(pán)同步,根據(jù)linux系統(tǒng)默認(rèn)進(jìn)行磁盤(pán)同步,默認(rèn)30s,效率是最高的;

[root@redis ~]# /etc/init.d/redis restart
[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> keys *
1) "haha"
2) "name"
192.168.100.101:6379> set benet cloud
OK
192.168.100.101:6379> keys *
1) "benet"
2) "haha"
3) "name"
192.168.100.101:6379> get benet
"cloud"
192.168.100.101:6379> exit
[root@redis ~]# cat /root/appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
haha
$1
1
*3
$3
set
$4
name
$1
2
*3
$3
set
$5
benet
$4
accp
[root@redis ~]# reboot                          ##重啟后驗(yàn)證key是否存在
[root@redis ~]# /etc/init.d/redis restart
[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> keys *
1) "name"
2) "haha"
3) "benet"
192.168.100.101:6379> exit
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI