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狀態.
五、優缺點
- 天然的高可用
- 高效能,多個機器處理
- 大儲存,解決單機容量限制