日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis持久化存储AOF与RDB

發布時間:2024/2/28 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis持久化存储AOF与RDB 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自?https://blog.csdn.net/qq_27384769/article/details/79479048?

一、介紹

  • Redis中數據存儲模式有2種:cache-only,persistence;
  • cache-only即只做為“緩存”服務,不持久數據,數據在服務終止后將消失,此模式下也將不存在“數據恢復”的手段,是一種安全性低/效率高/容易擴展的方式;
  • persistence即為內存中的數據持久備份到磁盤文件,在服務重啟后可以恢復,此模式下數據相對安全。對于persistence持久化存儲,Redis提供了兩種持久化方法:
  • Redis DataBase(簡稱RDB)
  • Append-only file (簡稱AOF)
  • 二、RDB介紹及設置

    RDB是在某個時間點將數據寫入一個臨時文件,持久化結束后,用這個臨時文件替換上次持久化的文件,達到數據恢復。

    優點:

    使用單獨子進程來進行持久化,主進程不會進行任何IO操作,保證了redis的高性能

    缺點:

    RDB是間隔一段時間進行持久化,如果持久化之間redis發生故障,會發生數據丟失。所以這種方式更適合數據要求不嚴謹的時候

    這里說的這個執行數據寫入到臨時文件的時間點是可以通過配置來自己確定的,通過配置redis在n秒內如果超過m個key被修改這執行一次RDB操作。這個操作就類似于在這個時間點來保存一次Redis的所有數據,一次快照數據。所有這個持久化方法也通常叫做snapshots。

    RDB默認開啟,redis.conf中的具體配置參數如下;

    #dbfilename:持久化數據存儲在本地的文件 dbfilename dump.rdb #dir:持久化數據存儲在本地的路徑,如果是在/redis/redis-3.0.6/src下啟動的redis-cli,則數據會存儲在當前src目錄下 dir ./ ##snapshot觸發的時機,save <seconds> <changes> ##如下為900秒后,至少有一個變更操作,才會snapshot ##對于此值的設置,需要謹慎,評估系統的變更操作密集程度 ##可以通過“save “””來關閉snapshot功能 #save時間,以下分別表示更改了1個key時間隔900s進行持久化存儲;更改了10個key300s進行存儲;更改10000個key60s進行存儲。 save 900 1 save 300 10 save 60 10000 ##當snapshot時出現錯誤無法繼續時,是否阻塞客戶端“變更操作”,“錯誤”可能因為磁盤已滿/磁盤故障/OS級別異常等 stop-writes-on-bgsave-error yes ##是否啟用rdb文件壓縮,默認為“yes”,壓縮往往意味著“額外的cpu消耗”,同時也意味這較小的文件尺寸以及較短的網絡傳輸時間 rdbcompression yes

    snapshot觸發的時機,是有“間隔時間”和“變更次數”共同決定,同時符合2個條件才會觸發snapshot,否則“變更次數”會被繼續累加到下一個“間隔時間”上。snapshot過程中并不阻塞客戶端請求。snapshot首先將數據寫入臨時文件,當成功結束后,將臨時文件重名為dump.rdb。

    使用RDB恢復數據:

    • 自動的持久化數據存儲到dump.rdb后。實際只要重啟redis服務即可完成(啟動redis的server時會從dump.rdb中先同步數據)
    • 客戶端使用命令進行持久化save存儲:
    • ./redis-cli -h ip -p port save 數據同步保存到磁盤
    • ./redis-cli -h ip -p port bgsave 數據異步保存到磁盤
    • 一個是在前臺進行存儲,一個是在后臺進行存儲。我的client就在server這臺服務器上,所以不需要連其他機器,直接./redis-cli bgsave。由于redis是用一個主線程來處理所有 client的請求,這種方式會阻塞所有client請求。所以不推薦使用。另一點需要注意的是,每次快照持久化都是將內存數據完整寫入到磁盤一次,并不是增量的只同步臟數據。如果數據量大的話,而且寫操作比較多,必然會引起大量的磁盤io操作,可能會嚴重影響性能。

    三、 AOF介紹及設置

    Append-only file,將“操作 + 數據”以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已經寫入到文件或者即將寫入),才進行實際的數據變更,“日志文件”保存了歷史所有的操作過程;當server需要數據恢復時,可以直接replay此日志文件,即可還原所有的操作過程。AOF相對可靠,它和mysql中bin.log、apache.log、zookeeper中txn-log簡直異曲同工。AOF文件內容是字符串,非常容易閱讀和解析。

    • 優點:可以保持更高的數據完整性,如果設置追加file的時間是1s,如果redis發生故障,最多會丟失1s的數據;且如果日志寫入不完整支持redis-check-aof來進行日志修復;AOF文件沒被rewrite之前(文件過大時會對命令進行合并重寫),可以刪除其中的某些命令(比如誤操作的flushall)。
    • 缺點:AOF文件比RDB文件大,且恢復速度慢。
    • 我們可以簡單的認為AOF就是日志文件,此文件只會記錄“變更操作”(例如:set/del等),如果server中持續的大量變更操作,將會導致AOF文件非常的龐大,意味著server失效后,數據恢復的過程將會很長;事實上,一條數據經過多次變更,將會產生多條AOF記錄,其實只要保存當前的狀態,歷史的操作記錄是可以拋棄的;因為AOF持久化模式還伴生了“AOF rewrite”。
    • AOF的特性決定了它相對比較安全,如果你期望數據更少的丟失,那么可以采用AOF模式。如果AOF文件正在被寫入時突然server失效,有可能導致文件的最后一次記錄是不完整,你可以通過手工或者程序的方式去檢測并修正不完整的記錄,以便通過aof文件恢復能夠正常;同時需要提醒,如果你的redis持久化手段中有aof,那么在server故障失效后再次啟動前,需要檢測aof文件的完整性。
    • AOF默認關閉,開啟方法,修改配置文件reds.conf:appendonly yes
    ##此選項為aof功能的開關,默認為“no”,可以通過“yes”來開啟aof功能 ##只有在“yes”下,aof重寫/文件同步等特性才會生效 appendonly yes ##指定aof文件名稱 appendfilename appendonly.aof ##指定aof操作中文件同步策略,有三個合法值:always everysec no,默認為everysec appendfsync everysec ##在aof-rewrite期間,appendfsync是否暫緩文件同步,"no"表示“不暫緩”,“yes”表示“暫緩”,默認為“no” no-appendfsync-on-rewrite no ##aof文件rewrite觸發的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才會觸發rewrite,默認“64mb”,建議“512mb” auto-aof-rewrite-min-size 64mb ##相對于“上一次”rewrite,本次rewrite觸發時aof文件應該增長的百分比。 ##每一次rewrite之后,redis都會記錄下此時“新aof”文件的大小(例如A),那么當aof文件增長到A*(1 + p)之后 ##觸發下一次rewrite,每一次aof記錄的添加,都會檢測當前aof文件的尺寸。 auto-aof-rewrite-percentage 100
    • AOF是文件操作,對于變更操作比較密集的server,那么必將造成磁盤IO的負荷加重;此外linux對文件操作采取了“延遲寫入”手段,即并非每次write操作都會觸發實際磁盤操作,而是進入了buffer中,當buffer數據達到閥值時觸發實際寫入(也有其他時機),這是linux對文件系統的優化,但是這卻有可能帶來隱患,如果buffer沒有刷新到磁盤,此時物理機器失效(比如斷電),那么有可能導致最后一條或者多條aof記錄的丟失。通過上述配置文件,可以得知redis提供了3中aof記錄同步選項:
    • 1、always:每一條aof記錄都立即同步到文件,這是最安全的方式,也以為更多的磁盤操作和阻塞延遲,是IO開支較大。
    • 2、everysec:每秒同步一次,性能和安全都比較中庸的方式,也是redis推薦的方式。如果遇到物理服務器故障,有可能導致最近一秒內aof記錄丟失(可能為部分丟失)。
    • 3、no:redis并不直接調用文件同步,而是交給操作系統來處理,操作系統可以根據buffer填充情況/通道空閑時間等擇機觸發同步;這是一種普通的文件操作方式。性能較好,在物理服務器故障時,數據丟失量會因OS配置有關。
    • AOF文件會不斷增大,它的大小直接影響“故障恢復”的時間,而且AOF文件中歷史操作是可以丟棄的。AOF rewrite操作就是“壓縮”AOF文件的過程,當然redis并沒有采用“基于原aof文件”來重寫的方式,而是采取了類似snapshot的方式:基于copy-on-write,全量遍歷內存中數據,然后逐個序列到aof文件中。因此AOF rewrite能夠正確反應當前內存數據的狀態,這正是我們所需要的;*rewrite過程中,對于新的變更操作將仍然被寫入到原AOF文件中,同時這些新的變更操作也會被redis收集起來(buffer,copy-on-write方式下,最極端的可能是所有的key都在此期間被修改,將會耗費2倍內存),當內存數據被全部寫入到新的aof文件之后,收集的新的變更操作也將會一并追加到新的aof文件中,此后將會重命名新的aof文件為appendonly.aof,此后所有的操作都將被寫入新的aof文件。如果在rewrite過程中,出現故障,將不會影響原AOF文件的正常工作,只有當rewrite完成之后才會切換文件,因為rewrite過程是比較可靠的。

    總結

    以上是生活随笔為你收集整理的redis持久化存储AOF与RDB的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。