談談Redis四種工作模式

前言

Redis有多種模式:單機模式(Single)、主從模式(Master-Slave)、哨兵模式(Sentinel)、集羣模式(Cluster),在實際開發過程根據業務以及場景都會使用,下面主要對這幾種模式進行解剖。

單機模式

安裝redis的服務端,服務啓動,供給業務調用即可。

單機在很多場景也是有使用的,例如在一個並非必須保證高可用的情況下。

單機模式優缺點

優點如下:

  • 佈署簡單,0成本;
  • 成本低,沒有備用節點,不需要其他的開支;
  • 高性能,單機不需要同步數據,數據天然一致性;

缺點如下:

  • 可靠性保證不是很好,單節點有宕機的風險;
  • 單機高性能受限於CPU的處理能力,redis是單線程的;

主從模式

主從複製原理

  • 從服務器連接主服務器,發送SYNC命令;
  • 主服務器接收到SYNC命令後,開始執行BGSAVE命令生成RDB文件並使用緩衝區記錄此後執行的所有寫命令;
  • 主服務器BGSAVE執行完後,向所有從服務器發送快照文件,並在發送期間繼續記錄被執行的寫命令
  • 從服務器收到快照文件後丟棄所有舊數據,載入收到的快照;
  • 主服務器快照發送完畢後開始向從服務器發送緩衝區中的寫命令;
  • 從服務器完成對快照的載入,開始接收命令請求,並執行來自主服務器緩衝區的寫命令;(從服務器初始化完成
  • 主服務器每執行一個寫命令就會向從服務器發送相同的寫命令,從服務器接收並執行收到的寫命令(從服務器初始化完成後的操作

從主模式優缺點

優點如下:

  • 支持主從複製,主機會自動將數據同步到從機,可以進行讀寫分離;
  • 減輕Master服務器的讀操作壓力,Slave服務器可以爲客戶端提供只讀操作的服務,寫服務仍然必須由Master來完成;
  • Slave同樣可以接受其它Slaves的連接和同步請求,這樣可以有效的分載Master的同步壓力;
  • Master Server是以非阻塞的方式爲Slaves提供服務,所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求;
  • Slave Server同樣是以非阻塞的方式完成數據同步,在同步期間,如果有客戶端提交查詢請求,Redis則返回同步之前的數據;
  • 高可用基石:除了上述作用以外,主從複製還是哨兵模式和集羣模式能夠實施的基礎,因此說主從複製是Redis高可用的基石。

缺點如下:

  • Redis不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啓或者手動切換前端的IP才能恢復。
  • 主機宕機,宕機前有部分數據未能及時同步到從機,切換IP後還會引入數據不一致的問題,降低了系統的可用性。
  • Redis較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜。

哨兵模式

當主服務器中斷服務後,可以將一個從服務器升級爲主服務器,以便繼續提供服務,但是這個過程需要人工手動來操作。 爲此,Redis 2.8+版本中提供了哨兵工具來實現自動化的系統監控和故障恢復功能。

哨兵的作用就是監控Redis系統的運行狀況。它的功能包括以下兩個。

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

哨兵工作方式

  • 每個Sentinel(哨兵)進程以每秒鐘一次的頻率向整個集羣中的Master主服務器,Slave從服務器以及其他Sentinel(哨兵)進程發送一個 PING 命令。

  • 如果一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel(哨兵)進程標記爲主觀下線(SDOWN)

  • 如果一個Master主服務器被標記爲主觀下線(SDOWN),則正在監視這個Master主服務器的所有 Sentinel(哨兵)進程要以每秒一次的頻率確認Master主服務器的確進入了主觀下線狀態

  • 當有足夠數量的 Sentinel(哨兵)進程(大於等於配置文件指定的值)在指定的時間範圍內確認Master主服務器進入了主觀下線狀態(SDOWN), 則Master主服務器會被標記爲客觀下線(ODOWN)

  • 在一般情況下, 每個 Sentinel(哨兵)進程會以每 10 秒一次的頻率向集羣中的所有Master主服務器、Slave從服務器發送 INFO 命令。

  • 當Master主服務器被 Sentinel(哨兵)進程標記爲客觀下線(ODOWN)時,Sentinel(哨兵)進程向下線的 Master主服務器的所有 Slave從服務器發送 INFO 命令的頻率會從 10 秒一次改爲每秒一次。

  • 若沒有足夠數量的 Sentinel(哨兵)進程同意 Master主服務器下線, Master主服務器的客觀下線狀態就會被移除。若 Master主服務器重新向 Sentinel(哨兵)進程發送 PING 命令返回有效回覆,Master主服務器的主觀下線狀態就會被移除。

哨兵模式優缺點

優點如下:

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

缺點如下:

  • Redis較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜;

集羣模式

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

Redis Cluster 集羣模式具有 高可用、可擴展性、分佈式、容錯 等特性。採用無中心結構,有如下特點:

  • 所有的Redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬;
  • 節點的fail是通過集羣中超過半數的節點檢測失效時才生效;
  • 客戶端與redis節點直連,不需要中間代理層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可;

Cluster集羣模式原理

  • 通過數據分片的方式來進行數據共享問題,同時提供數據複製和故障轉移功能;
  • 之前的兩種模式數據都是在一個節點上的,單個節點存儲是存在上限的。集羣模式就是把數據進行分片存儲,當一個分片數據達到上限的時候,就分成多個分片。

Cluster集羣模式工作方式

在Redis的每一個節點上,都有這麼兩個東西,一個是插槽(slot),它的的取值範圍是:0-16383。還有一個就是cluster,可以理解爲是一個集羣管理的插件。當我們的存取的key到達的時候,Redis會根據crc16的算法得出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,通過這個值,去找到對應的插槽所對應的節點,然後直接自動跳轉到這個對應的節點上進行存取操作。

爲了保證高可用,redis-cluster集羣引入了主從模式,一個主節點對應一個或者多個從節點,當主節點宕機的時候,就會啓用從節點。當其它主節點ping一個主節點A時,如果半數以上的主節點與A通信超時,那麼認爲主節點A宕機了。如果主節點A和它的從節點A1都宕機了,那麼該集羣就無法再提供服務了。

數據分片

集羣的鍵空間被分割爲16384個slots(即hash槽),通過hash的方式將數據分到不同的分片上的。即

HASH_SLOT = CRC16(key) & 16384

說明: CRC16是一種循環校驗算法,這裏用了位運算得到取模結果,位運算的效率高於取模運算。

數據查詢與水平擴展

數據查詢

讀請求分配給slave節點,寫請求分配給master,數據同步從master到slave節點。讀寫分離提高併發能力,增加高性能。

水平擴展

master節點可以做擴充,數據遷移redis內部自動完成。當你新增一個master節點,需要做數據遷移,redis服務不需要下線。 舉個栗子:假設有三個master節點,意味着redis的槽被分爲三個段,假設三段分別是0-7000,7001-12000、12001~16383。 現在因爲業務需要新增了一個master節點,四個節點共同佔有16384個槽。槽需要重新分配,數據也需要重新遷移,但是服務不需要下線。redis集羣的重新分片由redis內部的管理軟件redis-trib負責執行。redis提供了進行重新分片的所有命令,redis-trib通過向節點發送命令來進行重新分片。

總結

每種模式都有各自的優缺點,在實際使用場景中要根據業務特點去選擇合適的模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章