1. 程式人生 > >Redis-cluster叢集原理

Redis-cluster叢集原理

 

一、引入

    面對訪問量特別大的網站,redis單機模式的效能和儲存都不足以支撐。故引入高可用、高效能、大儲存的redis-cluster叢集模式。

二、流程圖

 

 

三、原理

     插槽(slot):可以儲存兩個數值的一個變數這個變數的取值範圍是:0-16383。

    Cluster:叢集管理者,使叢集對外暴漏的是一個整體。

    redis cluster採用虛擬分割槽的方式,將整個叢集看成一個整體,然後分成16384個槽位。

    然後再將16484個槽位分別分配給叢集的各個節點,然後各個節點各自負責一部分槽位。

    比如上圖:

    節點1負責 0-5000之間的槽位,節點2負責5001-10000之間的槽位,節點3負責10001-16383之間的槽位。

    k-v鍵值對資料只會和槽位相關,與物理機器無關。通過crc16演算法計算出 k對應的整數值(有點類似hash),然後對算出的整數值%16384取模,計算出k-v對應在哪個槽位上,然後再根據槽位與機器節點的對映關係,儲存到相應的節點上去。取的時候,也是相應的過        程所以整個叢集協同一致對外,給client看到的檢視就是完整的資料集。

四、故障處理

    哨兵:

       為了使叢集高可用,每個節點都應該有一個備用節點(slave),當主節點(master)掛掉,sentinel會無感切換到備用節點。

    redis的投票機制:

      (1)     投票過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超時(cluster-node-timeout),認為當前master節點掛掉.

      (2)     什麼時候整個叢集不可用(cluster_state:fail)? 

           a:如果叢集任意master掛掉,且當前master沒有slave,或者所以slave掛掉.叢集進入fail狀態,也可以理解成叢集的slot對映[0-16383]不完整時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage引數,預設關閉,開啟叢集相容部分失敗.

           b:如果叢集超過半數以上master掛掉,無論是否有slave,叢集進入fail狀態.

 

五、優缺點

  • 天然的高可用
  • 高效能,多個機器處理
  • 大儲存,解決單機容量限制