深入了解Redis(8)-高可用方案

  生產環境中的redis基本都是多節點部署,本文只討論redis高可用的三種方案,不涉及實際操作。

一、主從複製(一主一從,一主多從,級聯結構)

  (圖來源於網路)

一個Master,兩個Slave,Slave只能讀不能寫;當Slave與Master斷開後需要重新slave of連接才可建立之前的主從關係;Master掛掉後,Master關係依然存在,Master重啟即可恢復。

實現原理:

1、Slave啟動成功連接到master後會發送一個sync命令;

2、Master接到命令啟動後的存檔進程,同時收集所有接收到的用於修改數據集命令,在後台進程執行完畢之後,master將傳送整個數據文件到slave,以完成一次完全同步;

3、全量複製:而slave服務在資料庫文件數據後,將其存檔並載入到記憶體中;

4、增量複製:Master繼續將新的所有收集到的修改命令依次傳給slave,完成同步;

5、但是只要是重新連接master,一次完全同步(全量複製)將被自動執行。

二、哨兵模式  

(圖來源於網路)

由一個或多個Sentinel實例組成的Sentinel系統可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器,並在被監視的主伺服器進入下線狀態時,自動將下線主伺服器屬下的某個從伺服器升級為新的主伺服器。

Sentinel的功能有:

  • 監控:Sentinel節點會定期檢測Redis數據節點、其餘Sentinel節點是否 可達
  • 通知:Sentinel節點會將故障轉移的結果通知給應用方
  • 主節點故障轉移:實現從節點晉陞為主節點並維護後續正確的主從關係
  • 配置提供者:在Redis Sentinel結構中,客戶端在初始化的時候連接的 是Sentinel節點集合,從中獲取主節點資訊

實現原理:

Redis Sentinel是一個分散式架構,其中包含若干個Sentinel節點和Redis數據節點,每個Sentinel節點會對數據節點和其餘Sentinel節點進行監控,當它發現節點不可達時,會對節點做下線標識

如果被標識的是主節點,它還會和其他Sentinel節點進行「協商」,當大多數Sentinel節點都認為主節點不可達時,它們會選舉出一個Sentinel節點來完成自動故障轉移的工作,同時會將這個變化實時通知給Redis應用方。

三、Redis集群(Redis-Cluster)

(圖來源於網路)

  Redis 集群是一個提供在多個Redis節點間共享數據的程式集。自動將數據進行分片,每個master上放一部分數據提供內置的高可用支援,部分master不可用時,還是可以繼續工作的支撐N個redis master node,每個master node都可以掛載多個slave node高可用,因為每個master都有salve節點,那麼如果mater掛掉,redis cluster這套機制,就會自動將某個slave切換成master。

Redis Cluster功能特點如下:

1)所有的節點相互連接

2)集群消息通訊通過集群匯流排通訊,,集群匯流排埠大小為客戶端服務埠+10000,這個10000是固定值

3)節點與節點之間通過二進位協議進行通訊

4)客戶端和集群節點之間通訊和通常一樣,通過文本協議進行

5)集群節點不會代理查詢

6)數據按照Slot存儲分布在多個Redis實例上

7)集群節點掛掉會自動故障轉移

8)可以相對平滑擴/縮容節點

四、方案抉擇

如果你的數據量很少,主要是承載高並發高性能的場景,比如你的快取一般就幾個G,單機足夠了。

如果又多個slave節點,有自動選舉的需求,建議搭建一個sentinal集群,去保證redis主從架構的高可用性,就可以了。

如果是海量數據+高並發+高可用的場景,海量數據,如果你的數據量很大,那麼建議就用redis cluster,集群方案搭建複雜,遇到的問題也相對多很多。

Tags: