生產環境中的redis基本都是多節點部署,本文只討論redis高可用的三種方案,不涉及實際操做。node
(圖來源於網絡)redis
一個Master,兩個Slave,Slave只能讀不能寫;當Slave與Master斷開後須要從新slave of鏈接纔可創建以前的主從關係;Master掛掉後,Master關係依然存在,Master重啓便可恢復。數據庫
實現原理:緩存
一、Slave啓動成功鏈接到master後會發送一個sync命令;服務器
二、Master接到命令啓動後的存盤進程,同時收集全部接收到的用於修改數據集命令,在後臺進程執行完畢以後,master將傳送整個數據文件到slave,以完成一次徹底同步;網絡
三、全量複製:而slave服務在數據庫文件數據後,將其存盤並加載到內存中;架構
四、增量複製:Master繼續將新的全部收集到的修改命令依次傳給slave,完成同步;併發
五、可是隻要是從新鏈接master,一次徹底同步(全量複製)將被自動執行。分佈式
(圖來源於網絡)高併發
由一個或多個Sentinel實例組成的Sentinel系統能夠監視任意多個主服務器,以及這些主服務器屬下的全部從服務器,並在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級爲新的主服務器。
Sentinel的功能有:
實現原理:
Redis Sentinel是一個分佈式架構,其中包含若干個Sentinel節點和Redis數據節點,每一個Sentinel節點會對數據節點和其他Sentinel節點進行監控,當它發現節點不可達時,會對節點作下線標識
若是被標識的是主節點,它還會和其餘Sentinel節點進行「協商」,當大多數Sentinel節點都認爲主節點不可達時,它們會選舉出一個Sentinel節點來完成自動故障轉移的工做,同時會將這個變化實時通知給Redis應用方。
(圖來源於網絡)
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,集羣方案搭建複雜,遇到的問題也相對多不少。