大數據必學:redis深入了解 Redis 的持久化機制(RDB、AOF)

2021-01-09 跟著巨嬰去逆襲

因為 redis是一個內存資料庫,所有數據都存儲在內存中,而且內存中的數據非常容易丟失,所以 redis的數據持久化就變得非常重要, redis提供了兩種數據持久化方法,分別用於 RDB和 AOF,而 redis默認用於 RDB的數據持久化方法。

一、RDB持久性方案簡介

RDB方案簡介:

Redis將定期將數據快照保存到 rdb文件中,並在啟動時自動裝入 rdb文件,以恢復之前保存的數據。可將 Redis配置為在配置文件中保存快照。

save [seconds] [changes]

意思是[seconds]秒內如果發生了[changes]次數據修改,則進行一次RDB快照保存,例如:

save 60 100

每隔60秒 Redis就會檢查一次數據更改,如果發生了100次或更多的數據更改,將保存 RDB快照。多個 save指令可以進行配置, Redis可以執行多層快照保存策略。默認打開 RDB快照。RDB快照保存還可以通過 SAVE或 BGSAVE命令手動觸發。

在 SAVE和 BGSAVE命令中, rdbSave函數都被調用,但是它們以不同的方式調用:

1、在保存完成之前, SAVE直接調用 rdbSave來阻塞 Redis主進程。伺服器無法在主進程阻塞期間處理客戶機的任何請求。

2、而 BGSAVE則把子進程 fork出來,該進程負責調用 rdbSave,並在保存完成後向主進程發出通知,告知保存完成。在 BGSAVE執行過程中, Redis伺服器仍可繼續處理客戶機請求。

RDB方案好處:

1、最低限度的性能影響。如前所述,當保存 RDB快照時, Redis將對 fork出子進程執行,這幾乎不會影響 Redis處理客戶機請求的效率。

2、每一張快照都會產生一個完整的數據快照文件,因此可以用其他方法來同時保存多個時間點的快照(例如將每天0點的快照備份到其他存儲介質),作為非常可靠的災難恢復方法。

3、與 AOF相比,使用 RDB文件的數據恢復更快

RDB模式缺陷:

1、快照是定期生成的,因此當使用 Redis crash時,數據的一部分或多或少會丟失。

2、當數據集非常大, CPU不夠強時(例如單核 CPU), Redis可能會花費相對較長的 fork子進程時間,從而影響 Redis外部服務的提供。

RDB方案配置:

修改redis的配置文件:

重啟 redis Service每生成一個新的 dump. rdb,就覆蓋以前的舊快照

二、AOF持久化方案簡介

1、AOF方案簡介:

AOF (append only file)持久化:將每個寫入命令以獨立日誌的方式記錄下來,重啟後再重新執行 AOF文件中的命令,以實現數據恢復。AOF的主要功能是處理數據持久的實時性,目前, AOF已成為 Redis持久性的主流方式。了解掌握 AOF的持久性機制對於我們處理數據安全和性能方面非常有幫助。

2、運用AOF:

打開 AOF功能要求進行設置配置: appendonlyyes,默認不啟用。通過 appendfilename配置設置 AOF文件名,默認的文件名是appendonly.ao f。通過 dir配置指定,保存路徑與 RDB持久化方式一致。AOF工作流程操作 :命令寫入(append),文件同步(sync),文件重寫(rewrite),重新啟動裝載(load),如圖所示。

執行流程:

1、所有的寫入命令會追加到aof_buf(緩衝區)中。

2、根據相應的策略, AOF緩衝區對硬碟進行同步操作。

3、當 AOF文件變得更大時,需要定期重寫 AOF文件,以實現壓縮。

4、重啟 Redis伺服器後,可以加載用於數據恢復的 AOF文件。

3、文件同步:

Redis提供了多種 AOF緩衝同步文件策略,這些策略由 appendfsync參數控制,圖中顯示了不同值的含義。

3.1、當配置為 always時,每次寫入都會同步 AOF文件,而在普通 SATA硬碟上, Redis只支持大約數百 TPS寫入,這顯然與 Redis的高性能特性背道而馳,因此不推薦使用。

3.2、配置為 no,因為作業系統對 AOF文件的每一次同步都是不可控制的周期,並且會增加每一次同步硬碟的數據量,雖然提高了性能,但是數據安全沒有保障。

3.3、配置為everysec,建議採用同步策略和默認策略,以兼顧性能和數據安全。

4、重寫機制:

AOF會隨著命令的執行而變大,為了解決這個問題, Redis引入了 AOF覆蓋機制來壓縮文件。AOF文件覆蓋是將 Redis進程中的數據轉換成寫入命令,使其與新 AOF文件同步的過程。

為什麼覆蓋了 AOF的文件可以變小?原因如下:

1、已在進程中超時的數據不再寫入文件。

2、以前的 AOF文件中包含諸如 delkey1, hdelkey2, srem keys,seta111, seta222等等無效命令。覆蓋直接使用進程中的數據生成,因此新的 AOF文件只保存最終數據的寫入命令。

3、可以將多個寫命令合併成一個,例如: lpush list a,、lpush list b、lpush list c可轉換為: lpush list a b c 。為避免單個命令太大導致客戶端緩衝區溢出,對於 list, set, hash, zset之類的類型操作,將多個元素分割成64個界限。

AOF重寫減少了文件佔用空間,除此之外,還有另外一個目的: Redis可以更快地加載更小的 AOF文件。

可手動或自動觸發 AOF重寫過程:

手動觸發:直接調用命令 bgrewriteaof。

自動觸發:Auto-aof-rewrite-min-size和Auto-aof-rewrite-percentage參數決定了自動觸發的時間點。

解釋:

1、auto-aof-rewrite-min-size:表示在運行 AOF覆蓋時,文件的最小體積,默認值為64 MB。

2、auto-aof-rewrite-percentage:表示 AOF文件空間(aof_current_size)與上次重寫後的 AOF文件空間之間的比值。

3、自動觸發時機=aof_current_size>auto-aof-rewrite-min-size&&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewrite-percentage

AOF場景配置:

1、在 redis中, aof的持久化機制默認關閉2、AOF持久化默認為關閉的 ,RDB持久化默認為打開

3、appendonly yes,能夠打開 AOF持久機制,在生產環境中,通常 AOF都會被打開,除非你不介意數據被隨意丟失幾分鐘

4、在打開 AOF持久化機制後, redis每次收到寫命令時,都會將其寫入日誌文件,當然是先寫入 os cache,然後每隔一段時間再進行 fsync5、當 AOF和 RDB都打開並且 redis重新啟動時,優先使用 AOF恢復數據,因為 aof數據比較完整

AOF的 fsync策略可以進行配置,有三種策略可供選擇:

1、一種是每次寫入數據時都執行一次 fsync。

2、另一種是每隔一秒執行一次 fsync。

3、另一種是不主動執行 fsync。

always:每寫一次,就把相應於該數據的寫日誌 fsync放到磁碟上,性能非常糟糕,吞吐量也很低;要確保說 redis中的一個數據不會丟失,只能這樣。redis中的默認 AOF持久性機制全部關閉

Redis的AOF持久化機制配置:

重新啟動 redis實例,並在執行簡單操作後關閉該實例,重新啟動 redis實例。

三、重啟加載流程:

如果覺得對你有所幫助。記得收藏和關注呦!(每日更新各種大數據框架)如需轉載請註明出處(創作不易請見諒)和巨嬰程序猿一起成長。讓自己變得更優秀想了解更多精彩內容,快來關注跟著巨嬰去逆襲我最近一直在思考(大數據通俗講解)的問題,你的看法是什麼呢?關注我快說出來一起交流一下吧~

相關焦點

  • Redis RDB與AOF模式下的持久化原理
    前言:在此之前,如果還不了解Redis的,或者不知道怎麼使用Redis,可以參考官網網站:https://redis.io/documentation自行學習,本文主要針對Redis的核心點之一:RDB和AOF持久化模式進行展開。
  • redis - aof持久化介紹
    AOF簡介redis持久化存儲的方式有rdb序列化存儲和aof(append only file)。aof就是將操作和數據以格式化指令的方式追加到操作日誌的尾部,在append操作返回後,才進行實際的數據變更。
  • 詳解Redis中兩種持久化機制RDB和AOF(面試常問,工作常用)
    redis是一個內存資料庫,數據保存在內存中,但是我們都知道內存的數據變化是很快的,也容易發生丟失。幸好Redis還為我們提供了持久化的機制,分別是RDB(Redis DataBase)和AOF(Append Only File)。在這裡假設你已經了解了redis的基礎語法,某字母網站都有很好的教程,可以去看。基本使用的文章就不寫了,都是一些常用的命令。
  • 面試必問的 Redis:RDB、AOF、混合持久化
    所以通常可能設置至少5分鐘才保存一次快照,這時如果 Redis 出現宕機等情況,則意味著最多可能丟失5分鐘數據。  2)RDB 保存時使用 fork 子進程進行數據的持久化,如果數據比較大的話,fork 可能會非常耗時,造成 Redis 停止處理服務N毫秒。如果數據集很大且 CPU 比較繁忙的時候,停止服務的時間甚至會到一秒。
  • 詳解Redis持久化(RDB和AOF)
    AOF持久化的實現(1)命令追加(append):Redis 伺服器每執行一條寫命令,這條寫命令都會被追加到緩存區 aof_buf 中。(避免每次執行的命令都直接寫入硬碟中,會導致硬碟 I/O 的負載過大,使得性能下降。)
  • Redis教程:Redis持久化方式
    使用 Redis 附帶的 redis-check-aof 程序,對原來的 AOF 文件進行修復: redis-check-aof –x(可選)使用 di -u 對比修復後的 AOF 文件和原始 AOF 文件的備份,查看兩個文件之間的不同之處。重啟 Redis 伺服器,等待伺服器載入修復後的 AOF 文件,並進行數據恢復。
  • Redis持久化和備份
    Redis 持久化在了解Redis持久化前,我們先來看看數據損壞的概念來幫助我們更好的理解後續的問題。數據損壞所謂數據損壞,就是數據無法恢復,比如我們可能一次寫請求會進行兩次不同的寫操作,當意外發生時,可能會導致一次寫操作安全完成,但是另一次還沒有進行。如果資料庫的數據文件結構組織不合理,可能就會導致數據完全不能恢復的狀況出現。
  • 面試常問道:Redis持久化之AOF
    既然AOF數據安全性更高,是否可以只使用AOF呢?為什麼Redis推薦RDB和AOF同時開啟呢?我們再深入考量一下這兩種實現方式:RDB保存的是最終的數據,是一個最終狀態,而AOF保存的是達到這個最終狀態的過程。
  • 面試官:說下 Redis 是如何保證在宕機後數據不丟失的
    首先我們說下什麼是持久化,持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。通俗的講,就是瞬時數據(比如內存中的數據,是不能永久保存的)持久化為持久數據(比如持久化至資料庫中,能夠長久保存)。另外我們使用的 Redis 之所以快就是因為數據都存儲在內存當中,為了保證在伺服器出現異常過後還能恢復數據,所以就有了 Redis 的持久化。
  • 機率大的 Redis 面試題(含答案)|內存|key|原子性|哈希|redis_網易...
    單線程的redis為什麼這麼快redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構redis的過期策略以及內存淘汰機制【~】Redis 為什麼是單線程的,優點如何解決redis的並發競爭key問題Redis 集群方案應該怎麼做?都有哪些方案?有沒有嘗試進行多機redis 的部署?如何保證數據一致的?對於大量的請求怎麼樣處理Redis 常見性能問題和解決方案?
  • Redis如何存儲和計算一億用戶的活躍度
    Redis是一個內存資料庫,採用單線程和事件驅動的機制來處理網絡請求。實際生產的QPS和TPS單臺都能達到3,4W,讀寫性能非常棒。用來存儲一些對核心業務弱影響的用戶狀態信息還是非常不錯的。對於這題,有2個重要的點需要考慮:1.如何用合適的數據類型來存儲1億用戶的數據,用普通的字符串來存儲肯定不行。
  • redis cluster 之master 選舉過程
    在redis 3.0版本後,官方推出了redis cluster 分布式解決方案,當一個redis節點掛了可以快速地切換到另一個節點。當遇到單機內存、並發等瓶頸時,可以採用分布式方案要解決問題.在cluster架構下,默認的,一般redis-master用於接收讀寫,而redis-slave則用於備份,當有請求是在向slave發起時,會直接重定向到對應key所在的master來處理。但如果不介意讀取的是redis-cluster中有可能過期的數據並且對寫請求不感興趣時,則亦可通過readonly命令,將slave設置成可讀,然後通過slave獲取相關的key,達到讀寫分離。
  • redis cluster 集群管理工具
    前言在redis源碼編譯的時候,在src目錄下會有一個redis-trib.rb的腳本,這個腳本是ruby寫的,用於管理redis cluster。安裝系統依賴包yum -y install epel-release yum -y install ruby rubygem-redis redis-trib.rb/opt/redis/bin/redis-trib.rb
  • Redis中的過期鍵以及如何刪除的?
    1 伺服器中的資料庫Redis伺服器將所有資料庫都保存在伺服器狀態redis.h/redisServer結構的db數組中,db數組的每個項都是一個redis.h/redisDb結構,每個redisDb結構代表一個資料庫:struct redisServer {//一個數組,保存著伺服器中的所有資料庫redisDb *db;
  • 微信附近的人,用redis也能實現?(GEO)
    獲取自己的位置附近的人其實就是一種位置的比對關係,所以第一步是得獲取自己的位置,一般位置都是用經緯度來表示,具體經緯度的獲取得依賴客戶端,作為咱們後端程式設計師直接接收參數就可以了,所以這一步重點是用經緯度來表示各個節點的位置,對經緯度不是很了解的朋友可以複習一下中學的地理知識。
  • Redis 3.0.0 RC4 發布,無 Redis Cluster 修復
    此版本包括關於 redis-cli 方面的新特性,一個使用 xterm 256 顏色的延遲光譜可視化工具。Reids 團隊計劃兩周後發布一個 RC 版本或者是 3.0.0 穩定版本。Reids 3.0.0.RC4 常規改進:* [FIX] redis-cli CSV output NIL spurious newline removed.
  • Python使用redis存儲對象
    Python總的對象存儲到redis中默認為字符串,那麼如何存儲對象呢?下面就看看如何直接將Python中對象存儲到redis中先寫個測試redis是否正常連接上import rediscache = redis.StrictRedis('172.20.0.227',6379)
  • Redis 2.4:後臺線程如何解決aof缺陷?
    io轉化成一次大的連續io(sina的同學也反映過這個問題).  解決問題1  主線程僅僅把aofbuf的數據刷新到aof文件裡,然後通過bioCreateBackgroundJob函數往這隊列裡插入fsync job,於是原有主線程的fsync工作被轉移到後臺線程來做,這樣主線程阻塞問題就異步的解決了.
  • Redis 的 8 大數據類型,寫得非常好!(建議收藏)
    # 如果不存在值,則返回 nil(nil)127.0.0.1:6379> get db"redis"127.0.0.1:6379> getset db mongodb # 如果存在值,獲取原來的值,並設置新的值"redis"127.0.0.1:6379> get db"mongodb"127.0.0.1:6379>String 的使用場景:value 除了是字符串以外還可以是數字
  • redis cluster-cluster 命令手動管理redis集群
    使用cluster命令管理redis cluster集群1、列印集群的信息 CLUSTER INFO cluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail