1、Redis資料持久化的必要性
由于redis是基于記憶體的資料庫,面臨資料掉電易失的風險,要避免資料丟失,最好將記憶體資料持久化到磁盤等永久存盤介質上,服務重啟時,會先加載磁盤檔案內的資料到記憶體,完成資料恢復,
2、RDB(RedisDB)
對記憶體中的redis全量資料進行時點快照并序列化,以檔案形式保存到磁盤上,生成的是dump.rdb二進制檔案,到了dump時間點就生成一份新的rdb檔案,同時覆寫掉舊的,服務重啟時直接將dump檔案反序列化并加載到記憶體中,資料恢復速度較快,也是redis默認的持久化方式,hdfs的nameNode也是用類似的方式生成fsimage檔案來做持久化的,hdfs的nameNode也是用類似的方式生成fsimage檔案來做持久化的
執行方式:
阻塞式:
類似JVM的stop-the-world,做快照的時候不能處理客戶端請求,客戶端可以使用save命令觸發,優點原理簡單,能保證資料一致性,缺點是對用戶不友好,
非阻塞式:
服務端做資料快照的時候,可以繼續處理客戶端的請求,客戶端可以使用bgsave命令觸發,優點是對客戶端友好,但復雜度高,必須解決做快照的同時,并發寫操作造成的資料不一致問題,
redis中的所有key和value是分為兩個部分單獨存盤的,兩個資料區之間建立映射關系,資料修改只是映射關系的改變,
大體機制:當服務端接收到bgsave命令后,服務端不會立馬執行快照操作,而是選擇合適的時機fork一個子行程,這個子行程全量繼承父行程的key資料集和映射關系,實作類cow的效果,子行程只保證dump時點當前的資料一致性,至于并發修改的資料就交給下一次dump來持久化,
配置策略:
可以通過客戶端發命令的方式,也可以寫在組態檔中實作自動持久化,
save 900 1 //如果在900秒內發生了超過1次k-v更新就觸發一次dump
save 300 10 //如果在300秒內發生了超過10次k-v更新就觸發一次dump
save 60 10000 //如果在60秒內發生了超過1萬次k-v更新就觸發一次dump
dbfilename dump.rdb //快照檔案名
dir /opt/redis/rep //快照存盤路徑
【每完成一次快照后,時間計和更新計數器都會清零】
優點:
- 全量備份,可以做到針對不同時間點的多版本恢復(此時需要避免覆寫問題,推薦用多服務器來存盤dump檔案),
- 備份檔案緊湊單一,利于網路傳輸,適合災難恢復,
- 恢復大資料集速度比AOF快,
缺點:
- 最后一次快照時如果掉電,并發寫的資料將丟失,所以適合存盤能容忍這種風險的場合,
- fork程序會造成毫秒級的耗時,會造成短暫的拒絕相應,
3、AOF(AppendOnlyFile)
實時記錄每一條寫資料的命令,形成binlog,服務重啟時會原樣執行一遍aof檔案中的所有命令,達到資料恢復的目的,但恢復速度比rdb式慢,hdfs中提供了類似的方式,edit-log,只是默認時關閉的,
幾乎可以做到不丟失任何資料,也可以控制丟失一秒內的資料,
備份的資料量太大,不夠緊湊,io互動頻繁,
寫入機制:在現代作業系統中,程式執行write系統呼叫時,是先將資料寫到一個記憶體buffer中,等到buffer滿或者用戶執行fsync或fdatasync
指令時才會將buffer資料刷到disc上,所以未刷盤的資料存在掉電丟失風險,
落盤策略由appendfssync選項控制:
- always:服務端每接收一個更新指令都刷到磁盤,不會發生資料丟失,但是io太過頻繁效率很低,
- everysecond:每隔1秒鐘刷一次盤,有可能丟失一秒鐘的資料,效率適中,
- no:服務端不主動刷盤,資料何時落盤完全取決于作業系統,只有當buffer滿了才會刷盤,丟失資料量不確定,效率最高,
AOF重寫機制:
由于AOF檔案時間長了會很大,可以通過分析檔案內容,將多條命令合并為一條,將對同一個key的多次操作只保留最新的那一次,
AOF重寫程序
- fork一個子行程負責重寫AOF檔案
- 子行程創建一個臨時檔案來寫入AOF資料
- 父行程開辟一個記憶體緩沖區接收新的寫命令
- 子行程重寫完畢后,父行程會獲得一個信號,父行程將新收到的寫命令通過子行程寫入臨時檔案
- 用臨時檔案替換掉舊的AOF檔案
AOF重寫的觸發
- 手動式:通過客戶端發送bgrewriteaof命令,
- 自動式:必須在組態檔中配置如下兩個引數
- auto-aof-rewrite-min-size 500mb //只有當aof檔案大于等于500M時,服務器才會重寫aof檔案,避免過小檔案的重寫問題,
- auto-aof-rewrite-min-percentage 60 //在滿足最小閾值的前提下,超過上一次重寫后生成的檔案體積的60%時將觸發重寫,避免了無限回圈重寫,(如果尚未做過重寫,就以啟動時的AOF檔案體積作為對比基準,如果此值為0,則表示關閉自動重寫功能),
優點:
- 默認每秒刷盤,性能好不阻塞服務,最多丟失一秒資料,
- 如果發生誤操作(flushall等),只要檔案未被重寫,立即停止服務將,AOF檔案最后的flushall命令洗掉,然后重啟redis服務實作資料恢復,
缺點:
- 相同資料集,AOF比RDB大很多,
- 資料恢復速度比RDB慢,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/19776.html
標籤:NoSQL
上一篇:Redis集群模式
下一篇:MongoDB入門(介紹、安裝)
