redis的RDB和AOF持久化具體操作

前言

如何去配置RDB和AOF的持久化???

RDB持久化

redis配置文件redis.conf,我的是/etc/redis/6379.conf,去配置持久化

舉例:save 60 1000
每個60s,如果有超過1000個key發生變化,就會新生成一個dump.rdb文件,相當於redis內存中完整快照,此操作被稱爲snapshotting,快照可以手動save或者bgsave,同步或者異步執行rdb快照

save可以設置多個,就是多個snapshotting檢查點,每到一個檢查點,都會去check一下,是否有指定的key數量發生了變更,如果有,就新生成一個dump.rdb文件

RDB持久化工作流程

  1. redis根據配置自己生成rdb快照文件
  2. fork一個子進程出來
  3. 子進程嘗試將數據dump到臨時的rdb快照文件中
  4. 完成rdb快照文件生成後,會替換掉之前舊的快照文件

RDB快照實驗

  1. redis-cli進行redis編輯
    在這裏插入圖片描述
  2. 執行 set k1 v1 set k2 v2
    在這裏插入圖片描述
  3. 查看redis快照生成,可以看到快照裏面已經有數據了
    在這裏插入圖片描述
  4. 我們平時停掉redis一般是redis-cli SHUTDOWN 和 kill -9 進程
    第一種是安全退出模式,redis中的數據已經保存下來,第二種是粗暴退出,已經是一種故障模式,是一種數據丟失的情況
  5. 往redis插入2條數據,直接粗暴停止,可以看到rdb文件中剛插入的兩條數據是不存在的
    在這裏插入圖片描述
  6. 此時,啓動redis(粗暴停止的情況下,要下刪除/var/run下的redis_6379.pid)
    此時可以看到剛粗暴停止前插入的k3是可以保存到內存中的在這裏插入圖片描述
  7. 如果要保證數據丟失的很少,可以將conf文件中的save 檢查點設置調小
    如 save 5 1 每5秒,有1條數據發生變化就保存新的rdb文件

AOF持久化

AOF持久化也是配置conf文件,默認是關閉的,RDB默認是打開
appendonly yes是打開AOF持久化

打開AOF持久化後,redis每接收到一條寫命令,就會寫入到日誌文件中,首先是先寫入os cache,然後每個一定時間在fsync一下

當同時打開AOF和RDB時,redis重啓的時候,也是優先通過AOF進行數據恢復的,因爲AOF數據較完整

配置AOF的fsync策略,有三種策略可以選擇,一種是每寫入一條就fsync一次,一種是每個一秒執行一次,一種是不主動執行
always:每寫入一條數據,立即將對應的寫命令fsync到磁盤上,性能非常差,吞吐量低,如果說確保一條不丟,就可以採取這樣的措施
everysec:每秒將os cache的數據fsync到磁盤,這個是最常用的,也是redis默認的,生產環境一般這樣配置,性能很高,QPS也可以達到上萬
no:僅僅redis負責將數據寫入os cache就不管了,然後os cache會根據自己的策略不定時的將數據寫入磁盤,不可控

AOF持久化工作流程

  1. redis foek一個子進程
  2. 子進程基於內存中的數據,構建日誌,開始往新的臨時的AOF文件中寫入日誌
  3. redis主進程,接收到client新的寫操作之後,在內存中寫入日誌,同時新的日誌也繼續寫入舊的AOF文件
  4. 子進程寫完新的日誌文件之後,redis主進程將內存中新日誌再次追加到新的AOF文件中
  5. 用新的日誌文件替換掉舊的日誌文件

AOF快照實驗

  1. 打開AOF開關之後,重啓redis,寫入數據,發現/var/redis/6379下面多了一個appendonly.aof文件,裏面也有我們剛寫入數據的內容
    在這裏插入圖片描述
  2. 這些日誌就是先寫入os cache中,然後1s後才fsync到磁盤中,這樣纔是一個安全的過程,不然只在os cache中,機器重啓,數據就沒了
  3. 我們kill -9殺掉redis進程後,重啓redis,發現數據是恢復回來的,就是從AOF文件中恢復的,redis進程啓動後,直接從appendonly.aof文件中加載所有日誌
    在這裏插入圖片描述

AOF rewrite

redis的數據是有限的,很多數據可能會自動過期,可能會被用戶刪除,可能會被redis用緩存清除算法清理掉

redis的數據會不斷淘汰舊的,就一部分常用的數據會自動保留到內存中

所以,很多之前已經被清理掉的數據,對應的寫日誌還停留在AOF文件,AOF文件就一個,會不斷變大

所以,AOF文件會自動在後臺每隔一定時間做rewrite操作,比如日誌存放了100W數據的寫日誌。redis 的內存只有10W,基於內存中的10W數據構建一套最新的日誌到AOF文件中,覆蓋之前的舊日誌,確保AOF文件不會太大

redis2.4之後,會自動進行rewrite操作

在redis的conf中,可以配置rewrite策略

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

比如說上一次AOF rewrite後,是128mb
然後會接着128mb繼續寫日誌,如果發現增長的比例,超過之前的的100%,256mb,就可能去觸發一次rewrite
但是此時,還要去跟min-size比較一次,256mb > 64mb,就會觸發rewrite

AOF文件修復

如果redis在append數據到AOF文件時,機器宕機,可能導致AOF文件破損,
可以用 redis-check-aof --fix 命令來修復破損的AOF文件

往redis插入2條數據,aof文件中也有2條
在這裏插入圖片描述
此時,刪除最後一行數據
在這裏插入圖片描述
修復破損aof文件
在這裏插入圖片描述
可以看到,他把有問題的key value都刪除了
在這裏插入圖片描述
然後,重啓之後,發現k2是不存在了
在這裏插入圖片描述

實驗所得

  1. 在有rdb的dump和aof的appendonly的同時,rdb裏有部分數據,aof裏有部分數據,這個時候發現,rdb的數據不會恢復到內存中
  2. 模擬讓aof破損,然後fix,有一條數據會被fix掉,就是刪除掉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章