高可用是通過設計,減少系統不能提供服務的時間,是分布式系統的基礎也是保障系統可靠性的重要手段。
Redis 是如何保證系統高可用的?它的實現方式有哪些?
Redis 高可用的手段主要有以下四種:
(1)數據持久化
(2)主從同步(主從復制)
(3)Redis 哨兵模式(Sentinel)
(4)Redis 集群(Cluster)
數據持久化
數據持久化保證了系統在發生宕機或者重啟之后數據不會丟失,增加了系統的可靠性和減少了系統不可用的時間(省去了手動恢復數據的過程);
在 Redis 4.0 之前數據持久化方式有兩種:AOF 方式和 RDB 方式,在 Redis 4.0 推出了混合持久化的功能。
(1) RDB(Redis DataBase,快照恢復)是將某一個時刻的內存數據,以二進制的方式寫入磁盤。RDB 默認的保存文件為 dump.rdb,優點是以二進制存儲的,因此占用的空間更小、數據存儲更緊湊,並且與 AOF 相比,RDB 具備更快的重啟恢復能力,但有數據丟失的風險。
(2) AOF(Append-Only File,只追加文件)是指將所有的操作命令,以文本的形式追加到文件中。AOF 默認的保存文件為 appendonly.aof,它的優點是存儲頻率更高,因此丟失數據的風險就越低,並且 AOF 並不是以二進制存儲的,所以可讀性更高。缺點是占用空間大,重啟之后的數據恢復速度比較慢。
(3) Redis 混合持久化的存儲模式指的是 Redis 可以使用 RDB + AOF 兩種格式來進行數據持久化,開始的數據以 RDB 的格式進行存儲,因此只會占用少量的空間,之后的命令會以 AOF 的方式進行數據追加,這樣就可以減低數據丟失的風險,同時可以提高數據恢復的速度這樣就可以做到揚長避短物盡其用了,混合持久化的存儲示意圖如下圖所示:

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

如果執行結果為“no”則表示混合持久化功能關閉,不過我們可以使用“config set aof-use-rdb-preamble yes”的命令打開此功能。
我們可以使用“config get appendonly ”的命令來查詢 Redis 混合持久化的功能是否開啟,執行示例如下
SDH中

Redis主從同步
主從同步是 Redis 多機運行中最基礎的功能,有一主節點和多個從節點,多個節點組成一個 Redis 集群,在這個集群主節點用來進行數據的操作,其他從節點用於同步主節點的內容,並且提供給客戶端進行數據查詢。
Redis 主從同步分為:主從模式和從從模式。
主從模式就是一個主節點和多個一級從節點,如下圖所示:

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

使用主從模式就可以實現數據的讀寫分離,把寫操作的請求分發到主節點上,把其他的讀操作請求分發到從節點上,這樣就減輕了 Redis 主節點的運行壓力,並且提高了 Redis 的整體運行速度。不但如此使用主從模式還實現了 Redis 的高可用,當主服務器宕機之后,可以很迅速的把從節點提升為主節點,為 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 配置值)的哨兵證實該主服務器為主觀下線,那么這個主服務器被標記為客觀下線。此時所有的哨兵會按照規則(協商)自動選出新的主節點服務器,並自動完成主服務器的自動切換功能,而整個過程都是無須人工干預的。
Redis 集群
Redis集群也就是 Redis Cluster,它是 Redis 3.0 版本推出的 Redis 集群方案,有多個主節點同時每個主節點有多個從節點,將數據分布在不同的主服務器上,以此來降低系統對單主節點的依賴,並且可以大大提高 Redis 服務的讀寫性能。Redis 集群除了擁有主從模式 + 哨兵模式的所有功能之外,還提供了多個主從節點的集群功能,實現了真正意義上的分布式集群服務,如下圖所示:

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

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