天天在用Redis,持久化方案你又知道哪些?

来源:https://www.cnblogs.com/Chenjiabing/archive/2020/04/20/12736115.html
-Advertisement-
Play Games

前言 文章首發於微信公眾號【碼猿技術專欄】:天天用Redis,持久化方案有哪些你知道嗎? Redis目前已經成為主流的記憶體資料庫了,但是大部分人僅僅是停留在會用的階段,你真的瞭解Redis內部的工作原理嗎? 今天這篇文章將為大家介紹Redis持久化的兩種方案,文章將會從以下五個方面介紹: 什麼是RD ...


前言

  • 文章首發於微信公眾號【碼猿技術專欄】:天天用Redis,持久化方案有哪些你知道嗎?
  • Redis目前已經成為主流的記憶體資料庫了,但是大部分人僅僅是停留在會用的階段,你真的瞭解Redis內部的工作原理嗎?
  • 今天這篇文章將為大家介紹Redis持久化的兩種方案,文章將會從以下五個方面介紹:
    1. 什麼是RDB,RDB如何實現持久化?
    2. 什麼是AOF,AOF如何實現持久化?
    3. AOF和RDB的區別。
    4. 如何重啟恢複數據?
    5. 持久化性能問題和解決方案

RDB

  • RDB持久化是把當前進程數據生成快照保存到硬碟的過程, 觸發RDB持久化過程分為手動觸發和自動觸發。
  • RDB完成後會自動生成一個文件,保存在dir配置的指定目錄下,文件名是dbfileName指定。
  • Redis預設會採用LZF演算法對生成的RDB文件做壓縮處理,壓縮後的文件遠遠小於記憶體大小,預設開啟。

手動觸發

  • 手動觸發的命令有savebgsave
  • save:該命令會阻塞Redis伺服器,直到RDB的過程完成,已經被廢棄,因此線上不建議使用。
  • bgsave:每次進行RDB過程都會fork一個子進程,由子進程完成RDB的操作,因此阻塞只會發生在fork階段,一般時間很短。

自動觸發

  • 除了手動觸發RDB,Redis伺服器內部還有如下幾個場景能夠自動觸發RDB:
    1. 根據我們的 save m n 配置規則自動觸發。
    2. 如果從節點執行全量複製操作, 主節點自動執行bgsave生成RDB文件併發送給從節點。
    3. 執行debug reload命令重新載入Redis時, 也會自動觸發save操作。
    4. 預設情況下執行shutdown命令時, 如果沒有開啟AOF持久化功能則自動執行bgsave

RDB執行流程

  • RDB的主流方式就是bgsave,通過下圖我們來看看RDB的執行流程:
  • RDB執行流程
  • 通過上圖可以很清楚RDB的執行流程,如下:
    1. 執行bgsave命令後,會先判斷是否存在AOF或者RDB的子進程,如果存在,直接返回。
    2. 父進程fork操作創建一個子進程,fork操作中父進程會被阻塞。
    3. fork完成後,子進程開始根據父進程的記憶體生成臨時快照文件,完成後對原有的RDB文件進行替換。執行lastsave命令可以查看最近一次的RDB時間。
    4. 子進程完成後發送信號給父進程,父進程更新統計信息。

RDB的優點

  • RDB是一個緊湊壓縮的二進位文件, 代表Redis在某個時間點上的數據快照。 非常適用於備份, 全量複製等場景。 比如每6小時執行bgsave備份,並把RDB文件拷貝到遠程機器或者文件系統中,用於災難恢復。
  • Redis載入RDB恢複數據遠遠快於AOF的方式。

RDB的缺點

  • RDB方式數據沒辦法做到實時持久化/秒級持久化。 因為bgsave每次運行都要執行fork操作創建子進程,屬於重量級操作,頻繁執行成本過高。
  • RDB文件使用特定二進位格式保存, Redis版本演進過程中有多個格式的RDB版本, 存在老版本Redis服務無法相容新版RDB格式的問題。

AOF

  • AOF(append only file) 持久化: 以獨立日誌的方式記錄每次寫命令,重啟時再重新執行AOF文件中的命令達到恢複數據的目的。 AOF的主要作用是解決了數據持久化的實時性, 目前已經是Redis持久化的主流方式

如何開啟AOF

  • 開啟AOF功能需要設置配置:appendonly yes, 預設不開啟。 AOF文件名通過appendfilename配置設置, 預設文件名是appendonly.aof。 保存路徑同RDB持久化方式一致,通過dir配置指定。

AOF整體的執行流程

  • AOF執行的流程大致分為命令寫入文件同步文件重寫重啟載入四個步驟,如下圖:
  • AOF執行流程
  • 從上圖大致瞭解了AOF的執行流程,下麵一一分析上述的四個步驟。

命令寫入

  • AOF命令寫入的內容直接是文本協議格式。 例如set hello world這條命 令, 在AOF緩衝區會追加如下文本:
*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n
  • 命令寫入是直接寫入到AOF的緩衝區中,至於為什麼?原因很簡單,Redis使用單線程響應命令,如果每次寫AOF文件命令都直接追加到硬碟, 那麼性能完全取決於當前硬碟負載。先寫入緩衝區aof_buf中, 還有另一個好處, Redis可以提供多種緩衝區 同步硬碟的策略,在性能和安全性方面做出平衡。

文件同步

  • Redis提供了多種AOF緩衝區同步文件策略, 由參數appendfsync控制,如下:
    • 配置為always時, 每次寫入都要同步AOF文件, 在一般的SATA硬碟上,Redis只能支持大約幾百TPS寫入, 顯然跟Redis高性能特性背道而馳,不建議配置。
    • 配置為no,由於操作系統每次同步AOF文件的周期不可控,而且會加大每次同步硬碟的數據量,雖然提升了性能,但數據安全性無法保證。
    • 配置為everysec(預設的配置),是建議的同步策略, 也是預設配置,做到兼顧性能和數據安全性。理論上只有在系統突然宕機的情況下丟失1秒的數據(當然,這是不太準確的)。

文件重寫機制

  • 隨著命令不斷寫入AOF, 文件會越來越大, 為瞭解決這個問題, Redis引入AOF重寫機制壓縮文件體積。 AOF文件重寫是把Redis進程內的數據轉化為寫命令同步到新AOF文件的過程。
  • 為什麼要文件重寫呢? 因為文件重寫能夠使得AOF文件的體積變得更小,從而使得可以更快的被Redis載入。
  • 重寫過程分為手動觸發和自動觸發。
    • 手動觸發直接使用bgrewriteaof命令。
    • 根據auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage參數確定自動觸發時機。
  • auto-aof-rewrite-min-size:表示運行AOF重寫時文件最小體積, 預設為64MB。
  • auto-aof-rewrite-percentage:代表當前AOF文件空間(aof_current_size) 和上一次重寫後AOF文件空間(aof_base_size) 的比值。
  • 自動觸發時機相當於aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size) /aof_base_size>=auto-aof-rewritepercentage。其中aof_current_sizeaof_base_size可以在info Persistence統計信息中查看。
  • 那麼文件重寫後的AOF文件為什麼會變小呢? 有如下幾個原因:
    1. 進程內已經超時的數據將不會再次寫入AOF文件中。
    2. 舊的AOF文件含有無效命令,如del key1hdel key2等。重寫使用進程內數據直接生成,這樣新的AOF文件只保留最終數據的寫入命令。
    3. 多條寫命令可以合併為一個, 如:lpush list alpush list blpush listc可以轉化為:lpush list a b c。為了防止單條命令過大造成客戶端緩衝區溢出,對於listsethashzset等類型操作,以64個元素為界拆分為多條。
  • 介紹了文件重寫的系列知識,下麵來看看Redis內部是如何進行文件重寫的,如下圖: 文件重寫
  • 看完上圖,大致瞭解了文件重寫的流程,對於重寫的流程,補充如下:
    1. 重寫期間,主線程並沒有阻塞,而是在執行其他的操作命令,依然會向舊的AOF文件寫入數據,這樣能夠保證備份的最終完整性,如果數據重寫失敗,也能保證數據不會丟失。
    2. 為了把重寫期間響應的寫入信息也寫入到新的文件中,因此也會為子進程保留一個緩衝區,防止新寫的文件丟失數據。
    3. 重寫是直接把當前記憶體的數據生成對應命令,並不需要讀取老的AOF文件進行分析、命令合併。
    4. AOF文件直接採用的文本協議,主要是相容性好、追加方便、可讀性高可認為修改修複。
    5. 無論是RDB還是AOF都是先寫入一個臨時文件,然後通過重命名完成文件的替換。

AOF的優點

  • 使用 AOF 持久化會讓 Redis 變得非常耐久:你可以設置不同的 fsync 策略,比如無 fsync ,每秒鐘一次 fsync ,或者每次執行寫入命令時 fsync 。 AOF 的預設策略為每秒鐘 fsync 一次,在這種配置下,Redis 仍然可以保持良好的性能,並且就算發生故障停機,也最多只會丟失一秒鐘的數據( fsync 會在後臺線程執行,所以主線程可以繼續努力地處理命令請求)。

AOF的缺點

  • 對於相同的數據集來說,AOF 文件的體積通常要大於 RDB 文件的體積。根據所使用的 fsync 策略,AOF 的速度可能會慢於 RDB。 在一般情況下, 每秒 fsync 的性能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間。
  • 數據恢復速度相對於RDB比較慢。

AOF和RDB的區別

  • RDB持久化是指在指定的時間間隔內將記憶體中的數據集快照寫入磁碟,實際操作過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換之前的文件,用二進位壓縮存儲。
  • AOF持久化以日誌的形式記錄伺服器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文本的方式記錄,可以打開文件看到詳細的操作記錄。

重啟載入

  • 無論是RDB還是AOF都可用於伺服器重啟時的數據恢復,執行流程如下圖:
  • 重啟載入流程
  • 上圖很清晰的分析了Redis啟動恢複數據的流程,先檢查AOF文件是否開啟,文件是否存在,再檢查RDB是否開啟,文件是否存在。

性能問題與解決方案

  • 通過上面的分析,我們都知道RDB的快照、AOF的重寫都需要fork,這是一個重量級操作,會對Redis造成阻塞。因此為了不影響Redis主進程響應,我們需要儘可能降低阻塞。
  • 那麼如何減少fork操作的阻塞呢?
    1. 優先使用物理機或者高效支持fork操作的虛擬化技術。
    2. 控制Redis實例最大可用記憶體, fork耗時跟記憶體量成正比, 線上建議每個Redis實例記憶體控制在10GB以內。
    3. 合理配置Linux記憶體分配策略,避免物理記憶體不足導致fork失敗。
    4. 降低fork操作的頻率,如適度放寬AOF自動觸發時機,避免不必要的全量複製等。

總結

  • 本文介紹了Redis持久化的兩種不同的策略,大部分內容是運維人員需要掌握的,當然作為後端人員也是需要瞭解一下,畢竟小公司都是一人搞全棧,哈哈。
  • 如果覺得陳某寫的不錯,有所收穫的話,關註分享一波,你的關註將是陳某寫作的最大動力,謝謝支持!!!

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

-Advertisement-
Play Games
更多相關文章
  • load average 字面意思:平均負載 查看一下手冊中的描述,可知 load average 後面三個數值是CPU在最近1分鐘、5分鐘、15分鐘的平均負載。當CPU完全空閑時,平均負載為0;當CPU工作量飽和的時候,平均負載為1。 很明顯,平均負載越低越好。 當平均負載大於1,意味著CPU資源 ...
  • 在這裡我給大家繼續分享一些關於HDFS分散式文件的經驗哈,其中包括一些hdfs的基本的shell命令的操作,再加上hdfs java程式設計。在前面我已經寫了關於如何去搭建hadoop這樣一個大數據平臺,還沒搭好環境的童鞋可以轉到我寫的這篇文章 "Hadoop在Ubuntu的安裝" ,接下來就開始我 ...
  • 壓縮和解壓縮命令 zip unzip gzip gunzip bzip2 bunzip2 tar zip (.zip格式的壓縮文件) 英文原意:package and compress (archive) files 功能:壓縮文件或目錄 語法:zip 選項[ r] 壓縮包名 源文件或源目錄 unz ...
  • 基本的操作方法:本文假設你的apahce安裝目錄為/usr/local/apache2,這些方法適合任何情況apahce啟動命令:推薦/usr/local/apache2/bin/apachectl start apaceh啟動apache停止命令/usr/local/apache2/bin/apa ...
  • 命令格式 [root@localhost ~]# scp [參數] [原路徑] [目標路徑] 命令功能 scp是 secure copy的縮寫, scp是linux系統下基於ssh登陸進行安全的遠程文件拷貝命令。linux的scp命令可以在linux伺服器之間複製文件和目錄。 命令參數 -1 強制s ...
  • Parallels Desktop是一款運行在 Mac 電腦上的極為優秀的虛擬機軟體。用戶可以在 Mac OS X 下非常方便運行 Windows、Linux 等操作系統及應用。用戶不必繁瑣重覆地重啟電腦即可在 Win 與 Mac 之間切換甚至同時使用它們。 Parallels Desktop15的 ...
  • 好幾年前寫了一篇《SSIS利用Microsoft Connector for Oracle by Attunity組件進行ETL!》,IT技術真是日新月異,這種方式對於新的SQL SERVER 資料庫版本已不適用了,比如SQL SERVER 2016 的SSIS不需要安裝任何插件就可以抽取Share ...
  • 引用地址:https://blog.csdn.net/weixin_34143774/article/details/89561946 請以原文為主,引用註明出處。問題:今天公司進行軟體測評,在測評期間,測評人員問起PostgreSQL登錄失敗導致用戶鎖定的次數,密碼輸錯幾次賬戶會被鎖定?網上查了一... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...