1. 程式人生 > >Redis 文章一 之持久化機制的介紹

Redis 文章一 之持久化機制的介紹

我們已經知道對於一個企業級的redis架構來說,持久化是不可減少的

企業級redis叢集架構:海量資料、高併發、高可用
持久化主要是做災難恢復,資料恢復,也可以歸類到高可用的一個環節裡面去,比如你redis整個掛了,然後redis就不可用了,你要做的事情是讓redis變得可用,儘快變得可用。此時你需要重啟redis,儘快讓它對外提供服務,但是如果你沒做資料備份,這個時候redis啟動了,裡面也是沒有資料的所以一樣也用不了,也沒辦法向外提供服務。所以當此刻有大量的請求過來,快取全部無法命中,在redis里根本找不到資料,這個時候系統,快取雪崩問題,所有請求,沒有在redis命中,就會去mysql資料庫這種資料來源頭中去找,一下子mysql承接高併發,然後就掛了。mysql掛掉,你都沒法去找資料恢復到redis裡面去,redis的資料從哪兒來?從mysql來。具體的完整的快取雪崩的場景,還有企業級的解決方案,會在後面的文章中解釋。

如果你把redis的持久化做好,備份和恢復方案做到企業級的程度,那麼即使你的redis故障了,也可以通過備份資料,快速恢復,一旦恢復立即對外提供服務。

1、RDB和AOF兩種持久化機制的介紹

redis持久化:RDB,AOF

1)、RDB持久化機制,對redis中的資料進行週期性的持久化。

2)、AOF機制對每條寫入命令作為日誌,以append-only的模式寫入一個日誌檔案中,在redis重啟的時候,可以通過回放AOF日誌中的寫入指令來重新構建整個資料集。

3)、通過RDB或AOF,都可以將redis記憶體中的資料給持久化到磁碟上,然後可以將這些資料備份到別的地方,比如說阿里雲,華為雲等雲服務。此時如果redis掛了,伺服器上的記憶體和磁碟上的資料都丟了,可以從雲服務上拷貝回來之前的資料,放到指定的目錄中,然後重新啟動redis,redis就會自動根據持久化資料檔案中的資料,去恢復記憶體中的資料,繼續對外提供服務。

注意 1、:如果同時使用RDB和AOF兩種持久化機制,那麼在redis重啟的時候,會使用AOF來重新構建資料,因為AOF中的資料更加完整(優先載入)

注意 2、:如果我們想要redis僅僅作為純記憶體的快取來用,那麼可以禁止RDB和AOF的持久化機制

2、RDB持久化機制的優點

1)、RDB會生成多個數據檔案,每個資料檔案都代表了某一個時刻中redis的資料,這種多個數據檔案的方式,非常適合做冷備,可以將這種完整的資料檔案傳送到一些遠端的安全儲存上去,比如華為雲、阿里雲等雲端儲存上,按照制定好的備份策略來定期備份redis中的資料。

2)、RDB這種持久化機制對redis對外提供的讀寫服務,影響非常小,可以讓redis保持高效能,因為redis主程序只需要fork一個子程序,讓子程序執行磁碟IO操作來進行RDB持久化即可。

3)、相對於AOF持久化機制來說,直接基於RDB這種持久化機制生成的資料檔案來重啟和恢復redis程序更加快速,因為不像AOF那樣需要一步一步的回放之前的操作指令之後,再進行恢復。(容易發生問題,難免出錯)

3、RDB持久化機制的缺點

1)、如果想要在redis發生故障時,儘可能少的丟失資料,那麼RDB持久化機制沒有AOF持久化機制好。通常情況下,RDB持久化機制產生的資料快照檔案,都是每隔5分鐘,或者更長時間生成一次,如果這個時候就redis程序宕機的話,那麼就難免會丟失最近5分鐘的資料。

2)、RDB這種持久化機制每次在fork子程序來執行RDB快照資料檔案生成的時候,如果需要備份的資料檔案特別大的話,可能會導致redis對客戶端提供的服務暫停數毫秒,或者甚至數秒,造成不好的使用者體驗。

4、AOF持久化機制的優點

1)、相比RDB的這種持久化機制來說AOF可以更好的保護資料的完整性,一般AOF持久化機制會每隔1秒,通過一個後臺執行緒執行一次fsync操作,所以redis出現問題最多會丟失1秒鐘的資料。

2)、AOF持久化機制生成的日誌檔案是以append-only模式寫入,所以沒有任何磁碟定址的開銷,寫入效能非常高,而且檔案不容易破損,即使檔案尾部破損,也很容易修復。

3)、AOF日誌檔案即使過大的時候,出現後臺重寫操作,也不會影響客戶端的讀寫。因為在rewrite log的時候,會對其中的指令進行壓縮,創建出一份需要恢復資料的最小日誌出來。在建立新日誌檔案的時候,老的日誌檔案還是照常寫入。當新的merge後的日誌檔案ready的時候,再交換新老日誌檔案即可。(就是把當前老的日誌資料壓縮一下,生成新的日誌,新來的資料還是繼續往老的日誌檔案寫,之後等新的資料壓縮完之後,把老日誌中新寫入的資料寫入再新的日誌,之後新的日誌檔案替換掉老的日誌檔案即可)。

4)、AOF日誌檔案的命令通過非常可讀的方式進行記錄,這個特性非常適合做災難性的誤刪除的緊急恢復。比如不小心用flushall命令清空了所有資料,只要這個時候後臺rewrite還沒有發生,那麼就可以立即拷貝AOF檔案,將最後一條flushall命令給刪了,然後再將該AOF檔案放回去,就可以通過恢復機制,自動恢復所有資料。

5、AOF持久化機制的缺點

1)、對於同一份資料來說,AOF日誌檔案通常比RDB資料快照檔案更大。

2)、當AOF開啟後,支援的寫QPS會比RDB支援的寫QPS低,因為AOF一般會配置成每秒fsync一次日誌檔案,當然,每秒一次fsync,效能也還是很高的。(QPS只每秒支援的訪問請求)。

3)、如果AOF發生bug,就是通過AOF記錄的日誌,進行資料恢復的時候,沒有恢復一模一樣的資料出來。所以說,類似AOF這種較為複雜的基於命令日誌merge回放的方式,比基於RDB每次持久化一份完整的資料快照檔案的方式,更加脆弱一些,容易出現bug。不過AOF就是為了避免rewrite過程導致的bug,因此每次rewrite並不是基於舊的指令日誌進行merge的,而是基於當時記憶體中的資料進行指令的重新構建,這樣健壯性會好很多。

6、RDB和AOF到底該如何選擇

1)、不要僅僅使用RDB的持久化機制,因為那樣會導致你丟失很多資料。

2)、也不要僅僅使用AOF的持久化機制,因為那樣有兩個問題:

第一、你通過AOF做冷備,沒有RDB做冷備來的恢復速度更快; 

第二、RDB每次簡單粗暴生成資料快照,更加健壯,可以避免AOF這種複雜的備份和恢復機制的bug;

3)、綜合使用AOF和RDB兩種持久化機制:

第一、用AOF來保證資料不丟失(資料丟失相對較少),作為資料恢復的第一選擇; 用RDB來做不同程度的冷備;

第二、在AOF檔案都丟失或損壞不可用的時候,還可以使用RDB來進行快速的資料恢復


幫忙關注一下 微信公眾號一起學習 :chengxuyuan95(不一樣的程式設計師)

相關推薦

Redis 文章 持久化機制介紹

我們已經知道對於一個企業級的redis架構來說,持久化是不可減少的 企業級redis叢集架構:海量資料、高併發、高可用 持久化主要是做災難恢復,資料恢復,也可以歸類到高可用的一個環節裡面去,比如你redis整個掛了,然後redis就不可用了,你要做的事情是讓redis變得可用,儘快變得可用。此時你需要重啟re

Redis學習持久化機制

原文部落格地址: pjmike的部落格 前言 持久化就是將Redis記憶體中的資料寫入到磁碟中進行儲存,因為Redis是記憶體資料庫,資料都是存在記憶體中的,為了避免程序退出導致資料的丟失,所以需要將資料持久化到硬碟中,這樣下次Redis重啟後可以利用之前持久化的檔案實現資料恢復。 一般有兩種

redisredis持久化機制

Redis 是一個開源( BSD 許可)的,記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。它支援的資料型別很豐富,如字串、連結串列、集 合、以及雜湊等,並且還支援多種排序功能。 什麼叫持久化? 用一句話可以將持久化概括為:將資料(如記憶體中的物件)

Redis系列----Redis的兩種持久化機制(RDB和AOF)

Redis的兩種持久化機制(RDB和AOF) 什麼是持久化    Redis的資料是儲存在記憶體中的,記憶體中的資料隨著伺服器的重啟或者宕機便會不復存在,在生產環境,伺服器宕機更是屢見不鮮,所以,我們希望Redis能夠將資料從記憶體中以某種形式儲存到磁碟中,使得重啟的時候可以載入磁碟中的檔案記錄恢復資料,這一

Redis系列Redis設計與實踐》整體觀感

屬於 磁盤 怎麽辦 template 編寫 鍵值 但是 為什麽 問題   筆者別的Redis方面的書沒有讀過,讀完這一本,力薦,作者黃建宏,對Redis不太熟悉的,但是對編程稍微有些基礎的,全部 讀下來應該無壓力。作者的編寫和講解非常詳細,覆蓋的面基本上都講到,之前一直都是

Atitit 持久化 Persistence概念的藝術 目錄 1. 持久化是將程式資料在持久狀態和瞬時狀態間轉換的機制。 1 2. DBC就是持久化機制。檔案IO也是持久化機制。 2 3.

Atitit 持久化 Persistence概念的藝術   目錄 1. 持久化是將程式資料在持久狀態和瞬時狀態間轉換的機制。 1 2. DBC就是一種持久化機制。檔案IO也是一種持久化機制。 2 3. 日常持久化的方法 2 4. 理解與分類 3 4.1

JavaScript專題學習 JavaScript簡單介紹

JavaScript介紹            行業內簡稱為js,後面還有一個jquery是javaScript的封裝框架非常重要,所以這兩個請一定要掌握!!!在實際專案工作中,必須會用到這兩個,所以覺得這兩個比較弱的,還是有必要再好好練習下!!! 如果對您有幫助 ,請

Redis進階持久化

一、Redis高可用概述 在介紹Redis高可用之前,先說明一下在Redis的語境中高可用的含義。 我們知道,在web伺服器中,高可用是指伺服器可以正常訪問的時間,衡量的標準是在多長時間內可以提供正常服務(99.9%、99.99%、99.999% 等等)。但是在Red

深度學習中基於tensorflow_slim進行復雜模型訓練tensorflow_slim基本介紹

最近在進行微表情識別,但是目前沒有查到比較有效的模型方式,考慮使用inception_v3的模型進行開發,但是該模的構造過程比較複雜,訓練更是麻煩,因此考慮基於tensorflow_slim的模組進行二次訓練,首先介紹一下關於tensorflow_slim的基本模組。 tensorflow_

C#網路程式設計系列文章()Socket實現非同步TCP伺服器

原創性宣告 文章系列目錄 程式碼下載地址 開篇 本人因為對於網路程式設計的喜愛,經常性的使用c#編寫各類伺服器(e.g TCP伺服器,UDP伺服器),但是基本上都是搞著玩,網上也有很多講c#網路程式設計的文章,當然我也參考了很多作者寫的文章。看了這篇

Android APP壓力測試() Monkey工具介紹

1)、指定一個包:adb shell monkey -p com.example.findyou  10 2)、指定多個包:adb shell monkey -p com.example.findyou –p com.example.findyou1 -p com.example.findyou2 100  

Android APP壓力測試()Monkey工具介紹

1)、指定一個包:adb shell monkey -p com.example.findyou  10 2)、指定多個包:adb shell monkey -p com.example.findyou –p com.example.findyou1 -p com.example.findyou2 100  

Redis持久化:快照和AOF

一、持久化 Redis持久化提供兩種方式:快照和AOF。1.快照(snapshotting) 將Redis記憶體中的資料在同一時刻(可以配置,比如300秒內有10個key發生了變化)的副本寫到磁碟 save 900 1 #900秒 1個修改 save 300 10 #300

redis redis的兩種持久化機制

Redis 提供了兩種方式,實現資料的持久化到硬碟。 1、【全量】RDB 持久化,是指在指定的時間間隔內將記憶體中的資料集快照寫

《【面試突擊】— Redis篇》-- Redis哨兵原理及持久化機制

能堅持別人不能堅持的,才能擁有別人未曾擁有的。關注程式設計大道公眾號,讓我們一同堅持心中所想,一起成長!! 《【面試突擊】— Redis篇》-- Redis哨兵原理及持久化機制 在這個系列裡,我會整理一些面試題與大家分享,幫助年後和我一樣想要在金三銀四準備跳槽的同學。我們一起鞏固、突擊面

趣解計算機網路()入門概念介紹

本文介紹一些入門基本概念 # 1. 辨析幾種“網” ## 1.1. 計算機網路 首先來看一張普通的網——蜘蛛網: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9naXRlZS5jb20veGluZ3Jlbmd1YW54dWUvYmxvZy1pbWFnZXMv

redis持久化機制(AOF和RDB)

redis中文官網:redis持久化 redis支援兩種持久化方式:RDB方式和AOF方式 一、RDB方式 在預設情況下,Redis將資料庫快照儲存在名字為dump.rdb的二進位制檔案中。你可以對Redis進行設定,讓它在“N秒內資料集至少有M個改動”這一條件被滿足時,自動

Redis高可用主從複製實踐 Redis介紹及部署在CentOS7上(

一、介紹 1、Redis的高可用有如下幾個部分組成: 第一部分:redis主從複製 第二部分:Sentinel哨兵模式 第三部分:叢集部署 本篇將介紹第一部分-redis 主從複製。那麼問題來了,為什麼需要主從複製呢?   2、為什麼需要主從複製呢? 從以下三點說明: A、re

redis持久化機制RDB

redis之所以能支援10W/s的讀寫操作主要是依靠1、所有資料都在記憶體。2、單執行緒架構,避免了多執行緒可能產生的競爭為題。3、使用c語言實現,距離作業系統更近。4、redis的程式碼經過作者精打細磨及優雅與一身。5、epoll模型io多路複用,將連線、讀寫、關閉都轉換為

Redis學習Redis兩種持久化機制

申明 本文章首發自本人公眾號:壹枝花算不算浪漫,如若轉載請標明來源! 感興趣的小夥伴可關注個人公眾號:壹枝花算不算浪漫 22.jpg 前言 Redis是基於記憶體來實現的NO SQL資料庫,但是我麼你都知道儲存在記憶體中的資料,只要伺服器關機,記憶體中的資料就會消失了。 為了避免記憶體中的資料丟失,Redi