Redis有三種集羣模式:
1、主從模式
2、Sentinel模式
3、Cluster模式
主從模式
主從模式是三種模式中最簡單的,分爲兩類:主數據庫(master)和從數據庫(slave)
讀寫分離策略:從節點可以擴展redis的讀能力,有效應對大併發量的讀操作
- 一個master可以擁有多個slave,一個slave只能對應一個master
- slave掛了不影響其他節點工作,重啓後會從master同步數據過來
- master掛了,不會重新選一個master,但不影響slave的讀
- master可以進行讀寫操作,當數據發生變化時會自動將數據同步給slave;
- slave一般只負責讀,並且接收master同步過來的數據
缺點:
master節點在主從模式中是唯一,若master掛掉,redis無法提供寫的服務;
主從模式不具備高可用
Sentinel(哨兵)模式
它的作用就是監控redis集羣的運行狀況,當使用sentinel模式的時候,客戶端不要直接連接Redis,
而是連接sentinel的ip和端口,由sentinel來提供可用的redis服務。
- sentinel模式是建立在主從模式的基礎上
- 當master掛了,sentinel會在slave中選擇一個做爲master
- master重啓後,會變成slave節點
- sentinel可以啓動多個形成一個集羣,sentinel之間也會自動監控
缺點:
sentinel主要針對主節點的高可用切換,slave節點作爲備份節點不提供服務,不能解決讀寫分離問題;
Cluster模式
哨兵模式已經可以實現高可用,但是在這種模式下每臺redis服務都存儲相同的數據,很浪費內存,所以在
redis3.0加入了cluster模式,實現分佈式存儲,也就是說每個節點存儲不同的數據。
客戶端與redis節點直連,不需要中間代理層,客戶端連接集羣中任何一個節點即可。
cluster模式就是爲了解決單機redis容量有限的問題,將redis的數據根據一定規則分配到多臺機器。
Redis Cluster沒有使用一致性hash,而是使用數據分片引入 hash槽(hash slot)來實現,集羣預分好16384個桶,當往集羣中放置一個key-value時,redis先對key使用crc16算出一個結果,然後把結果對16384求餘,映射到對應的節點槽,一個hash槽中會有很多key-value。
Hash槽的好處在於方便的添加和移除節點:
當需要增加節點時,只需要把其他節點的某些槽移到新的節點;
當需要移除節點時,只需要把移除節點上的槽移到其他節點;
新增和移除節點的時候不用停掉所有redis服務。
舉例節點分配:
節點A:0 - 5460;
節點B:5461 - 10922;
節點C:10923 - 16383.
當存入一個值,按照hash槽的算法,CRC16(key)%16384 = 6782。就會把key的存儲分配到節點B。
當獲取這個key時,也是同樣的算法,內部跳轉到B節點上獲取數據。
新增一個節點時,從各個節點的前端各取一部分槽到新的節點上;
刪除一個節點時,將節點的槽移動到其他節點,然後再刪除這個節點。
Cluster模式爲了保證數據的高可用,加入主從模式:
一個主節點對應一個或多個從節點,主節點提供數據讀取,從節點是從主節點主動拉取數據備份,當這個主節點掛掉後,就會在從節點選舉一個來當主節點。
以上3個主節點,如果沒有加入從節點 ,如果其他一個主節點掛掉,就無法訪問整個集羣;所以在建立集羣的時候,一定要爲每個主節點添加從節點。