高工面試之:redis的幾種集群方式你都熟悉嗎?

Redis三種集群方式:主從複製、哨兵模式和Cluster模式

一、主從複製模式

Redis配置成主從模式,主庫(Master)只負責客戶端的寫數據,從庫(Slave)只負責客戶端的讀數據。

主從數據複製過程如圖所示:

高工面試之:redis的幾種集群方式你都熟悉嗎?

主從複製原理:

  • 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的幾種集群方式你都熟悉嗎?

哨兵的作用:

  • 監控主服務器和從服務器是否正常運行。
  • 主服務器出現故障時自動將從服務器轉換為主服務器

故障切換(failover)過程:

假設主服務器宕機,哨兵1先檢測到這個結果,系統並不會馬上進行failover過程,僅僅是哨兵1主觀的認為主服務器不可用,這個現象成為主觀下線。當後面的哨兵也檢測到主服務器不可用,並且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操作。切換成功後,就會通過發佈訂閱模式,讓各個哨兵把自己監控的從服務器實現切換主機,這個過程稱為客觀下線。這樣對於客戶端而言,一切都是透明的。

哨兵除了監控服務器,哨兵之間也相互監控,如下圖所示:

高工面試之:redis的幾種集群方式你都熟悉嗎?

哨兵模式的優缺點

優點:

  • 基於主動複製模式,主從複製模式的所有優點都有
  • 主從可以自動切換,系統更健壯,可用性更高

缺點:

  • 很難支持在線擴容,在線擴容複雜

三、Redis-Cluster集群

現在很多公司採用的是這種redis集群模式。

redis的哨兵模式基本已經可以實現高可用,讀寫分離 ,但是在這種模式下每臺redis服務器都存儲相同的數據,很浪費內存,所以在redis3.0上加入了cluster模式,實現的redis的分佈式存儲,也就是說每臺redis節點上存儲不同的內容。解決了前面哨兵模式擴容複雜的問題。

Cluster集群模式是在哨兵模式的基礎上進行升級改造:

  • 集群節點複製:遵循前面講到的主從複製模式的節點複製方式
  • 故障轉移:和前面講到的哨兵模式進行故障轉移的方法基本一樣,不同的是,在集群裡面,故障轉移是由集群中其他在線的主節點負責進行的,所以集群不必另外使用Redis Sentinel。
  • 集群分片策略: 每臺redis節點上存儲不同的內容

Redis Cluster的具體實現細節:

採用了Hash槽的概念,集群會預先分配16384個槽,並將這些槽分配給具體的服務節點,通過對Key進行CRC16(key)%16384運算得到對應的槽是哪一個,從而將讀寫操作轉發到該槽所對應的服務節點。當有新的節點加入或者移除的時候,再來遷移這些槽以及其對應的數據。在這種設計之下,我們可以很方便的進行動態擴容或縮容,目前很多公司都傾向於這種集群模式。

如下圖所示:


高工面試之:redis的幾種集群方式你都熟悉嗎?

面試不可怕,掌握真正的精髓可以讓你一擊即中。

更多學習過程中筆記源碼分享

高工面試之:redis的幾種集群方式你都熟悉嗎?

評論留言+轉發文章+關注我後私信回覆【Java】即可免費獲取我準備好的面試文檔資料!


"


分享到:


相關文章: