溫馨提示×

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

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

redis演練(5) redis持久化

發(fā)布時(shí)間:2020-08-03 23:25:31 來(lái)源:網(wǎng)絡(luò) 閱讀:790 作者:randy_shandong 欄目:大數(shù)據(jù)

何謂持久化,就是媳婦讓你,持久一些。

說(shuō)白了持久化:就是將內(nèi)存中的數(shù)據(jù)保存到磁盤上的過(guò)程(數(shù)據(jù)庫(kù)也算磁盤的特殊表現(xiàn)),以保證宕機(jī)或斷電后,可以繼續(xù)訪問(wèn)。java中常見(jiàn)的持久化框架,如Hibernate,ibatis,jdbc都是持久化實(shí)現(xiàn)方式的一種,當(dāng)然普通文件保存功能也算。

拿memcached來(lái)說(shuō),memcached保存的信息,沒(méi)有進(jìn)行持久化,所以只能存活一個(gè)進(jìn)程生命期,下次重新啟動(dòng),數(shù)據(jù)全部丟失。這算memcached的一個(gè)缺點(diǎn)吧。redis提供了持久化支持,而且提供了2種持久化方案。

《redis演練系列》,立足于案例展示,通過(guò)形象,對(duì)比,圖示的方式,達(dá)到知識(shí)梳理過(guò)程。

本章的主要梗概。

  • redis兩種持久化方案對(duì)比

  • redis兩種持久化方案參數(shù)說(shuō)明

  • 演練RDB的觸發(fā)時(shí)機(jī)

  • 演練AOF

  • RDB VS AOF

1.redis兩種持久化方案對(duì)比

redis提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)。RDB,AOF就相當(dāng)于redis持久界的2個(gè)親兄弟,相互配合,相互提攜。當(dāng)然也會(huì)爭(zhēng)搶些資源。
RDB,簡(jiǎn)而言之,就是在不同的時(shí)間點(diǎn),將redis存儲(chǔ)的數(shù)據(jù)生成快照并存儲(chǔ)到磁盤等介質(zhì)上;
AOF,則是換了一個(gè)角度來(lái)實(shí)現(xiàn)持久化,那就是將redis執(zhí)行過(guò)的所有寫(xiě)指令記錄下來(lái),在下次redis重新啟動(dòng)時(shí),只要把這些寫(xiě)指令從前到后再重復(fù)執(zhí)行一遍,就可以實(shí)現(xiàn)數(shù)據(jù)恢復(fù)了。

RDB將服務(wù)器包含的所有數(shù)據(jù)庫(kù)數(shù)據(jù)以二進(jìn)制文件的形式保存到硬盤里面。

下圖,是具體操作步驟。具體詳情參見(jiàn)【http://www.cnblogs.com/luogankun/p/3986403.html】


 redis演練(5) redis持久化

AOF,英文是Append Only File,即只允許追加不允許改寫(xiě)的文件。AOF方式是將執(zhí)行過(guò)的寫(xiě)指令記錄下來(lái),在數(shù)據(jù)恢復(fù)時(shí)按照從前到后的順序再將指令都執(zhí)行一遍,就這么簡(jiǎn)單。有點(diǎn)數(shù)據(jù)庫(kù)軟件聯(lián)機(jī)日志的影子。

 redis演練(5) redis持久化

兩者對(duì)比

 redis演練(5) redis持久化

redis兩種持久化方案參數(shù)說(shuō)明

涉及到文件保存,一般要考慮以下幾個(gè)問(wèn)題,不僅僅限于redis。

  • 保存時(shí)機(jī):什么時(shí)候觸發(fā)。取決于數(shù)據(jù)一致性和效率的平衡

  • 保存目標(biāo)對(duì)象:日志,二進(jìn)制...

  • 保存目錄:本地目錄,還是共享目錄

  • 是否壓縮:節(jié)省空間

  • 是否校驗(yàn):考慮安全

  • 保存失敗處理機(jī)制:異常報(bào)告

  • 開(kāi)啟線程數(shù):決定速度,但會(huì)影響其他功能

  • 保存文件限制:超過(guò)大小,不允許;和不允許上傳*.exe文件等

帶著這些問(wèn)題,去扣相關(guān)的RDB參數(shù),和AOF參數(shù),問(wèn)題就簡(jiǎn)單多了。


RDB
# 存 DB 到磁盤:
#
#   格式:save <間隔時(shí)間(秒)> <寫(xiě)入次數(shù)>
#
#   根據(jù)給定的時(shí)間間隔和寫(xiě)入次數(shù)將數(shù)據(jù)保存到磁盤
#
#   下面的例子的意思是:
#   900 秒后如果至少有 1 個(gè) key 的值變化,則保存
#   300 秒后如果至少有 10 個(gè) key 的值變化,則保存
#   60 秒后如果至少有 10000 個(gè) key 的值變化,則保存
#
#   注意:你可以注釋掉所有的 save 行來(lái)停用保存功能。
#   也可以直接一個(gè)空字符串來(lái)實(shí)現(xiàn)停用:
#   save ""

save 900 1
save 300 10
save 60 10000

# 默認(rèn)情況下,如果 redis 最后一次的后臺(tái)保存失敗,redis 將停止接受寫(xiě)操作,
# 這樣以一種強(qiáng)硬的方式讓用戶知道數(shù)據(jù)不能正確的持久化到磁盤,
# 否則就會(huì)沒(méi)人注意到災(zāi)難的發(fā)生。
#
# 如果后臺(tái)保存進(jìn)程重新啟動(dòng)工作了,redis 也將自動(dòng)的允許寫(xiě)操作。
#
# 然而你要是安裝了靠譜的監(jiān)控,你可能不希望 redis 這樣做,那你就改成 no 好了。
stop-writes-on-bgsave-error yes

# 是否在 dump .rdb 數(shù)據(jù)庫(kù)的時(shí)候使用 LZF 壓縮字符串
# 默認(rèn)都設(shè)為 yes
# 如果你希望保存子進(jìn)程節(jié)省點(diǎn) cpu ,你就設(shè)置它為 no ,
# 不過(guò)這個(gè)數(shù)據(jù)集可能就會(huì)比較大
rdbcompression yes

# 是否校驗(yàn)rdb文件
rdbchecksum yes

# 設(shè)置 dump 的文件位置
dbfilename dump.rdb

# 工作目錄
# 例如上面的 dbfilename 只指定了文件名,
# 但是它會(huì)寫(xiě)入到這個(gè)目錄下。這個(gè)配置項(xiàng)一定是個(gè)目錄,而不能是文件名。
dir ./
AOF

    #默認(rèn)情況下Redis會(huì)異步的將數(shù)據(jù)導(dǎo)出到磁盤上。這種模式對(duì)許多應(yīng)用程序已經(jīng)足夠了,  
    #但是如果斷電或者redis進(jìn)程出問(wèn)題就會(huì)導(dǎo)致一段時(shí)間內(nèi)的更新數(shù)據(jù)丟失(取決與配置項(xiàng))  
    #  
    #這種只增文件是可選的能夠提供更好的體驗(yàn)的數(shù)據(jù)持久化策略。  
    #舉個(gè)例子,如果使用默認(rèn)的配置數(shù)據(jù)fsync策略,在服務(wù)器意外斷電的情況下redis只會(huì)丟失一秒中內(nèi)的更新數(shù)據(jù),  
    #或者當(dāng)redis進(jìn)程出問(wèn)題但操作系統(tǒng)運(yùn)轉(zhuǎn)正常時(shí),redis只會(huì)丟失一個(gè)數(shù)據(jù)更新操作。  
    #  
    #AOF 和 RDB 持久化方式可以同時(shí)啟動(dòng)并且無(wú)沖突。  
    #如果AOF開(kāi)啟,啟動(dòng)redis時(shí)會(huì)加載aof文件,這些文件能夠提供更好的保證。  
    #請(qǐng)?jiān)?http://redis.io/topics/persistence 獲取更多數(shù)據(jù)持久化信息。  
      
    appendonly no  
      
    # 只增文件的文件名稱。(默認(rèn)是appendonly.aof)  
    # appendfilename appendonly.aof  
      
    #調(diào)用fsync()函數(shù)會(huì)通知操作系統(tǒng)真正將數(shù)據(jù)寫(xiě)入磁盤,而不是等待緩沖區(qū)中有更多數(shù)據(jù)。  
    #有些操作系統(tǒng)會(huì)將數(shù)據(jù)輸出到磁盤,有些操作系統(tǒng)只是ASAP。  
    #  
    #redis支持三種不同的方式:  
    #  
    #no:不調(diào)用,之等待操作系統(tǒng)來(lái)清空緩沖區(qū)當(dāng)操作系統(tǒng)要輸出數(shù)據(jù)時(shí)。很快。  
    # always: 每次更新數(shù)據(jù)都寫(xiě)入僅增日志文件。慢,但是最安全。  
    # everysec: 每秒調(diào)用一次。折中。  
    #  
    #默認(rèn)是每秒中一次,因?yàn)樗窃谒俣群蛿?shù)據(jù)安全兩者之間的折中選擇。  
    #如果你可以接受讓操作系統(tǒng)去自動(dòng)清空緩存,你可以將這項(xiàng)配置降低到'no'(如果你可以接受一段時(shí)間的數(shù)據(jù)丟失,默認(rèn)的rdb就足夠了),  
    #這完全取決與你。如果你想要一個(gè)更好的體驗(yàn)或者從相反的角度,使用'always',這樣會(huì)很慢,但是比'everysec'安全些。  
    #  
    #請(qǐng)?jiān)谙旅娴奈恼轮蝎@取更多細(xì)節(jié)知識(shí):  
    #  http://antirez.com/post/redis-persistence-demystified.html  
    #  
    #如果你不是很清楚這三項(xiàng)之間的區(qū)別,或者不知道哪種適合你的機(jī)器,就是用默認(rèn)吧。  
      
    # appendfsync always  

    appendfsync everysec  

    # appendfsync no 


      
    #當(dāng)AOF策略設(shè)置為'always'或者'everysec'的時(shí)候,后臺(tái)的保存進(jìn)程會(huì)進(jìn)行很多磁盤I/O操作,  
    #在某些linux結(jié)構(gòu)中redis會(huì)在調(diào)用sync()方法時(shí)阻塞很長(zhǎng)時(shí)間。記住,現(xiàn)在還沒(méi)辦法解決這個(gè)問(wèn)題,即使在不同進(jìn)程中進(jìn)行調(diào)用也會(huì)block。  
    #  
    #使用如下配置可能會(huì)緩解這個(gè)問(wèn)題,這樣會(huì)在存儲(chǔ)大數(shù)據(jù)或者BIGREWRITEAOF的時(shí)候不會(huì)在主進(jìn)程中調(diào)用fsync()方法。  
    #  
    # 這表示,如果另外一個(gè)子進(jìn)程在進(jìn)行保存操作,redis的表現(xiàn)如同配置為‘a(chǎn)ppendfsync no’。  
    #在實(shí)際應(yīng)用中,這表示在最壞的情景下(使用linux默認(rèn)配置)可能會(huì)丟失30秒日志。  
    #   
    #如果你有特殊的情況可以配置為'yes'。但是配置為'no'是最為安全的選擇。  
    no-appendfsync-on-rewrite no  
      
      
    #自動(dòng)重寫(xiě)只增文件。  
    #redis可以自動(dòng)盲從的調(diào)用‘BGREWRITEAOF’來(lái)重寫(xiě)日志文件,如果日志文件增長(zhǎng)了指定的百分比。  
    #   
    #它是這樣工作的:每次rewrite后redis會(huì)記錄日志文件的大小。(如果重啟后沒(méi)有重寫(xiě)后的大小,就默認(rèn)用日志文件大?。? 
    #  
    # 這個(gè)基準(zhǔn)日志大小和當(dāng)前日志大小做比較。如果當(dāng)前大小比指定的百分比,重寫(xiě)機(jī)制就會(huì)被觸發(fā)。  
    #同時(shí),你也要制定一個(gè)重寫(xiě)下線,用來(lái)避免增長(zhǎng)百分比夠了,但是日志文件還很小的情況。  
    #  
    #指定百分比為0可以注掉自動(dòng)重寫(xiě)日志文件功能。       
    auto-aof-rewrite-percentage 100  

    auto-aof-rewrite-min-size 64mb

#redis在啟動(dòng)的時(shí)候可以加載被截?cái)嗟腁OF文件,默認(rèn)啟用;    (3.0以后才支持)

aof-load-truncated yes     



2.演練RDB的觸發(fā)時(shí)機(jī)


#   900 秒后如果至少有 1 個(gè) key 的值變化,則保存
#   300 秒后如果至少有 10 個(gè) key 的值變化,則保存
#   60 秒后如果至少有 10000 個(gè) key 的值變化,則保存
#   注意:你可以注釋掉所有的 save 行來(lái)停用保存功能。
#   也可以直接一個(gè)空字符串來(lái)實(shí)現(xiàn)停用:
#   save ""
save 900 1
save 300 10
save 60 10000

采用默認(rèn)的RDB配置

redis.conf

save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
dbfilename dump.rdb
dir ./

2.1演練“重啟redis,鍵值丟失”

[root@hadoop2 redis]# bin/redis-cli  -h  192.168.163.156

192.168.163.156:6379> flushdb
OK
192.168.163.156:6379> set blog "blog.51cto.com"
OK
#為鍵賦值
192.168.163.156:6379> get blog
"blog.51cto.com"
192.168.163.156:6379> exit
[root@hadoop2 redis]# ps -ef |grep redis
root      2546     1  0 07:42 ?        00:00:05 /usr/local/redis/bin/redis-server 192.168.163.156:6379       
root      3235  2517  0 08:54 pts/0    00:00:00 grep redis
[root@hadoop2 redis]# kill -9 2546
#重啟redis
[root@hadoop2 redis]# bin/redis-server  redis.conf 
[root@hadoop2 redis]# bin/redis-cli  -h  192.168.163.156
# blog鍵值丟失
192.168.163.156:6379> get blog
(nil)

這個(gè)結(jié)果,是不是非常出人意外??磥?lái)“江湖上都傳言,redis斷電鍵值不丟失”有點(diǎn)問(wèn)題。

其實(shí),沒(méi)問(wèn)題。是上面的演練存在不足,數(shù)據(jù)量沒(méi)有達(dá)到觸發(fā)時(shí)機(jī)要求。繼續(xù)。

2.2演練“重啟redis,鍵值不丟失”

[root@hadoop2 redis]# bin/redis-cli  -h  192.168.163.156
192.168.163.156:6379> set blog "blog.51cto.com"
OK
#借助自帶測(cè)試工具,發(fā)送1w請(qǐng)求,觸發(fā)RDB保存
[root@hadoop2 redis]# bin/redis-benchmark  -r 10000 -h 192.168.163.156
====== PING_INLINE ======
  100000 requests completed in 0.83 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.77% <= 1 milliseconds
...
# 確認(rèn)  鍵值還存在
[root@hadoop2 redis]# bin/redis-cli  -h  192.168.163.156
192.168.163.156:6379> get blog
"blog.51cto.com"
192.168.163.156:6379> exit
#關(guān)閉 redis服務(wù)
[root@hadoop2 redis]# ps -ef |grep redis
root      3241     1  3 08:54 ?        00:00:19 bin/redis-server 192.168.163.156:6379
root      3351  2517  0 09:05 pts/0    00:00:00 grep redis
[root@hadoop2 redis]# kill -9 3241
#重啟redis服務(wù)
[root@hadoop2 redis]# bin/redis-server  redis.conf 
#確認(rèn)重啟后,blog鍵值依然存在
[root@hadoop2 redis]# bin/redis-cli  -h  192.168.163.156
192.168.163.156:6379> get blog
"blog.51cto.com"

看來(lái)“江湖上都傳言,redis斷電鍵值不丟失”,是有前提條件的。

3.演練AOF

 修改redis.conf 開(kāi)啟AOF 關(guān)閉RDB

save 900 1
save 300 10
save 60 10000
save ""
stop-writes-on-bgsave-error yes
rdbcompression yes
dbfilename dump.rdb
dir ./

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 16mb
aof-load-truncated yes

3.1演練重啟redis,鍵值是否丟失

192.168.163.156:6379> set blog "blog.51cto.com"
OK
192.168.163.156:6379> exit
[root@hadoop2 redis]# pkill redis
#重啟
[root@hadoop2 redis]# bin/redis-server  redis.conf 
[root@hadoop2 redis]# bin/redis-cli  -h  192.168.163.156
#鍵值未丟失
192.168.163.156:6379> get blog
"blog.51cto.com"

結(jié)論:托AOF的福,鍵值沒(méi)有丟失,和RDB不同。原因是兩者的觸發(fā)時(shí)機(jī)不同。

這時(shí)候,確認(rèn)下生產(chǎn)AOF文件

#僅僅存了一條記錄
[root@hadoop2 redis]# ll
-rw-r--r--. 1 root root    67 9月   3 10:31 appendonly.aof
#查看日志內(nèi)容(為文本文件)
[root@hadoop2 redis]# cat appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
blog
$14
blog.51cto.com

3.2演練重啟AOF重寫(xiě)效果

通過(guò)查看日志內(nèi)容,可以確認(rèn)存放的是操作命令日志。這勢(shì)必導(dǎo)致文件大小增長(zhǎng)過(guò)快,這和RDB文件不同。RDB存儲(chǔ)的是二進(jìn)制文件,而且是某時(shí)刻的快照,存儲(chǔ)的本身就是面向內(nèi)存結(jié)果。稍后會(huì)提供例子演示下RDB的內(nèi)容。

準(zhǔn)備測(cè)試數(shù)據(jù)

[root@hadoop2 redis]# bin/redis-cli  -h  192.168.163.156
#順序操作鍵值多次
192.168.163.156:6379> set year 2001
OK
192.168.163.156:6379> incr year
(integer) 2002
192.168.163.156:6379> incr year
(integer) 2003
192.168.163.156:6379> incr year
(integer) 2004
192.168.163.156:6379> incr year
(integer) 2005
192.168.163.156:6379> incr year
(integer) 2006
192.168.163.156:6379> incr year
(integer) 2007
192.168.163.156:6379> incr year
(integer) 2008
192.168.163.156:6379> incr year
(integer) 2009
192.168.163.156:6379> incr year
(integer) 2010
192.168.163.156:6379> get year
"2010"
# get沒(méi)有輸出到AOF日志
[root@hadoop2 redis]# cat appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
blog
$14
blog.51cto.com
*2
$6
SELECT
$1
0
*3
$3
set
$4
year
$4
2001
*2
$4
incr
$4
year
*2
$4
incr
$4
year
*2
$4
incr
$4
year
*2
$4
incr
$4
year
*2
$4
incr
$4
year
*2
$4
incr
$4
year
*2
$4
incr
$4
year
*2
$4
incr
$4
year
*2
$4
incr
$4
year

#接下來(lái),借助benchmark工具,批量插入數(shù)據(jù),觸發(fā)AOF文件重寫(xiě)
[root@hadoop2 redis]# bin/redis-benchmark  -r 20000 -h 192.168.163.156

#appendonly.aof文件變化過(guò)程(11M->27M -->32M->33M->42M->8.5M.
...
[root@hadoop2 redis]# ll appendonly.aof  -h
-rw-r--r--. 1 root root 11M 9月   3 11:03 appendonly.aof
-rw-r--r--. 1 root root 27M 9月   3 11:03 appendonly.aof
[root@hadoop2 redis]# ll appendonly.aof  -h
-rw-r--r--. 1 root root 32M 9月   3 11:04 appendonly.aof
[root@hadoop2 redis]# ll appendonly.aof  -h
-rw-r--r--. 1 root root 33M 9月   3 11:04 appendonly.aof
[root@hadoop2 redis]# ll appendonly.aof  -h
-rw-r--r--. 1 root root 36M 9月   3 11:04 appendonly.aof
[root@hadoop2 redis]# ll appendonly.aof  -h
-rw-r--r--. 1 root root 42M 9月   3 11:04 appendonly.aof
[root@hadoop2 redis]# ll appendonly.aof  -h
-rw-r--r--. 1 root root 44M 9月   3 11:04 appendonly.aof
[root@hadoop2 redis]# ll appendonly.aof  -h
-rw-r--r--. 1 root root 8.5M 9月   3 11:04 appendonly.aof
[root@hadoop2 redis]# ll appendonly.aof  -h
-rw-r--r--. 1 root root 11M 9月   3 11:04 appendonly.aof
[root@hadoop2 redis]# ll appendonly.aof  -h
-rw-r--r--. 1 root root 15M 9月   3 11:04 appendonly.aof

從42M 突然變成了8.5M,明顯發(fā)生了AOF重寫(xiě)操作。

以year為目標(biāo),確認(rèn)下AOF重寫(xiě)發(fā)生了什么。

 redis演練(5) redis持久化

重寫(xiě)前后,發(fā)現(xiàn)將多次操作的結(jié)果,轉(zhuǎn)換為一個(gè)等價(jià)的命令,大大降低了存儲(chǔ)空間。

1.我們也可以使用bgrewriteaof來(lái)手動(dòng)觸發(fā)AOF的自動(dòng)重寫(xiě)。

2 .調(diào)用 BGSAVE 能手動(dòng)觸發(fā)快照保存,保存快照。

但線上環(huán)境要注意,阻塞情況。


4.AOF VS RDB.

兩種持久化方式,不是水火不容,而是相互扶持,相融以沫。

官方文檔,建議兩者同時(shí)開(kāi)啟

同時(shí)開(kāi)啟兩種持久化(redis.conf)

save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
dbfilename dump.rdb
dir ./

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 16mb
aof-load-truncated yes

4.1比較2種方式的文件存儲(chǔ)

1.刪除rdb,aof文件
2.重啟redis-server
#3.批量發(fā)送1w條請(qǐng)求
[root@hadoop2 redis]# bin/redis-benchmark  -r 10000 -h 192.168.163.156
#4. 比較2個(gè)文件大小
[root@hadoop2 redis]# ll -h
總用量 29M
-rw-r--r--. 1 root root  192 9月   3 10:58 1
-rw-r--r--. 1 root root  28M 9月   3 11:26 appendonly.aof
-rw-r--r--. 1 root root 457K 9月   3 11:26 dump.rdb

4.2 演練aof文件損壞

[root@hadoop2 redis]# bin/redis-server  redis.conf 
[root@hadoop2 redis]# bin/redis-cli  -h 192.168.163.156
192.168.163.156:6379> set blog "blog.51cto.com"
OK
192.168.163.156:6379> set subject "redis"
OK

192.168.163.156:6379> set year 2016
OK
192.168.163.156:6379> keys *
1) "year"
2) "subject"
3) "blog"

手動(dòng)修改下appendonly.aof 文件

 redis演練(5) redis持久化

使用redis-check-aof 驗(yàn)證下,果然不出所料“文件有問(wèn)題”

[root@hadoop2 redis]# bin/redis-check-aof 
Usage: bin/redis-check-aof [--fix] <file.aof>
[root@hadoop2 redis]# bin/redis-check-aof  appendonly.aof 
0x               0: Expected \r\n, got: 0a00
AOF analyzed: size=112, ok_up_to=0, diff=112
AOF is not valid

...查看啟動(dòng)日志(WARRING 暫時(shí)先放著)

4690:M 03 Sep 11:42:12.213 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4690:M 03 Sep 11:42:12.213 # Server started, Redis version 3.2.3
4690:M 03 Sep 11:42:12.213 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
4690:M 03 Sep 11:42:12.214 # Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>

客戶端連接失敗

[root@hadoop2 redis]# bin/redis-cli  -h 192.168.163.156
Could not connect to Redis at 192.168.163.156:6379: Connection refused

修復(fù)aof文件

[root@hadoop2 redis]# bin/redis-check-aof
Usage: bin/redis-check-aof [--fix] <file.aof>
[root@hadoop2 redis]# bin/redis-check-aof --fix appendonly.aof
0x               0: Expected \r\n, got: 0a00
AOF analyzed: size=112, ok_up_to=0, diff=112
This will shrink the AOF from 112 bytes, with 112 bytes, to 0 bytes
Continue? [y/N]: y

Successfully truncated AOF

#修復(fù)的結(jié)果是清空了AOF文件。

重啟成功了,但遺憾的是數(shù)據(jù)全丟失了。

bin/redis-server  redis.conf

[root@hadoop2 redis]# cat appendonly.aof

bin/redis-cli  -h  192.168.163.156
192.168.163.156:6379> keys *
(empty list or set)

當(dāng)然,演示AOF文件出問(wèn)題,這是個(gè)比較嚴(yán)重的問(wèn)題??梢?jiàn)備份的重要性。


AOF方式的另一個(gè)好處,我們通過(guò)一個(gè)“場(chǎng)景再現(xiàn)”來(lái)說(shuō)明。某同學(xué)在操作redis時(shí),不小心執(zhí)行了FLUSHALL,導(dǎo)致redis內(nèi)存中的數(shù)據(jù)全部被清空了,這是很悲劇的事情。不過(guò)這也不是世界末日,只要redis配置了AOF持久化方式,且AOF文件還沒(méi)有被重寫(xiě)(rewrite),我們就可以用最快的速度暫停redis并編輯AOF文件,將最后一行的FLUSHALL命令刪除,然后重啟redis,就可以恢復(fù)redis的所有數(shù)據(jù)到FLUSHALL之前的狀態(tài)了。是不是很神奇,這就是AOF持久化方式的好處之一。但是如果AOF文件已經(jīng)被重寫(xiě)了,那就無(wú)法通過(guò)這種方法來(lái)恢復(fù)數(shù)據(jù)了。

前人,曾靜曰過(guò)的。難道有問(wèn)題。于是我重新實(shí)驗(yàn)了下。

這次我加快了速度,立刻關(guān)閉redis服務(wù),以及使用vi命令直接修改aof文件。結(jié)果卻是可以將數(shù)據(jù)恢復(fù)。

這個(gè)演示不補(bǔ)貼了。


正是有了持久化,才使redis向“存儲(chǔ)”靠近了一大步,數(shù)據(jù)可靠性提供了保證。

友情提示,演練文章,最好配合官方理論說(shuō)明性文檔一同觀看,效果顯著。

向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