三種叢集模式

  • redis有三種叢集模式,其中主從是最常見的模式。
  • Sentinel 哨兵模式是為了彌補主從複製叢集中主機宕機後,主備切換的複雜性而演變出來的。哨兵顧名思義,就是用來監控的,主要作用就是監控主從叢集,自動切換主備,完成叢集故障轉移。
  • cluster 模式是redis官方提供的叢集模式,使用了Sharding 技術,不僅實現了高可用、讀寫分離、也實現了真正的分散式儲存。

一、主從複製

redis主從複製
  • 1、reids主從模式

  • 2、redis複製原理

    redis 的複製分為兩部分操作 同步(SYNC)和 命令傳播(command propagate)

    • 同步(SYNC)用來將從伺服器的狀態 更新到 和主伺服器 一致。白話文解釋就是從伺服器主動獲取 主伺服器的資料。保持資料一致。具體實現是,主伺服器收到SYNC命令後,生成RDB快照檔案,然後傳送給從伺服器。
    • 命令傳播 (command propagate)用於在主伺服器資料被修改後,主從不一致,為了讓從伺服器保持和主伺服器狀態一致,而做的命令傳播。白話文解釋就是主伺服器收到客戶端修改資料命令後,資料庫資料發生變化,同時將命令快取起來,然後將快取命令傳送到從伺服器,從伺服器通過載入快取命令來達到主從資料一致。這就是所謂的命令傳播。
    • 為什麼需要有同步和命令傳播的兩種複製操作: 當只有同步操作時候,那麼在從伺服器向主伺服器傳送SYNC命令時候,主伺服器在生成RDB快照檔案時候,仍然會收到客戶端的命令修改資料狀態,這部分資料如果不能傳達給從伺服器,那麼就會出現主從資料不一致的現象。這時候就出現了命令傳播,主伺服器收到從伺服器的SYNC命令後,生成RDB快照檔案同時,將此段時間內收到的命令快取起來,然後使用命令傳播的操作傳送從伺服器。來達到主從資料一致。
  • 3、redis主從複製原理

    上面介紹了redis複製的兩種操作,而redis得主從複製正式基於 同步命令傳播 來實現得。下面兩張圖展示了redis複製的流程:

  • 4、redis主從複製優缺點

優點:

  • 1、實現讀寫分離,提高了可用性,解決了單機故障
  • 2、主從複製期間master和slave都是非阻塞方式,仍然可用。

缺點:

  • 1、master宕機期間,需要手動切換主機,同時會有部分資料不能及時同步從伺服器,造成資料不一致(需要人工手動介入)
  • 2、slave宕機後,多個slave恢復後,大量的SYNC同步會造成master IO壓力倍增(可以手動規避啟動時間)
  • 3、線上擴容較複雜。

總結:

redis主從複製的優點主要是提高了可用性缺點


二、Sentinel 哨兵模式

Sentinel 哨兵
  • Sentinel 哨兵介紹

    Sentinel 哨兵本質上是一個執行在特殊模式下的Redis例項,只是初始化的過程和工作與普通的Redis不同,本質上也是一個單獨的程序。

    Sentinel 哨兵 是Redis的高可用解決方案:一個或多個Sentinel例項(instance)組成的Sentinel系統(system)可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器,並在主伺服器下線時可以自動切換從伺服器升級為主伺服器。

1、Sentinel系統

下圖是一個簡單的Sentinel系統架構圖,一個Sentinel系統監視一個主從叢集,其中server1是Redis主伺服器,server2/3/4是Redis 從伺服器。主從之間利用上面的主從複製來達到主從一致。而Sentinel系統監視整個主從叢集。


2、Sentinel故障轉移

當Sentinel系統察覺到Server1主伺服器下線時,就會終止server2/3/4的複製。

同時Sentinel將server2升級為主伺服器,server3/4從新的主伺服器進行復制。同時等待server1的再次上線。

Sentinel系統也可以主動降級主服務為從伺服器,將從伺服器升級為主伺服器。

  • 2.1、Sentinel 哨兵監控過程

    Sentinel 哨兵監控叢集過程:

    • 命令 Sentinel哨兵通過傳送命令,讓redis伺服器返回執行狀態。
    • 釋出訂閱 當主伺服器狀態發生變化時,Sentinel哨兵通過釋出訂閱模式通知其他從伺服器。
  • 2.2、Sentinel 哨兵故障轉移

    Sentinel 故障轉移:

    • 1、Sentinel系統中的Sentinel例項每隔1s就像叢集傳送PING命令
    • 2、如果叢集中有例項的回覆Sentinel例項時間超過了 down-after-milliseconds,那麼這個例項就會發送PING命令的Sentinel例項被主觀下線
    • 3、那麼什麼時候會客觀下線呢?需要Sentinel系統中其他例項也確認叢集中該例項主管下線。

      如果master主伺服器被標記為主觀下線,則Sentinel系統中監視master的Sentinel程序需要以每秒一次的頻率確認Master是否進入主管下線狀態
    • 4、當有足夠的Sentinel例項(取決於配置)確認Master進入了主管下線,則Master會被標記為客觀下線。

  • 3、Sentinel 哨兵優缺點

    優點:

    • 1、哨兵模式基於主從複製,因此主從複製的優點哨兵都具備
    • 2、哨兵具備了主從切換和故障轉移,因此叢集有了更高的可用性

    缺點:

    • 1、Redis較難支援線上擴容,線上擴容比較複雜。


總結:

sentinel 哨兵主要用來監控redis主從叢集,提高了redis 主從叢集的可用性。


三、cluster 模式

redis cluster
  • 1、reids cluster

    Redis Cluster是一種伺服器 Sharding 技術,redis 3.0版本開始正式提供。

    Sentinel基本已經實現了高可用,但是每臺機器都儲存相同內容,很浪費記憶體,所以Redis Cluster實現了分散式儲存。每臺機器節點上儲存不同的內容。

  • 2、Redis Cluster 資料分片原理

    redis 資料分片使用的是hash slot, redis叢集有16384個雜湊槽,每個Key通過CRC16校驗後對16384取模來決定放置哪一個槽。

    當存取redis key時候,redis會根據CRC16演算法得到一個結果,然後把結果和16384求餘,通過這個值去對應得節點獲取資料。

    這個時候,應用客戶端實際上只需要連線其中任意一個節點即可,然後Redis Cluster 中每個節點都儲存了其他節點得槽資訊。這樣當存取key計算完槽之後,通過儲存槽資訊從配置中獲取節點資訊,然後再去對應得節點獲取資料。

  • 3、Redis Cluster 複製原理

    redis-cluster叢集引入了主從複製模型,一個主節點對應一個或者多個從節點,當主節點宕機的時候,就會啟用從節點。當其它主節點 ping 一個主節點 A 時,如果半數以上的主節點與 A 通訊超時,那麼認為主節點 A 宕機了。如果主節點 A 和它的從節點 A1 都宕機了,那麼該叢集就無法再提供服務了

  • 4、redis Cluster 優缺點

    優點:

    • 1、實現了分散式儲存,節省了記憶體