redis 系列17 持久化 AOF

来源:https://www.cnblogs.com/MrHSR/archive/2018/11/30/10045533.html
-Advertisement-
Play Games

一.概述 除了上篇介紹的RDB持久化功能之外,Redis還提供了AOF(Append Only File)持久化功能。與RDB保存資料庫中的鍵值對來記錄資料庫狀態不同,AOF是通過保存redis伺服器所執行的寫命令來記錄資料庫狀態的。AOF持久化方式記錄每次對伺服器寫的操作,當伺服器啟動時,就會通過 ...


一.概述

  除了上篇介紹的RDB持久化功能之外,Redis還提供了AOF(Append Only File)持久化功能。與RDB保存資料庫中的鍵值對來記錄資料庫狀態不同,AOF是通過保存redis伺服器所執行的寫命令來記錄資料庫狀態的。AOF持久化方式記錄每次對伺服器寫的操作,當伺服器啟動時,就會通過載入和執行AOF文件中保存的命令來還原伺服器關閉之前的資料庫狀態,併在伺服器載入AOF文件並還原資料庫狀態時列印日誌。

  被寫入AOF文件的所有命令都是純文本格式,可以直接打開一個AOF文件來觀察。所有寫命令是以追加(append)形式,保存到文件末尾。Redis還能對AOF文件進行後臺重寫,使得AOF文件的體積不至於過大。

  1.1 AOF持久化的實現

    AOF持久化功能的實現可以分為命令追加(append),文件寫入,文件同步(sync)三個步驟。

    (1) 命令追加

      當AOF執行處於打開狀態時,伺服器在執行完一個寫命令之後,會以協議格式將被執行的寫命令追加到伺服器狀態的AOF_buf緩衝區的末尾。

    struct redisServer { 
             //..
             //aof 緩衝區
              ads aof_buf
             //..
        }

    (2) AOF文件寫入與同步

      Redis的伺服器進程就是一個事件迴圈(loop),這個迴圈中的文件事件負責接收客戶端的命令請求,以及向客戶端發送命令回覆。在伺服器每次結束一個事件迴圈之前,都會調用內部flushAppendOnlyFile函數,考慮是否需要將aof_buf緩衝區中的內容寫入和保存到AOF文件裡面。flushAppendOnlyFile函數的行為由伺服器配置appendfsync選項的值來決定。appendfsync是指數據同步到磁碟文件(AOF)的方式,預設配置是everysec選項。當同步頻率是everysec值時,並且距離上次同步AOF文件已經超過一秒時,那麼伺服器會先將aof_buf中的內容寫入到AOF文件中。  

    127.0.0.1:6379>config get Appendfsync
    1) "appendfsync"
    2) "everysec"

Appendfsync模式

對應flushAppendOnlyFile函數行為

no

當設置appendfsync為no的時候,Redis不會主動調用fsync去將AOF日誌內容同步到磁碟,所以這一切就完全依賴於操作系統的調試了。對大多數Linux操作系統,是每30秒進行一次fsync,將緩衝區中的數據寫到磁碟上。從效率上講該模式最快,

但同步到磁碟不及時,是最不安全的選擇。

Everysec (推薦)

當設置appendfsync為everysec的時候,Redis會預設每隔一秒進行一次fsync調用,將緩衝區中的數據寫到磁碟,從效率上講該模式足夠快(和使用 RDB 持久化差不多),並且當出現故障停機時,資料庫也只丟失一秒鐘的命令。

always

當設置appendfsync為always時,每一次寫操作都會調用一次fsync,這時數據是最安全的,當然,由於每次都會執行fsync,所以其性能也會受到影響,效率上講該模式最慢的。

    

  1.2 AOF文件載入與數據還原

    因為AOF文件裡面包含了重建資料庫狀態所需的所有寫命令,所以伺服器只要讀入並重新執行一遍AOF文件裡面保存的寫命令,就可以還原伺服器關閉之前的資料庫狀態。Redis讀取AOF文件並還原資料庫狀態的詳細步驟如下:

    (1) 創建一個偽客戶端(因為Redis的命令只能在客戶端上下文中執行),用於載入AOF文件時所使用的命令直接來源於AOF文件,而不是來自網路連接的命令。

    (2) 從AOF文件中分析並讀出一條寫命令。

    (3) 使用偽客戶端執行被讀出的寫命令。

    (4) 重覆執行步驟2和3,直到AOF文件中的所有命令都被處理完為止。

    比如:伺服器首先讀入並執行select 0 命令,之後是set msg hello命令,再之後是sadd fruits apple banana cherry命令等等,這些命令都執行完之後,伺服器的資料庫就被還原到之前的狀態了。

  

  1.3 AOF重寫

    因為AOF持久化是通過保存被執行的寫命令來記錄資料庫狀態的,所以隨著伺服器運行時間的流逝,AOF文件中的內容會越來越多,文件 的體積也會越來越大,隨著AOF文件的體積越大,數據還原所需的時間就越多。為瞭解決AOF文件體積膨脹的問題,Redis提供了AOF文件重寫功能。通過該功能,Redis伺服器可以創建一個新的AOF文件來替代現有的AOF文件,新舊兩個AOF文件所保存的資料庫狀態相同,但新的AOF文件不會包含任何浪費空間的冗餘命令,所以新AOF文件體積比舊的AOF文件體積要小得多。

    AOF文件重寫並不需要對現有的AOF文件進行任何讀取,分析或者寫入操作,這個重寫功能是通過讀取伺服器當前的資料庫狀態來實現的。比如:使用寫命令 rpush list "A", rpush list "B", rpush list "C", rpush list "D" 此時必須在AOF文件中寫入四條命令。重寫可以是直接從資料庫中讀取鍵list的值,然後用一條rpush list "A","B","C","D"命令來代替。

  

  1.4  AOF 後臺重寫

    重寫作為一種輔助維護,Redis不希望AOF重寫造成伺服器無法處理請求,所以Redis決定將AOF重寫程式放到子進程里執行。對AOF 文件進行重寫,執行bgrewriteaof命令, Redis將生成一個新的 AOF 文件,這個文件包含重寫當前數據集所需的最少命令。bgrewriteaof後臺重寫實現步驟如下:

    (1) Redis執行 fork() ,現在同時擁有父進程和子進程。

    (2)子進程開始將新 AOF 文件的內容寫入到臨時文件。

    (3)對於所有新執行的寫入命令,父進程一邊將它們累積到一個記憶體緩存中,一邊將這些改動追加到現有 AOF 文件的末尾,這樣樣即使在重寫的中途發生停機,現有的 AOF 文件也還是安全的。

    (4)當子進程完成重寫工作時,它給父進程發送一個信號,父進程在接收到信號之後,將記憶體緩存中的所有數據追加到新 AOF 文件的末尾。

    (5)現在Redis原子地用新文件替換舊文件,之後所有命令都會直接追加到新 AOF 文件的末尾。

  

  1.5 AOF優點

    (1) 可以使用不同的fsync(同步)策略:無fsync、每秒fsync、每次寫的時候fsync。使用預設的每秒fsync策略,Redis的性能依然很好(fsync是由後臺線程進行處理的,主線程會儘力處理客戶端請求),一旦出現故障,你最多丟失1秒的數據。

    (2) AOF文件是一個只進行追加的日誌文件,所以不需要寫入seek,某些原因(如:宕機)未執行完整的寫入命令,你也可使用redis-check-aof工具修複這些問題。

    (3) AOF 文件體積變得過大時,自動地在後臺對 AOF 進行重寫.整個重寫操作是絕對安全,即使重寫過程中發生停機,現有的 AOF 文件也不會丟失。一旦新 AOF 文件創建完畢,Redis就會從舊 AOF 文件切換到新 AOF 文件,並開始對新 AOF 文件進行追加操作。

    (4) AOF 文件有序地保存了對資料庫執行的所有寫入操作,這些寫入操作以Redis協議的格式保存,因此 AOF 文件的內容非常容易被人讀懂,對文件進行分析(parse)也很輕鬆。導出(export) AOF 文件也非常簡單。舉個例子:如果你不小心執行了 FLUSHALL 命令,但只要 AOF 文件未被重寫,那麼只要停止伺服器,移除 AOF 文件末尾的 FLUSHALL 命令,並重啟Redis,就可以將數據集恢復到 FLUSHALL 執行之前的狀態。

  

  1.5  AOF缺點

    (1) 對於相同的數據集來說,AOF 文件的體積通常要大於 RDB 文件的體積。

    (2) 根據所使用的fsync(同步)策略,AOF 的速度可能會慢於 RDB 。在一般情況下,每秒fsync的性能依然非常高,而關閉fsync可以讓 AOF 的速度和 RDB 一樣快,即使在高負荷之下也是如此。不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。

  

  1.6 如何選擇使用哪種持久化方式

     一般來說,如果想達到足以媲美PostgreSQL的數據安全性,應該同時使用兩種持久化功能。如果你非常關心你的數據,但仍然可以承受數分鐘以內的數據丟失,那麼你可以只使用 RDB 持久化。

    有很多用戶都只使用 AOF 持久化,但我們並不推薦這種方式:因為定時生成 RDB 快照(snapshot)非常便於進行資料庫備份,並且 RDB 恢複數據集的速度也要比 AOF 恢復的速度要快,除此之外,使用 RDB 還可以避免之前提到的 AOF 程式的 bug 。註意: 因為以上提到的種種原因,未來可能會將 AOF 和 RDB 整合成單個持久化模型。

   

二.  AOF持久化配置

  redis預設是關閉AOF機制,需要在配置文件中打開AOF, 註意通過 CONFIG SET 設置的配置重啟Redis服務後就會失效,如果要永久有效,需在redis.conf中打開AOF功能。腳本如下:

    127.0.0.1:6379>config set appendonly yes
    OK

  打開後每當Redis執行一個改變數據集的命令時(如:set),這個命令就會被追加到AOF文件的末尾,這樣當redis重新啟動時,程式就可以通過重新執行AOF文件中的命令來達到重建數據集的目的。

  

  2.1 AOF配置相關選項

選項

取值

說明

Appendonly

no|yes

是否開啟AOF機制

Appendfilename

"appendonly.aof"

Aof文件名

Appendfsync

no|appendfsync|always

AOF持久化同步頻率

no-appendfsync-on-rewrite

No | yes

在日誌進行BGREWRITEAOF時,如果設置為yes表示新寫操作不進行同步fsync,只是暫存在緩衝區里,避免造成磁碟IO操作衝突,等重寫完成後在寫入。redis中預設為no 

 

auto-aof-rewrite-percentage

100

當前AOF文件大小是上次日誌重寫時的AOF文件大小兩倍時,發生BGREWRITEAOF操作。

auto-aof-rewrite-min-size

64mb

當前AOF文件執行BGREWRITEAOF命令的最小值,避免剛開始啟動Reids時由於文件尺寸較小導致頻繁的BGREWRITEAOF。

aof-load-truncated

yes

Redis再恢復時,忽略最後一條可能存在問題的指令

aof-use-rdb-preamble

no

新增RDB-AOF混合持久化格式,在開啟了這個功能之後,AOF重寫產生的文件將同時包含RDB格式的內容和AOF格式的內容

  2.2 演示

    下麵測試AOF持久化,AOF文件是可識別的純文本,文件的內容就是一個個的Redis標準命令,下麵使用兩個set命令:

    127.0.0.1:6379> set name1 "zs"
    OK
    127.0.0.1:6379> set name2 "ls"
    OK

    下麵查看AOF文件, 可以發現裡面是一個個命令, 上面執行的寫命令對應的文件內容如下:

    [hsr@xuegod64 redis]$ cat appendonly.aof
    name1
    $2
    zs
    *3
    $3
    set
    $5
    name2
    $2
    ls

 

  


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

-Advertisement-
Play Games
更多相關文章
  • 在記憶體管理的上下文中, 初始化(initialization)可以有多種含義. 在許多CPU上, 必須顯式設置適用於Linux內核的記憶體模型. 例如在x86_32上需要切換到保護模式, 然後內核才能檢測到可用記憶體和寄存器. 而我們今天要講的boot階段就是系統初始化階段使用的記憶體分配器. 1 前景回 ...
  • tar命令可以為linux的文件和目錄創建檔案。利用tar,可以為某一特定文件創建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文件。tar最初被用來在磁帶上創建檔案,現在,用戶可以在任何設備上創建檔案。利用tar命令,可以把一大堆的文件和目錄全部打包成一個文件,這對於備份文件或將幾 ...
  • 一、背景 Netplan 是 Ubuntu 17.10中 引入的一種新的命令行網路配置實用程式,用於在 系統中輕鬆管理和配置網路設置。它允許您使用 YAML 抽象來配置網路介面。它可與 NetworkManager 和 systemd networkd 網路守護程式(稱為 渲染程式 ,您可以選擇使用 ...
  • 導入單個AD用戶命令 New-ADUser -Name "周八" -Surname "周" -GivenName "八"-SamAccountName "20160219008" -UserPrincipalName "[email protected]" -DisplayName "周八" -D ...
  • 一. 好用便利的工具,常用 pt-align 對齊文本格式pt-archiver 循序漸進的歸檔表,刪除表,遷移數據pt-config-diff 對比不同配置文件、伺服器配置參數pt-diskstats 查看磁碟iopt-fifo-split 把大文件通過管道分割成若幹小文件pt-kill 批量殺連 ...
  • 問題:Oracle EBS 11無法打開Form及Form顯示亂碼 解決: 1、嘗試使用jre1.5或1.6安裝目錄下jre/bin/server目錄里的jvm.dll替換JInitiator安裝目錄里的bin/hotspot目錄下的jvm.dll文件,如果替換後,後續操作提示錯誤,不妨再換為預設的 ...
  • 以前記錄數據可能很少也很簡單,比如說老王借了老李半斤肉,這樣的數據老李直接就寫到牆上就行了。 後來數據多了人們就以表格的方式開始記錄,寫到一張A4紙上,比如學生的檔案,有表頭和序號等。 表頭裡有姓名、性別、年齡、籍貫等等,有橫向的信息有豎向的信息。這樣的A4紙散放在那裡肯定是不行的。 於是人們把它們 ...
  • oracle11g中沒有scott用戶的解決,通過創建scott.sql文件,然後授予許可權,解鎖,修改密碼等一系列的操作來完成賬號建立 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...