Redis Cluster 如何做到高可用?

如果 Redis Cluster 中的某個 master 節點掛了,它是如何保證集羣自身的高可用的?如果這個時候我們集羣需要擴容節點,它該負責哪些槽位呢?我們一個一個問題的來看一下。

集羣如何進行擴容

我們開篇聊過,Redis Cluster 可以很方便的進行橫向擴容,那當新的節點加入進來的時候,它是如何獲取對應的 slot 的呢?

答案是通過 reshard(重新分片)來實現。reshard 可以將已經分配給某個節點的任意數量的 slot 遷移給另一個節點,在 Redis 內部是由 redis-trib 負責執行的。你可以理解爲 Redis 其實已經封裝好了所有的命令,而 redis-trib 則負責向獲取 slot 的節點和被轉移 slot 的節點發送命令來最終實現 reshard。

假設我們需要向集羣中加入一個 D 節點,而此時集羣內已經有 A、B、C 三個節點了。

此時 redis-trib 會向 A、B、C 三個節點發送遷移出槽位的請求,同時向 D 節點發送準備導入槽位的請求,做好準備之後 A、B、C 這三個源節點就開始執行遷移,將對應的 slot 所對應的鍵值對遷移至目標節點 D。最後 redis-trib 會向集羣中所有主節點發送槽位的變更信息。

高可用及故障轉移

Redis Cluster 中保證集羣高可用的思路和實現和 Redis Sentinel 如出一轍,感興趣的可以去看我之前寫的關於 Sentinel 的文章 Redis Sentinel - 深入淺出原理和實戰

簡單來說,針對 A 節點,某一個節點認爲 A 宕機了,那麼此時是主觀宕機。而如果集羣內超過半數的節點認爲 A 掛了, 那麼此時 A 就會被標記爲客觀宕機

一旦節點 A 被標記爲了客觀宕機,集羣就會開始執行故障轉移。其餘正常運行的 master 節點會進行投票選舉,從 A 節點的 slave 節點中選舉出一個,將其切換成新的 master 對外提供服務。當某個 slave 獲得了超過半數的 master 節點投票,就成功當選。

cluster-failover

當選成功之後,新的 master 會執行slaveof no one來讓自己停止複製 A 節點,使自己成爲 master。然後將 A 節點所負責處理的 slot,全部轉移給自己,然後就會向集羣發 PONG 消息來廣播自己的最新狀態。

按照一致性哈希的思想,如果某個節點掛了,那麼就會沿着那個圓環,按照順時針的順序找到遇到的第一個 Redis 實例。

而對於 Redis Cluster,某個 key 它其實並不關心它最終要去到哪個節點,他只關心他最終落到哪個 slot 上,無論你節點怎麼去遷移,最終還是隻需要找到對應的 slot,然後再找到 slot 關聯的節點,最終就能夠找到最終的 Redis 實例了。

那這個 PONG 消息又是什麼東西呢?別急,下面就會聊到。

簡單瞭解 gossip 協議

這就是 Redis Cluster 各個節點之間交換數據、通信所採用的一種協議,叫做 gossip

gossip: 流言、八卦、小道消息

gossip 是在 1989 年的論文上提出的,我看了一堆資料都說的是 1987 年發表的,但是文章裏的時間明確是 1989 年 1 月份發表。

image-20201215100703648

感興趣的可以去看看 Epidemic Algorithms for Replicated . Database Maintenance,在當時提出 gossip 主要是爲了解決在分佈式數據庫中,各個副本節點的數據同步問題。但隨着技術的發展,gossip 後續也被廣泛運用於信息擴散、故障探測等等。

Redis Cluster 就是利用了 gossip 來實現自身的信息擴散的。那使用 gossip 具體是如何通信的呢?

gossip

很簡單,就像圖裏這樣。每個 Redis 節點每秒鐘都會向其他的節點發送 PING,然後被 PING 的節點會回一個 PONG

gossip 協議消息類型

Redis Cluster 中,節點之間的消息類型有 5 種,分別是 MEET、PING、PONG、FAIL 和 PUBLISH。這些消息分別傳遞了什麼內容呢?我簡單總結了一下。

9pFgc1

使用 gossip 的優劣

既然 Redis Cluster 選擇了 gossip,那肯定存在一些 gossip 的優點,我們接下來簡單梳理一下。

HVe6sz

gossip 可以在 O(logN) 輪就可以將信息傳播到所有的節點,爲什麼是 O(logN) 呢?因爲每次 ping,當前節點會帶上自己的信息外加整個 Cluster 的 1/10 數量的節點信息,一起發送出去。你可以簡單的把這個模型抽象爲:

你轉發了一個特別有意思的文章到朋友圈,然後你的朋友們都覺得還不錯,於是就一傳十、十傳百這樣的散播出去了,這就是朋友圈的裂變傳播

當然,gossip 仍然存在一些缺點。例如消息可能最終會經過很多輪才能到達目標節點,而這可能會帶來較大的延遲。同時由於節點會隨機選出 5 個最久沒有通信的節點,這可能會造成某一個節點同時收到 n 個重複的消息。

總結

總的來說,Redis Cluster 相當於是把 Redis 的主從架構Sentinel 集成到了一起,從 Redis Cluster 的高可用機制、判斷故障轉移以及執行故障轉移的過程,都和主從、Sentinel 相關,主從是 Redis 高可用架構的基石。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/q02N9evUvynnOGRrYzTZbA