redis資料持久化 AOF重寫

2022-06-22 23:24:20 字數 2589 閱讀 5747

本篇重點談一談自己對aof重寫的理解,不講**!不講**!!不講**!!!

因為redis是記憶體型的nosql資料庫,所以對於資料的安全問題必須要考慮,redis支援將資料持久化的磁碟。redis的持久化方式有兩種——rdb和aof。

對於rdb,簡單提一句,通俗的說它就是乙個快照(備份)機制,在某時刻redis會產生乙個父程序的副本(快照),並由子程序將快照寫入臨時檔案,這種方式看起來非常簡單粗暴,而且可以想象,如果系統發生崩潰,且在最近一次rdb之後還有未備份的資料,那麼這些資料會損失掉,我們大多數情況下是不能接受這樣的資料損失的(比如電商系統),所以rdb的這種機制並不適於實時性的持久化。

aof是redis的另一種持久化的機制,相對於rdb,redis就更適合於更實時的資料持久化操作。

那麼aof是通過怎樣的機制進行資料的持久化呢?

首先redis會將其執行過程中執行成功的每乙個寫操作(操作指令),寫入乙個.aof檔案,當redis重啟時,只需要完全的執行一次已經儲存的aof檔案,就可以恢復以前的資料。由於儲存的是操作指令,通過將aof檔案複製到其他伺服器執行,就可以實現資料的移植。由於aof存放的是操作指令,所以它單次的消耗會遠低於rdb,所以它更適合做更實時的持久化。

需要注意的是,如果rdb和aof同時存在,那麼redis會以aof為準。

aof中有怎樣的配置用來控制aof的寫入頻率呢?

aof有這樣幾種配置用來控制讀寫的頻率:

這種做法看起來幾乎完美無缺,最大程度上的實現了資料的完整性,但是我們忽略了redis的讀寫效率。通過在redis目錄下執行redis-benchmark

命令可以檢視redis的讀寫效率,大概在10w次/s,這樣的乙個超高速度對於我們的磁碟來說幾乎是不可承受的,如果某一時刻redis的寫操作達到這樣的峰值,我們的磁碟大概會崩潰,這樣的機制在乙個心臟大血管小的場景下,會極大的產生io開銷,其實很難保證資料的安全。

這樣的機制就更不用說了,我們完全沒辦法確定作業系統的選擇,雖然這種操作保證了效能,但是如果系統宕機,那麼redis會丟失多少資料也是我們不能確定的。

這種機制在效能和持久化方面做了很好的折中,雖然一秒鐘的時間在我們看起來很短,但是對於redis確是很長的一段時間,畢竟人家10w次的讀寫效率在那裡擺著。而這種機制也是redis推薦的配置,開啟redis的配置檔案就會發現,前面兩種配置都是被注釋掉的。

aof在開啟過程中有什麼需要注意或者了解的?

首先,aof的同步時間間隔很小,能使得資料更安全,理論上來說,在aof狀態下redis至多丟失一秒的資料,因為我們的推薦配置就是每秒鐘強制寫入一次,它比rdb的實時性更高。其次,當redis重啟時,可能會執行乙個非常大的aof,因為我們所有資料的寫操作可能都被儲存在.aof檔案中,這樣的話會導致redis重啟時間很長(大資料中是以100g資料為入門級別的)。而第三點,就是aof檔案會不斷的增長,它可能會比rdb產生的快照檔案大幾倍,因為它儲存的是對所有資料的所有寫操作,而我們通常對同一資料不止進行一次寫操作,或增加或修改或刪除,同一資料可能會有很多這樣的操作,資料量小的情況下或許沒什麼,但是在極端情況下,就可能會對磁碟空間造成壓力。

那麼如何解決aof檔案增長的問題呢?就引出了本篇隨筆的重點——aof重寫。

aof重寫的實現

為了減小aof檔案的體量,可以手動傳送「bgrewriteaof」指令,通過子程序生成更小體積的aof,然後替換掉舊的、大體量的aof檔案。

aof重寫的工作原理

上圖就是aof的工作原理了,感覺自己畫的還是比較通俗易懂的哈哈哈

需要注意的是,在這裡子程序把資料轉為寫指令存入新的aof檔案時,記錄的只是每個資料的最後一次寫指令,也就是最新的資料,不會記錄之前冗餘的操作,所以這樣會很大程度的縮小aof的體量,同時,該操作是產生新的aof檔案進行寫入,而不是在原有檔案上的修改,通過上圖也可以看出來。而快取中疊加到新的aof的操作仍是新增的全部操作,但是這些資料已經很有限,相比之前的一股腦新增,這種機制很好的解決的aof檔案不斷增大的問題。

aof重寫的相關配置

1)auto-aof-rewrite-percentage 100

2)auto-aof-rewrite-min-size 64mb

這兩個配置項的意思是,在aof檔案體量超過64mb,且比上次重寫後的體量增加了100%時自動觸發重寫。我們可以修改這些引數達到自己的實際要求

aof重寫須知

和rdb一樣,如果當前的資料量巨大,那麼建立子程序的過程會很耗時。在大資料的處理工作中,檔案的刪除也是一項比較麻煩的工作。想我們普通的膝上型電腦,刪除乙個幾gb的檔案都是一項很耗時的工作,更何況大資料的量級遠遠大過我們日常使用的資料。所以在替換aof檔案時,如果舊的aof很大,刪除它也是乙個很耗時的過程。當然這並不是aof或者redis的缺點,只是可能會出現的乙個客觀情況。

Redis 持久化 AOF自動重寫配置

auto aof rewrite min size size auto aof rewrite percentage percent 在 redis.conf 自動重寫的預設配置 auto aof rewrite percentage 100 可以自己設定相關重寫的條件auto aof rewrit...

redis持久化 AOF持久化

1.aof持久化原理 aof持久化會將被執行的寫命令寫到aof檔案的末尾。在恢復的時候,redis只要從頭到尾重新執行一次aof檔案包含的所有寫命令 2.配置選項 固態硬碟禁用always選項,在某些情況頻繁讀寫會大大降低固態硬碟的壽命 4.aof檔案的重寫和壓縮 aof檔案裡面記錄了所有的命令而不...

redis持久化之AOF持久化

aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...