redis的持久化存儲

来源:https://www.cnblogs.com/gy001/archive/2022/11/02/16850851.html
-Advertisement-
Play Games

Redis雖然是一個記憶體級別的緩存程式,也就是redis是使用記憶體進行數據的緩存的,但是其可以將記憶體的數據按照一定的策略保存到硬碟中,這樣的話就可以實現持久保存的目的;目前的話redis支持的兩種不同方式的數據持久化保存機制,分別是RDB和AOF,這兩種方式的話很類似於MySQL資料庫的dump和二 ...


  Redis雖然是一個記憶體級別的緩存程式,也就是redis是使用記憶體進行數據的緩存的,但是其可以將記憶體的數據按照一定的策略保存到硬碟中,這樣的話就可以實現持久保存的目的;目前的話redis支持的兩種不同方式的數據持久化保存機制,分別是RDB和AOF,這兩種方式的話很類似於MySQL資料庫的dump和二進位日誌的方式。

1、RBD模式 

1.1、RDB模式的工作原理

 

RDB(Redis DataBase):基於時間的快照,其預設只保留當前最新的一次快照,特點是執行速度比較快,缺點是可能會丟失從上次快照到當前的時間點未做快照的數據。

1.2、RDB bgsave實現快照的具體過程

 

Redis從master主進程先fork出一個子進程,使用寫時複製機制,子進程將記憶體的數據保存為一個臨時文件,比如dump.rdb,當數據保存完後在將上一次保存的RDB文件替換掉,然後就會關掉子進程,這樣可以保證每一次做RDB快照保存的數據都是完整的;因為直接替換RDB文件的時候,可能會出現突然斷電等問題,從而導致RDB文件還沒有保存完整就因為突然關機停止保存,並會出現導致數據丟失的情況。後續的話是可以手動將每次生成的RDB文件進行備份,這樣的話就可以最大化的來保存歷史數據。

1.3、RDB的相關配置

#在配置文件中的 save 選項設置多個保存條件,只有任何一個條件滿足,伺服器都會自動執行 BGSAVE 命令
save 900 1         #900s內修改了1個key即觸發保存RDB
save 300 10        #300s內修改了10個key即觸發保存RDB
save 60 10000      #60s內修改了10000個key即觸發保存RDB
dbfilename dump.rdb
dir ./             #編澤編譯安裝時預設RDB文件存放在Redis的工作目錄,此配置可指定保存的數據目錄
stop-writes-on-bgsave-error yes  #當快照失敗是否仍允許寫入,yes為出錯後禁止寫入,建議為no
rdbcompression yes
rdbchecksum yes

1.4實現RBD的方法

  • save: 同步,不推薦使用,使用主進程完成快照,因此會阻賽其它命令執行
  • bgsave: 非同步後臺執行,不影響其它命令的執行,會開啟獨立的子進程,因此不會阻賽其它命令執行
  • 配置文件實現自動保存: 在配置文件中制定規則,自動執行bgsave

 1.4、自動備份的方式

  • 使用自動備份方式的話是需要在redis配置文件中指定規則,當在redis配置中規則後,觸發了規則後就會自動執行。
[root@node1 ~]#grep '^save' /apps/redis/etc/redis.conf
save 900 1   #900秒內更改一條及以上信息即自動備份
save 300 10 #300秒內更改十條及以上信息即自動備份
save 60 10000 #60秒內更改一萬條及以上信息即自動備份

1.5、RDB模式的優缺點

RDB模式優點:

  • RDB快照保存了某個時間點的數據,可以通過腳本執行redis指令bgsave(非阻塞,後臺執行)或者save(會阻塞寫操作,不推薦)命令自定義時間點備份,可以保留多個備份,當出現問題可以恢復到不同時間點的版本,很適合備份,並且此文件格式也支持有不少第三方工具可以進行後續的數據分析;比如: 可以在最近的24小時內,每小時備份一次RDB文件,並且在每個月的每一天,也備份一個RDB文件。這樣的話,即使遇上問題,也可以隨時將數據集還原到不同的版本。
  • RDB可以最大化Redis的性能,父進程在保存 RDB文件時唯一要做的就是fork出一個子進程,然後這個子進程就會處理接下來的所有保存工作,父進程無須執行任何磁碟 I/O 操作。
  • RDB在大量數據,比如幾個G的數據,恢復的速度要比AOF的快。

RDB模式缺點:

  • 不能實時保存數據,可能會丟失上次執行RDB備份到當前的記憶體數據。當你需要實時保存數據時,那麼你就要儘量避免在伺服器故障時丟失數據,這樣的話RDB就不適合使用了。雖然Redis允許設置不同的保存點(save point)來控制保存RDB文件的頻率,但是,因為RDB文件需要保存整個數據集的狀態,所以它並不是一個輕鬆快速的操作。因此一般會超過5分鐘以上才保存一次RDB文件。在這種情況下,一旦發生故障停機,你就可能會丟失好幾分鐘的數據。
  • 當數據量非常大時,從父進程fork子進程進行保存至RDB文件是需要一點時間的,可能是毫秒或者是秒,這個是取決於磁碟的IO性能。在數據集比較龐大時,fork()可能會非常耗時,造成伺服器在一定時間內停止處理客戶端﹔如果數據集非常巨大,並且CPU時間非常緊張的話,那麼這種停止時間甚至可能會長達整整一秒或更久。雖然AOF重寫也需要進行fork(),但無論AOF重寫的執行間隔有多長,數據的持久性都不會有任何損失。

2、AOF模式

2.1、AOF模式工作原理

 

  • AOF:AppendOnylFile,按照操作順序依次將操作追加到指定的日誌文件末尾
  • AOF和RDB一樣使用了寫時複製機制,AOF預設為每秒鐘 fsync一次,即將執行的命令保存到AOF文件當中,這樣即使redis伺服器發生故障最多只丟失1秒鐘之內的數據,也可以設置不同的fsync策略always,即設置每次執行命令的時候執行fsync,fsync會在後臺執行線程,所以主線程可以繼續處理用戶的正常請求而不受到寫入AOF文件的I/O影響
  • 同時啟用RDB和AOF,進行恢復時,預設AOF文件優先順序高於RDB文件,即會使用AOF文件進行恢復

 

 註意事項:AOF模式預設是關閉的,第一次開啟AOF後,並重啟服務生效後,會因為AOF的優先順序高於RDB,而AOF預設沒有數據文件存在,從而導致所有數據丟失,因此所以要使用正確的方法來開啟AOF,以防數據丟失。

2.2、AOF相關配置

appendonly no #是否開啟AOF日誌記錄,預設redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了,但是redis如果中途宕機,會導致可能有幾分鐘的數據丟失(取決於dump數據的間隔時間),根據save來策略進行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性,Redis會把每次寫入的數據在接收後都寫入 appendonly.aof 文件,每次啟動時Redis都會先把這個文件的數據讀入記憶體里,先忽略RDB文件。預設不啟用此功能

appendfilename "appendonly.aof" #文本文件AOF的文件名,存放在dir指令指定的目錄中

appendfsync everysec #aof持久化策略的配置
#no表示由操作系統保證數據同步到磁碟,Linux的預設fsync策略是30秒,最多會丟失30s的數據
#always表示每次寫入都執行fsync,以保證數據同步到磁碟,安全性高,性能較差
#everysec表示每秒執行一次fsync,可能會導致丟失這1s數據,此為預設值,也生產建議值
dir /path

#rewrite相關
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes

2.2.1動態設置(建議使用的方式)

#這時aof是沒有開啟的
[root@node1 ~]#grep '^append' /apps/redis/etc/redis6379.conf
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec

#把data文件夾所有者所有組設為redis
[root@node1 ~]#ll /apps/redis/data
total 1452
drwxr-xr-x 2 redis redis    4096 Nov  2 13:13 ./
drwxr-xr-x 7 redis redis    4096 Oct 31 15:41 ../
-rw-r--r-- 1 redis redis 1477882 Nov  2 13:13 dump6379.rdb
[root@node1 ~]#systemctl restart redis6379.service

#進入客戶端設置
[root@node1 ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> dbsize
(integer) 100000
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "no"
127.0.0.1:6379> config set appendonly yes
OK
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "yes"    

 

 

 2.3、AOF rewrite重寫

 將一些重覆的、可以合併的、過期的數據重新寫入一個新的AOF文件,這樣的話可以節約AOF備份占用的硬碟空間,也是可以加速恢復過程。可以手動執行bgrewriteaof觸發AOF,第一次開啟AOF功能,或定義自動rewrite策略。

 

 

 2.4、AOF模式的優缺點

AOF模式的優點:

  • 數據安全性相對較高,根據所使用的fsync策略(fsync是同步記憶體中redis所有已經修改的文件到存儲設備),預設是appendfsync everysec,即每秒執行一次fsync,在這種配置下,Redis仍然可以保持良好的性能,並且就算發生故障停機,也最多只會丟失一秒鐘的數據(fsync會在後臺線程執行,所以主線程可以繼續努力地處理命令請求)
  • 由於該機制對日誌文件的寫入操作採用的是append模式,因此在寫入過程中不需要seek, 即使出現宕機現象,也不會破壞日誌文件中已經存在的內容。然而如果本次操作只是寫入了一半數據就出現了系統崩潰問題,不用擔心,在Redis下一次啟動之前,可以通過redis-check-aof工具來解決數據一致性的問題。
  • Redis可以在AOF文件體積變得過大時,自動地在後臺對AOF進行重寫,重寫後的新AOF文件包含了恢復當前數據集所需的最小命令集合。整個重寫操作是絕對安全的,因為Redis在創建新AOF文件的過程中,append模式不斷的將修改數據追加到現有的 AOF文件裡面,即使重寫過程中發生停機,現有的 AOF文件也不會丟失。而一旦新AOF文件創建完畢,Redis就會從舊AOF文件切換到新AOF文件,並開始對新AOF文件進行追加操作。

  • AOF包含一個格式清晰、易於理解的日誌文件用於記錄所有的修改操作。事實上,也可以通過該文件完成數據的重建;
    AOF文件有序地保存了對資料庫執行的所有寫入操作,這些寫入操作以Redis協議的格式保存,因此 AOF文件的內容非常容易被人讀懂,對文件進行分析(parse)也很輕鬆。導出(export)AOF文件也非常簡單:舉個例子,如果不小心執行了FLUSHALL.命令,但只要AOF文件未被重寫,那麼只要停止伺服器,移除 AOF文件末尾的FLUSHAL命令,並重啟Redis,就可以將數據集恢復到FLUSHALL執行之前的狀態。

AOF模式缺點:

  • 即使有些操作是重覆的也會全部記錄,AOF的文件大小要大於RDB格式的文件;
  • AOF在恢復大數據集時的速度比RDB的恢復速度要慢;
  • 根據fsync策略不同,AOF速度可能會慢於RDB;
  • bug出現的可能性會更多

3、RDB模式和AOF模式的選擇

  • 如果註意是來充當緩存功能,或者可以承受短暫時間的數據丟失,通常生產環境一般只需要開啟RDB就可以了,啟用RDB也是預設值。
  • 如果數據需要持久化保存,有點也不可以丟失的話,就可以選擇開啟RDB和AOF。
  • 一般不會只開啟AOF的,這樣操作也是不建議的。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 長連接與短連接 所謂長連接,指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需要雙方發檢測包以維持此連接,一般需要自己做線上維持。 短連接是指通信雙方有數據交互時,就建立一個TCP連接,數據發送完成後,則斷開此TCP連接,一般銀行都使用短連接。 比如http的, ...
  • <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-web ...
  • lsof -i tcp:埠號 要殺死進程的話,即:kill -9 pid ...
  • 前言 上一篇博客給大家介紹了LabVIEW開放神經網路交互工具包【ONNX】,今天我們就一起來看一下如何使用LabVIEW開放神經網路交互工具包實現TensorRT加速YOLOv5。 以下是YOLOv5的相關筆記總結,希望對大家有所幫助。 內容地址鏈接 【YOLOv5】LabVIEW+OpenVIN ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 前文回顧 實現一個簡單的Database1(譯文) 實現一個簡單的Database2(譯文) 實現一個簡單的Database3(譯文) 實現一個簡單的D ...
  • 前面說到了redis在單機的模式下是可以數據持久化的,但是不可以解決單點失敗的問題,當單台redis伺服器出現問題時,就可能會造成數據的丟失;想要解決這個問題的話我們可以使用Redis的主從模式這也是Redis集群最簡單的實現方式,這篇文章我就來簡單部署一個Redis主從架構,我準備了3台ubunt ...
  • 摘要:本文通過對ETCD服務異常問題分析,代碼展示解決方案。 本文分享自華為雲社區《【實例狀態】GaussDB ETCD服務異常》,作者:酷哥。 首先確認是否是虛擬機、網路故障 虛擬機故障導致ETCD服務異常告警 問題現象 管控面上報etcd服務異常告警,虛擬機發生重啟,熱遷移、冷遷移,HA等動作。 ...
  • 資料庫連接 鏈接資料庫:代表連接資料庫管理系 統 <!--一個應用程式可以對應一個資料庫,一個資料庫管理系統可以管理多個資料庫--> <!--表是用來存儲數據的--> -- 連接資料庫管理系統 mysql -u root -p -- -u 代表用戶 -p代表用密碼登錄 定義資料庫 -- 創建資料庫 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...