Java開發大廠面試第22講:Redis 是如何保證系統高可用的?它的實現方式有哪些?

高可用是通過設計,減少系統不能提供服務的時間,是分布式系統的基礎也是保障系統可靠性的重要手段。而 Redis 作為一款普及率最高的內存型中間件,它的高可用技術也非常的成熟。

我們今天分享的面試題是,Redis 是如何保證系統高可用的?它的實現方式有哪些?

Redis通過一系列策略和技術來保證其系統的高可用性。以下是Redis保證高可用的主要實現方式:

  1. 持久化

    • RDB (Redis DataBase):在指定的時間間隔內將內存中的數據集快照寫入磁盤,它執行的是全量數據備份,恢復時是將快照文件直接讀到內存里。
    • AOF (Append Only File):以日志的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄),在Redis啟動之初會重新執行文件中記錄的寫指令來恢復數據。AOF日志是一個只進行追加的日志文件,因此寫入性能也非常高,而且文件不容易破損。
  2. 主從復制(Master-Slave)

    • 主從復制是Redis實現高可用的基礎,它的原理是將一臺Redis服務器的數據,復制到其他的Redis服務器。主節點(Master)處理寫請求,并將數據同步給從節點(Slave),從節點處理讀請求。當主節點故障時,可以通過選舉算法從從節點中選舉出新的主節點。
  3. 哨兵(Sentinel)

    • 哨兵是一個獨立的進程,用于監控主從集群的運行狀態。當主節點故障時,哨兵會執行自動故障轉移,將其中一個從節點提升為主節點,從而保證系統的高可用性。同時,哨兵還可以監控Redis的持久化情況,如果持久化出現故障,則通知管理員。
  4. Redis集群(Cluster)

    • Redis集群實現了Redis數據的分片,每個節點只保存一部分數據。集群通過哈希槽(Hash Slot)來分配數據,每個節點都負責一部分哈希槽。當節點故障時,集群會自動將數據重新分配到其他節點上,從而保證數據的高可用性。
  5. 讀寫分離

    • 在主從復制的基礎上,配合讀寫分離策略,可以進一步提高Redis的并發處理能力。通常主節點負責寫請求,而從節點負責讀請求。這樣可以減輕主節點的負載壓力,提高系統的整體性能。
  6. 使用代理工具

    • 如Twemproxy、Codis等代理工具可以實現Redis的負載均衡和故障轉移。這些工具將多個Redis實例組成一個集群,客戶端通過代理工具來訪問Redis集群,代理工具負責將請求分發到合適的Redis實例上。

典型回答

Redis 高可用的手段主要有以下四種:

  • 數據持久化
  • 主從數據同步(主從復制)
  • Redis 哨兵模式(Sentinel)
  • Redis 集群(Cluster)

其中數據持久化保證了系統在發生宕機或者重啟之后數據不會丟失,增加了系統的可靠性和減少了系統不可用的時間(省去了手動恢復數據的過程);而主從數據同步可以將數據存儲至多臺服務器,這樣當遇到一臺服務器宕機之后,可以很快地切換至另一臺服務器以繼續提供服務;哨兵模式用于發生故障之后自動切換服務器;而 Redis 集群提供了多主多從的 Redis 分布式集群環境,用于提供性能更好的 Redis 服務,并且它自身擁有故障自動切換的能力。

考點分析

高可用的問題屬于 Redis 中比較大的面試題了,因為很多知識點都和這個面試題有關,同時也屬于比較難的面試題了。因為涉及了分布式集群,而分布式集群屬于 Redis 中比較難懂的一個知識點。和此問題相關的面試題還有以下幾個:

  • 數據持久化有幾種方式?
  • Redis 主從同步有幾種模式?
  • 什么是 Redis 哨兵模式?它解決了什么問題?
  • Redis 集群的優勢是什么?

知識擴展

1.數據持久化

持久化功能是 Redis 和 Memcached 的主要區別之一,因為只有 Redis 提供了此功能。

在 Redis 4.0 之前數據持久化方式有兩種:AOF 方式和 RDB 方式。

  • RDB(Redis DataBase,快照方式)是將某一個時刻的內存數據,以二進制的方式寫入磁盤。
  • AOF(Append Only File,文件追加方式)是指將所有的操作命令,以文本的形式追加到文件中。

RDB 默認的保存文件為 dump.rdb,優點是以二進制存儲的,因此占用的空間更小、數據存儲更緊湊,并且與 AOF 相比,RDB 具備更快的重啟恢復能力。

AOF 默認的保存文件為 appendonly.aof,它的優點是存儲頻率更高,因此丟失數據的風險就越低,并且 AOF 并不是以二進制存儲的,所以它的存儲信息更易懂。缺點是占用空間大,重啟之后的數據恢復速度比較慢。

可以看出 RDB 和 AOF 各有利弊,RDB 具備更快速的數據重啟恢復能力,并且占用更小的磁盤空間,但有數據丟失的風險;而 AOF 文件的可讀性更高,但卻占用了更大的空間,且重啟之后的恢復速度更慢,于是在 Redis 4.0 就推出了混合持久化的功能。

混合持久化的功能指的是 Redis 可以使用 RDB + AOF 兩種格式來進行數據持久化,這樣就可以做到揚長避短物盡其用了,混合持久化的存儲示意圖如下圖所示:

image (1).png

我們可以使用“config get aof-use-rdb-preamble”的命令來查詢 Redis 混合持久化的功能是否開啟,執行示例如下:

127.0.0.1:6379> config get aof-use-rdb-preamble
1) "aof-use-rdb-preamble"
2) "yes"

如果執行結果為“no”則表示混合持久化功能關閉,不過我們可以使用“config set aof-use-rdb-preamble yes”的命令打開此功能。
Redis 混合持久化的存儲模式是,開始的數據以 RDB 的格式進行存儲,因此只會占用少量的空間,并且之后的命令會以 AOF 的方式進行數據追加,這樣就可以減低數據丟失的風險,同時可以提高數據恢復的速度。

2.Redis 主從同步

主從同步是 Redis 多機運行中最基礎的功能,它是把多個 Redis 節點組成一個 Redis 集群,在這個集群當中有一個主節點用來進行數據的操作,其他從節點用于同步主節點的內容,并且提供給客戶端進行數據查詢。

Redis 主從同步分為:主從模式和從從模式。主從模式就是一個主節點和多個一級從節點,如下圖所示:

image (3).png

從從模式是指一級從節點下面還可以擁有更多的從節點,如下圖所示:

image (4).png

主從模式可以提高 Redis 的整體運行速度,因為使用主從模式就可以實現數據的讀寫分離,把寫操作的請求分發到主節點上,把其他的讀操作請求分發到從節點上,這樣就減輕了 Redis 主節點的運行壓力,并且提高了 Redis 的整體運行速度。

不但如此使用主從模式還實現了 Redis 的高可用,當主服務器宕機之后,可以很迅速的把從節點提升為主節點,為 Redis 服務器的宕機恢復節省了寶貴的時間。

并且主從復制還降低了數據丟失的風險,因為數據是完整拷貝在多臺服務器上的,當一個服務器磁盤壞掉之后,可以從其他服務器拿到完整的備份數據。

3.Redis 哨兵模式

Redis 主從復制模式有那么多的優點,但是有一個致命的缺點,就是當 Redis 的主節點宕機之后,必須人工介入手動恢復,那么到特殊時間段,比如公司組織全體團建或者半夜突然發生主節點宕機的問題,此時如果等待人工去處理就會很慢,這個時間是我們不允許的,并且我們還需要招聘專職的人來負責數據恢復的事,同時招聘的人還需要懂得相關的技術才能勝任這份工作。既然如此的麻煩,那有沒有簡單一點的解決方案,這個時候我們就需要用到 Redis 的哨兵模式了。

Redis 哨兵模式就是用來監視 Redis 主從服務器的,當 Redis 的主從服務器發生故障之后,Redis 哨兵提供了自動容災修復的功能,如下圖所示:

image (5).png

Redis 哨兵模塊存儲在 Redis 的 src/redis-sentinel 目錄下,如下圖所示:

image (6).png

我們可以使用命令“./src/redis-sentinel sentinel.conf”來啟動哨兵功能。

有了哨兵功能之后,就再也不怕 Redis 主從服務器宕機了。哨兵的工作原理是每個哨兵會以每秒鐘 1 次的頻率,向已知的主服務器和從服務器,發送一個 PING 命令。如果最后一次有效回復 PING 命令的時間,超過了配置的最大下線時間(Down-After-Milliseconds)時,默認是 30s,那么這個實例會被哨兵標記為主觀下線。

如果一個主服務器被標記為主觀下線,那么正在監視這個主服務器的所有哨兵節點,要以每秒 1 次的頻率確認主服務器是否進入了主觀下線的狀態。如果有足夠數量(quorum 配置值)的哨兵證實該主服務器為主觀下線,那么這個主服務器被標記為客觀下線。此時所有的哨兵會按照規則(協商)自動選出新的主節點服務器,并自動完成主服務器的自動切換功能,而整個過程都是無須人工干預的。

4.Redis 集群

Redis 集群也就是 Redis Cluster,它是 Redis 3.0 版本推出的 Redis 集群方案,將數據分布在不同的主服務器上,以此來降低系統對單主節點的依賴,并且可以大大提高 Redis 服務的讀寫性能。Redis 集群除了擁有主從模式 + 哨兵模式的所有功能之外,還提供了多個主從節點的集群功能,實現了真正意義上的分布式集群服務,如下圖所示:

image (7).png

Redis 集群可以實現數據分片服務,也就是說在 Redis 集群中有 16384 個槽位用來存儲所有的數據,當我們有 N 個主節點時,可以把 16384 個槽位平均分配到 N 臺主服務器上。當有鍵值存儲時,Redis 會使用 crc16 算法進行 hash 得到一個整數值,然后用這個整數值對 16384 進行取模來得到具體槽位,再把此鍵值存儲在對應的服務器上,讀取操作也是同樣的道理,這樣我們就實現了數據分片的功能。

小結

今天我們分享了保障 Redis 高可用的 4 種手段:數據持久化保證了數據不丟失;Redis 主從讓 Redis 從單機變成了多機。它有兩種模式:主從模式和從從模式,但當主節點出現問題時,需要人工手動恢復系統;Redis 哨兵模式用來監控 Redis 主從模式,并提供了自動容災恢復的功能。最后是 Redis 集群,除了可以提供主從和哨兵的功能之外,還提供了多個主從節點的集群功能,這樣就可以把數據均勻的存儲各個主機主節點上,實現了系統的橫向擴展,大大提高了 Redis 的并發處理能力。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15098.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GPT-4o之多模態

前言 想必,很多小伙伴都知道GPT-4o已經發布了,一手基于多模態的問答顯示,看起來挺厲害的(也就是看起來, )。然后,我就順手看了看什么是多模態。 簡介 多模態(Multimodal&#xff…

什么是組態?什么是工業控制中的組態軟件?

隨著工業4.0和智能制造的發展,工控軟件的應用越來越廣泛,它們在提高生產效率、降低能耗和減少人力成本等方面發揮著越來越重要的作用。 什么是工控軟件? 工控軟件是指用于工業控制系統的軟件,主要應用于各種生產過程控制、自動化…

標準庫算法

歡迎訪問我的博客首頁。 標準庫算法 1. 查找對象的算法2. 其它只讀算法3. 二分搜索算法4. 寫容器元素的算法5. 劃分與排序算法6. 通用重排操作7. 排列算法8. 有序序 列的 集合算法9. 最 小值和 最大值10. 數值算法11. 參考 Pred 表示返回值為布爾類型的可調用對象。 1. 查找對…

Python序列的概念與使用-課后作業[python123題庫]

序列的概念與使用-課后作業 一、單項選擇題 1、關于Python組合數據類型,以下描述錯誤的是:??????????????????????????????????????????????????????????????????????????…

Flutter 中的 DecoratedBox 小部件:全面指南

Flutter 中的 DecoratedBox 小部件:全面指南 在Flutter中,DecoratedBox是一個功能豐富的小部件,它為子組件提供了多種裝飾效果,如背景色、邊框和陰影。通過DecoratedBox,你可以輕松地為任何小部件添加裝飾&#xff0c…

PLSQL連接Linux Oracle21c

PLSQL連接Linux Oracle21c 一、安裝PLsql 下載官網 https://www.allroundautomations.com/registered-plsqldev/ 二、Oracle Instant Client下載 使用plsql連接oracle的時候是需要本地先安裝oracle客戶端,英文名就是Oracle Instant Client。 官方下載地址&…

初出茅廬的小李博客之用MQTT.fx軟件進行消息發布與訂閱【 基于EMQX Cloud】

MQTT.fx軟件使用簡單介紹 MQTT.fx 的軟件界面如下圖所示,最上方為 MQTT Broker 連接地址欄,及其連接配置。其下方功能 Tabs 含有 Publish 發布欄、Subscribe 訂閱欄、Scripts 腳本欄、Broker Status 狀態消息欄、Log 日志信息控制欄。 連接之前要明確幾…

【Linux系列】軟鏈接使用

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

深入編程邏輯:從分支到循環的奧秘

新書上架~👇全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目錄 一、編程邏輯的基石:分支與循環 分支邏輯詳解 代碼案例:判斷整數是…

函數的拓展

7.1.1 基本用法 在ES6之前,不能直接為函數的參數指定默認值,只能采用變通的方法。 function log(x.y){ y y || Worldl console.log(x,y); }log(hello) //hello World log(hello,Chine) //hello Chine log(hello,) //hello World上面的代碼檢查函數…

UE5 雙手握劍的實現(逆向運動學IK)

UE5 雙手握劍的實現 IK 前言 什么是IK? UE官方給我們提供了很多對于IK處理的節點,比如ABRIK、Two Bone IK、Full Body IK 、CCD IK等,但是看到這,很多人就好奇了,什么是IK? 首先我們來看看虛幻小白人的骨…

[圖解]產品經理創新之阿布思考法

0 00:00:00,000 --> 00:00:01,900 那剛才我們講到了 1 00:00:02,730 --> 00:00:03,746 業務序列圖 2 00:00:03,746 --> 00:00:04,560 然后怎么 3 00:00:05,530 --> 00:00:06,963 畫現狀,怎么改進 4 00:00:06,963 --> 00:00:09,012 然后改進的模式…

【Spring Security + OAuth2】授權

Spring Security OAuth2 第一章 Spring Security 快速入門 第二章 Spring Security 自定義配置 第三章 Spring Security 前后端分離配置 第四章 Spring Security 身份認證 第五章 Spring Security 授權 第六章 OAuth2 文章目錄 Spring Security OAuth21、基于request的授權1…

一條命令安裝Metasploit Framework

做安全滲透的人都或多或少的使用kali-Linux系統中msfconsole命令啟動工具,然而也經常會有人遇到這樣那樣的問題無法啟動 今天我們就用一條命令來重新安裝這個工具 curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/met…

AI學習AI知識路線

數學基礎 一、數據分析 二、概率論 三、線性代數及矩陣 l 數學基礎 1)常數e2)導數3)梯度 4)Taylor5)gini系數6)信息熵與組合數 1)概率論基礎2)古典模型3)常見概率分布 4)大數定理和中心極限定理5)協方差(矩陣)和相關系數 6)最大似然估計和最大后驗估計 1)線性空間及線性變…

Windows內核--內存區對象(Section Object)(5.2)

內存區對象 Section Object表示可以共享的內存段。進程可以使用Section與其他進程共享其部分內存地址空間. Section還可為進程提供將文件映射到其內存地址空間的機制。 Linux有mmap與之類似。 參考: Section Objects and Views 內存區對象是虛擬描述符表VAD節點的一種 VAD樹節點…

LabVIEW如何確保自動化設備的穩定性和可靠性?

為了確保LabVIEW在自動化設備中的穩定性和可靠性,可以采取以下關鍵措施: 1. 代碼架構與設計 模塊化設計:將程序分解為獨立的模塊或子VI,每個模塊負責特定功能,便于測試和維護。狀態機架構:使用狀態機架構…

zookeeper選主之LeaderLatch

概述 利用zookeeper來進行選主,可以使用apache curator framework,它給我們封裝了兩種選主工具,它們分別是LeaderSelector和LeaderLatch。它們各自的應用場景不一樣,LeaderSelector應用于那些需要頻繁變主的情況,而Le…

Redis機制-Redis互斥鎖、分布式鎖

目錄 一 互斥鎖 二 分布式鎖 Redis實現分布式鎖 redisson實現分布式鎖 可重入性: 主從一致性(性能差): 一 互斥鎖 假設我們現在有一個業務要實現秒殺優惠券的功能,如果是一個正常的流程,線程之間應該…

數據結構中鏈表的題目

題目: 設計一個算法,要求將鏈表中所有節點的鏈接方向“原地”逆轉,即要求僅利用原表的存儲空間。 對于這個問題,首先要分析的是:鏈表中的頭和尾節點如何插入?其次就是:如何鏈接? 搞懂…