22-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 兩種格式來進行數據持久化,這樣就可以做到揚長避短物盡其用了,混合持久化的存儲示意圖如下圖所示:

在這裏插入圖片描述
我們可以使用“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 主從同步分爲:主從模式和從從模式。主從模式就是一個主節點和多個一級從節點,如下圖所示:
在這裏插入圖片描述
而從從模式是指一級從節點下面還可以擁有更多的從節點,如下圖所示:

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

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

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

3.Redis 哨兵模式

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

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

在這裏插入圖片描述
Redis 哨兵模塊存儲在 Redis 的 src/redis-sentinel 目錄下,如下圖所示:
在這裏插入圖片描述
我們可以使用命令“./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 集羣除了擁有主從模式 + 哨兵模式的所有功能之外,還提供了多個主從節點的集羣功能,實現了真正意義上的分佈式集羣服務,如下圖所示:
在這裏插入圖片描述
Redis 集羣可以實現數據分片服務,也就是說在 Redis 集羣中有 16384 個槽位用來存儲所有的數據,當我們有 N 個主節點時,可以把 16384 個槽位平均分配到 N 臺主服務器上。當有鍵值存儲時,Redis 會使用 crc16 算法進行 hash 得到一個整數值,然後用這個整數值對 16384 進行取模來得到具體槽位,再把此鍵值存儲在對應的服務器上,讀取操作也是同樣的道理,這樣我們就實現了數據分片的功能。

小結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章