面試官:說下 Redis 是如何保證在宕機後數據不丟失的

2021-01-09 網易

2021-01-02 10:30:03 來源: 來這解讀

舉報

  持久化

  首先我們說下什麼是持久化,持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。通俗的講,就是瞬時數據(比如內存中的數據,是不能永久保存的)持久化為持久數據(比如持久化至資料庫中,能夠長久保存)。另外我們使用的 Redis 之所以快就是因為數據都存儲在內存當中,為了保證在伺服器出現異常過後還能恢復數據,所以就有了 Redis 的持久化。

  RDB 和 AOF

  前面說了什麼是持久化,現在說說 Redis 的持久化,眾所周知 Redis 的持久化有兩種方式,一種是快照形式 RDB,另一種是增量文件 AOF。

  RDB

  RDB 持久化方式是會在一個特定的時間間隔裡面保存某個時間點的數據快照,我們拿到這個數據快照過後就可以根據這個快照完整的複製出數據。這種方式我們可以用來備份數據,把快照文件備份起來,傳送到其他伺服器就可以直接恢復數據。但是這只是某個時間點的全部數據,如果我們想要最新的數據,就只能定期的去生成快照文件。

  RDB 的實現主要是通過創建一個子進程來實現 RDB 文件的快照生成,通過子進程來實現備份功能,不會影響主進程的性能。同時上面也提到 RDB 的快照文件是保存一定時間間隔的數據的,這就會導致如果時間間隔過長,伺服器出現異常還沒來得及生成快照的時候就會丟失這個間隔時間的所有數據;那有同學就會說,我們可以把時間間隔設置的短一點,適當的縮短是可以的,但是如果間隔時間段設置短一點頻繁的生成快照對系統還是會有影響的,特別是在數據量大的情況下,高性能的環境下是不允許這種情況出現的。

  我們可以在 redis.conf 進行 RDB 的相關配置,配置生成快照的策略,以及日誌文件的路徑和名稱。還有定時備份規則,如下圖所示,裡面的注釋寫的很清楚,簡單說就是在多少時間以內多少個 key 變化了就會觸發快照。如save 300 10 表示在 5 分鐘內如果有 10 個 key 發生了變化就會觸發生產快照,其他的同理。

  

  除了我們在配置文件中配置自動生成快照文件之外,Redis 本身提供了相關的命令可以讓我們手動生成快照文件,分別是 SAVEBGSAVE ,這兩個命令功能相同但是方式和效果不一樣,SAVE 命令執行完後阻塞伺服器進程,阻塞過後伺服器就不能處理任何請求,所以在生產上不能用,和SAVE 命令直接阻塞伺服器進程的做法不同,BGSAVE 命令是生成一個子進程,通過子進程來創建 RDB 文件,主進程依舊可以處理接受到的命令,從而不會阻塞伺服器,在生產上可以使用。

  在這裡測試一下自動生成快照,我們修改一下快照的生成策略為save 10 2,然後在本地啟動Redis 服務,並用 redis-cli 連結進入,依次步驟如下

  

修改配置,如下啟動 Redis 服務,我們可以從啟動日誌中看到,默認是會先讀取 RDB 文件進行恢復的連結 Redis 服務,並在 10s 內設置 3 個 key這個時候我們會看到 Redis 的日誌裡面會輸出下面內容,因為觸發了規則,所以開啟子進程進行數據備份,同時在對應的文件路徑下面,我們也看到了 rdb 文件。

  從上面可以看出,我們配置的規則生效了,也成功的生成了 RDB 文件, 後續在伺服器出現異常的情況,只要重新啟動就會讀取對應的 RDB 文件進行數據備份。

  AOF

  AOF 是一種追加執行命令的形式,它跟 RDB 的區別是,AOF 並不是把數據保存下來,而是保存執行的動作。在開啟 AOF 功能的時候,客戶端連接後執行的每一條命令都會被記錄下來。這其實讓阿粉想起來的 MySQL 的 binlog 日誌,也是記錄操作的命令,後續可以根據文件去恢復數據。

  AOF 是追加命令格式的文件,同樣的我們可以定義多長時間把數據同步一次,Redis 本身提供了三種策略來實現命令的同步,分別是不進行同步,每秒同步一次,以及當有查詢的時候同步一次。默認的策略也是使用最多的策略就是每秒同步一次,這樣我們可以知道,丟失的數據最多也就只有一秒鐘的數據。有了這種機制,AOF 會比 RDB 可靠很多,但是因為文件裡面存在的是執行的命令,所以AOF 的文件一般也會比 RDB 的文件大點。

  Redis 的 AOF 功能,默認是沒有開啟的,我們可以通過在配置文件中配置appendonly yes 是功能開啟,同時配置同步策略appendfsync everysec 開啟每秒鐘同步一次,我們拿到 AOF 文件過後,可以根據這個文件恢復數據。

  同樣的我們在redis.conf 中可以看到默認是沒有開啟 AOF 功能的,並且我們也可以指定對應的文件名稱和路徑。

  

  接下來,我們測試一下開啟 AOF 功能,先修改配置然後重啟 Redis 的伺服器,我們會發現已經沒有讀取 RDB 文件的日誌了,並且在日誌文件路徑下面已經生成了一個 aof 文件。需要注意的是,因為我們重啟的服務,並且開啟了 AOF,所以現在 Redis 伺服器裡面並沒有我們之前添加的數據(說明什麼問題呢?)。

  

  

  接下來我們使用客戶端連接進入,設置如下值,接下來我們可以看看 aof 文件裡面的內容

  

  

  我們可以看到aof 文件裡面的內容就是執行的命令,只不過是以一種固定的格式存儲的,我們在備份的時候如果不需要哪些數據,可以手動刪掉對應的命令就可以重新備份數據。

  文件載入順序

  上面我們提到了Redis 的兩種持久化方案,並且兩種方案都會生成對應的文件,那 Redis 在恢復數據的時候是怎麼載入文件的呢?並且在兩個文件都存在的情況下,會以哪個為準呢?

  通過上面的測試,其實我們可以看出 Redis 是以 AOF 為優先的,畢竟 AOF 相對 RDB 來說在出現異常的情況下保存的數據更加完整。

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關焦點

  • 面試必問的 Redis:RDB、AOF、混合持久化
    主要細節還是挺多的,在翻源碼的過程中,會遇到一些疑惑點,也發現一些自己以前不知道的知識點,所以自己也要花點時間去搞清楚。  慢工出細活吧,本文還是有很多非常細節的內容的,如果能掌握,讓大廠面試官眼前一亮還是問題不大的。
  • 機率大的 Redis 面試題(含答案)|內存|key|原子性|哈希|redis_網易...
    單線程的redis為什麼這麼快redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構redis的過期策略以及內存淘汰機制【~】Redis 為什麼是單線程的,優點如何解決redis的並發競爭key問題Redis 集群方案應該怎麼做?都有哪些方案?有沒有嘗試進行多機redis 的部署?如何保證數據一致的?對於大量的請求怎麼樣處理Redis 常見性能問題和解決方案?
  • 詳解Redis中兩種持久化機制RDB和AOF(面試常問,工作常用)
    redis是一個內存資料庫,數據保存在內存中,但是我們都知道內存的數據變化是很快的,也容易發生丟失。幸好Redis還為我們提供了持久化的機制,分別是RDB(Redis DataBase)和AOF(Append Only File)。在這裡假設你已經了解了redis的基礎語法,某字母網站都有很好的教程,可以去看。基本使用的文章就不寫了,都是一些常用的命令。
  • 985碩,秋招面試30家企業,怒斬阿里、字節、美團offer
    6.面試官提示說可以不一定要在服務端生成訂單,可以考慮在請求的時候,或者用一些訂單生成算法?7.redis庫存用的什麼結構?8.如何保證庫存一致性?9.庫存多了或者少了有啥影響?10.分布式鎖11.下訂單和付錢的事務怎麼控制?12.如果有人下訂單未付錢如何回滾事務?
  • 大數據必學:redis深入了解 Redis 的持久化機制(RDB、AOF)
    因為 redis是一個內存資料庫,所有數據都存儲在內存中,而且內存中的數據非常容易丟失,所以 redis的數據持久化就變得非常重要, redis提供了兩種數據持久化方法,分別用於 RDB和 AOF,而 redis默認用於 RDB的數據持久化方法。
  • 去BAT,你應該要看一看的面試經驗總結
    第3點和第4點的門道一般在於考察你的代碼風格、對邊界條件的處理,比如判斷指針是否為空,千萬不要故意不考慮這種情形,即使你知道也不行,只要你不寫,一般面試官就認為你的思路不周詳,容錯率低;再比如,單鍊表的倒轉,最後的返回值肯定是倒轉後的鍊表頭結點,這樣才能引用一個鍊表,這些都是面試官想考慮的重點。
  • Redis教程:Redis持久化方式
    使用 Redis 附帶的 redis-check-aof 程序,對原來的 AOF 文件進行修復: redis-check-aof –x(可選)使用 di -u 對比修復後的 AOF 文件和原始 AOF 文件的備份,查看兩個文件之間的不同之處。重啟 Redis 伺服器,等待伺服器載入修復後的 AOF 文件,並進行數據恢復。
  • Redis持久化和備份
    內容導讀如果資料庫的數據文件結構組織不合理,可能就會導致數據完全不能恢復的狀況出現。而是通過配置數據同步備份的方式,在數據文件損壞後通過數據備份來進行恢復。實際上MongoDB在不開啟journaling日誌,通過配置Replica Sets時就是這種情況。
  • Redis如何存儲和計算一億用戶的活躍度
    01前段時間,在網上看到一道面試題:如何用redis存儲統計1億用戶一年的登陸情況,並快速檢索任意時間窗口內的活躍用戶數量。覺得很有意思,就仔細想了下 。並做了一系列實驗,自己模擬了下 。還是有點收穫的,現整理下來。
  • redis cluster 之master 選舉過程
    在redis 3.0版本後,官方推出了redis cluster 分布式解決方案,當一個redis節點掛了可以快速地切換到另一個節點。當遇到單機內存、並發等瓶頸時,可以採用分布式方案要解決問題.在cluster架構下,默認的,一般redis-master用於接收讀寫,而redis-slave則用於備份,當有請求是在向slave發起時,會直接重定向到對應key所在的master來處理。但如果不介意讀取的是redis-cluster中有可能過期的數據並且對寫請求不感興趣時,則亦可通過readonly命令,將slave設置成可讀,然後通過slave獲取相關的key,達到讀寫分離。
  • 四象限選拔法:從面試官角度,看數據產品經理的面試和選拔
    我總結了一套四象限選拔方法,作為每次提問和評估的提綱,與候選人進行面試溝通。今天分享給同行面試官做一些參考,也分享給想轉行和應聘數據產品經理的同學,看看面試官可能提哪些問題,提前做好面試準備。
  • MIT現任面試官、哈佛校友爆料,如何簡單通過留學面試
    InitialView(初面)Initial View (初面) 於2009年成立於中國北京,為眾多頂尖大學的申請者提供遠程面試服務。該面試流程為即興、脫稿的,從而保證其面試質量和真實性。面試有很多中方法,有申請初期的,InitialView或Vericant面試,也有申請後期的招生官或校友面試兩種形式來進行面試。
  • 面試常問道:Redis持久化之AOF
    1 AOF持久化方式我們還是從RDB和AOF的實現方式考慮:RDB保存的是一個時間點的快照,那麼如果Redis出現了故障,丟失的就是從最後一次RDB執行的時間點到故障發生的時間間隔之內產生的數據。如果Redis數據量很大,QPS很高,那麼執行一次RDB需要的時間會相應增加,發生故障時丟失的數據也會增多。
  • 空乘面試時如何讓面試官注意到你?
    如何讓面試官注意到你?大家出國時是否曾注意到空乘或地勤如何服務旅客呢?空乘與地勤是航空公司主要第一線服務旅客的員工,因此想要加入心儀的航空公司,可以模仿該航空公司已上線服務的空乘、地勤的彩妝、儀態,因為那是經人資訓練部門培訓出來的標準,符合該航空公司需求的空乘地勤形象。
  • 史上最全 40 道 Dubbo 面試題及答案,看完碾壓面試官
    想往高處走,怎麼能不懂 Dubbo? Dubbo是國內最出名的分布式服務框架,也是 Java 程式設計師必備的必會的框架之一。Dubbo 更是中高級面試過程中經常會問的技術,無論你是否用過,你都必須熟悉。
  • 面試官:太平洋的中間是什麼?80後神回復被錄用
    在職場上,如果說最難應付的人有兩個,一個是老闆,另一個肯定就是面試官了。在面試時,別看坐在你對面的面試官長不是和藹可親,就是漂亮大方,但其的腦子裡想的卻是千奇百態的奇葩問題,有時候,甚至懷疑他們的頭腦是不是人的腦袋。
  • 麻省理工招生官分享:最強面試攻略!
    另外,招生官也會評估申請者的口語能力和交流能力:畢竟在錄取之後,學生還需要在美國生活、學習,如果口語能力相差太遠,不僅無法正常生活、學習,更有可能連社交都成問題。再者,面試說到底是一場你和招生官的對話,如果連英語都說不了,又怎能和招生官進行更深層次的溝通和交流呢?
  • 面試官問:「你的興趣愛好是什麼?」這樣回答,面試官最滿意
    面試官問你有什麼體育運動方面的愛好,他可不是想尋找球友,而是想從側面了解你的工作精力和活力以及身體健康程度。面試官問你是否喜歡看書,他可能是想從側面看看你是否愛好學習。同時, 面試官也想了解候選人是否有不良嗜好,如果這個不良嗜好對於崗位有影響,可能就不不能要。比如說銷售崗位,有些時候需要喝酒,如果能喝可以,但是需要每天喝酒, 就不太行。
  • 面試官:10根香蕉,20位客戶,你如何分?小夥只用5秒鐘就被錄用
    在求職的時候,面試官發問的問題也讓人捉摸不透,所以,平時要培養好自己應變能力,和問題分析能力。因為小李跟另外兩位求職者在專業問題上都回答的相當優異,一時間面試官也不知道該選哪個好?面試官沉思會後問道:「10根香蕉,20位客戶,你如何分?」
  • Redis RDB與AOF模式下的持久化原理
    前言:在此之前,如果還不了解Redis的,或者不知道怎麼使用Redis,可以參考官網網站:https://redis.io/documentation自行學習,本文主要針對Redis的核心點之一:RDB和AOF持久化模式進行展開。