生產環境中的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,集群方案搭建復雜,遇到的問題也相對多很多。