Redis三種集群方式:主從複製、哨兵模式和Cluster模式
一、主從複製模式
Redis配置成主從模式,主庫(Master)只負責客戶端的寫數據,從庫(Slave)只負責客戶端的讀數據。
主從數據複製過程如圖所示:
![高工面試之:redis的幾種集群方式你都熟悉嗎?](http://p2.ttnews.xyz/loading.gif)
主從複製原理:
- slave redis連接master redis,發送sync命令;
- master redis接收到sync命名後,執行BGSAVE命令生成RDB文件,使用緩衝區記錄此後執行的所有寫命令;
- master redis BGSAVE執行完後,向所有slave redis發送快照文件,並在發送期間繼續記錄被執行的寫命令;
- slave redis收到快照文件後丟棄所有舊數據,載入收到的快照;
- master redis快照發送完畢後開始向slave redis發送緩衝區中的寫命令;
- slave redis器完成對快照的載入,開始接收命令請求,並執行來自master redis緩衝區的寫命令;
- master redis每執行一個寫命令就會向slave redis發送相同的寫命令,slave redis接收並執行收到的寫命令
主從複製優缺點:
優點:
- 實現讀寫分離:客戶端從master redis寫數據,從slave redis讀數據
- 支持主從複製:master redis自動將數據同步到slave redis
- Slave分載Master的同步壓力:slave可以接受其它Slaves的連接和同步請求
- Master Server是以非阻塞的方式為Slaves提供服務:在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求
- Slave Server同樣是以非阻塞的方式完成數據同步:在同步期間,如果有客戶端提交查詢請求,Redis則返回同步之前的數據
缺點:
- 不具備自動容錯和恢復功能:主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的IP才能恢復;宕機前有部分數據未能及時同步到從機,切換IP後還會引入數據不一致的問題,降低了系統的可用性
- 較難支持在線擴容:在集群容量達到上限時在線擴容會變得很複雜。
二、哨兵模式
哨兵模式:
在主從複製模式中當主服務器中斷服務後,需要人工手動操作來將一個從服務器升級為主服務器,以便繼續提供服務。而哨兵模式可以實現自動化的系統監控和故障恢復功能。
哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,作為進程,它會獨立運行。其原理是哨兵通過發送命令,等待Redis服務器響應,從而監控運行的多個Redis實例。
![高工面試之:redis的幾種集群方式你都熟悉嗎?](http://p2.ttnews.xyz/loading.gif)
哨兵的作用:
- 監控主服務器和從服務器是否正常運行。
- 主服務器出現故障時自動將從服務器轉換為主服務器
故障切換(failover)過程:
假設主服務器宕機,哨兵1先檢測到這個結果,系統並不會馬上進行failover過程,僅僅是哨兵1主觀的認為主服務器不可用,這個現象成為主觀下線。當後面的哨兵也檢測到主服務器不可用,並且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操作。切換成功後,就會通過發佈訂閱模式,讓各個哨兵把自己監控的從服務器實現切換主機,這個過程稱為客觀下線。這樣對於客戶端而言,一切都是透明的。
哨兵除了監控服務器,哨兵之間也相互監控,如下圖所示:
哨兵模式的優缺點
優點:
- 基於主動複製模式,主從複製模式的所有優點都有
- 主從可以自動切換,系統更健壯,可用性更高
缺點:
- 很難支持在線擴容,在線擴容複雜
三、Redis-Cluster集群
現在很多公司採用的是這種redis集群模式。
redis的哨兵模式基本已經可以實現高可用,讀寫分離 ,但是在這種模式下每臺redis服務器都存儲相同的數據,很浪費內存,所以在redis3.0上加入了cluster模式,實現的redis的分佈式存儲,也就是說每臺redis節點上存儲不同的內容。解決了前面哨兵模式擴容複雜的問題。
Cluster集群模式是在哨兵模式的基礎上進行升級改造:
- 集群節點複製:遵循前面講到的主從複製模式的節點複製方式
- 故障轉移:和前面講到的哨兵模式進行故障轉移的方法基本一樣,不同的是,在集群裡面,故障轉移是由集群中其他在線的主節點負責進行的,所以集群不必另外使用Redis Sentinel。
- 集群分片策略: 每臺redis節點上存儲不同的內容
Redis Cluster的具體實現細節:
採用了Hash槽的概念,集群會預先分配16384個槽,並將這些槽分配給具體的服務節點,通過對Key進行CRC16(key)%16384運算得到對應的槽是哪一個,從而將讀寫操作轉發到該槽所對應的服務節點。當有新的節點加入或者移除的時候,再來遷移這些槽以及其對應的數據。在這種設計之下,我們可以很方便的進行動態擴容或縮容,目前很多公司都傾向於這種集群模式。
如下圖所示:
面試不可怕,掌握真正的精髓可以讓你一擊即中。
更多學習過程中筆記源碼分享
評論留言+轉發文章+關注我後私信回覆【Java】即可免費獲取我準備好的面試文檔資料!
閱讀更多 妖精的雜七雜八 的文章