在高併發的系統中當我們需要從海量的資料中快速找到所需符合要求的資料,我們可以按照某種規則對海量資料進行劃分,將其分散儲存在多個reids服務結點上,從而通過實現資料分片來降低redis服務當節點的壓力。
redis集群採用無中心結構,每個redis伺服器結點儲存一定的資料和整個集群的狀態,同時每個redis伺服器結點同其他伺服器結點通過gossip協議去傳播資訊,以及發現新增的redis伺服器結點,redis集群的主要作用是將不同的key分散的儲存於不同的redis結點中,通常是通過key的hash值,然後根據redis伺服器結點數量求模(取模運算:a % p(或a mod p),表示baia除以p的餘數)。
在這種情況下當需要動態的增加或者減少結點時會造成大量的key無法被命中,為了解決整個問題redis中便使用一次性hash演算法(對2^32進行取模,當通過hash演算法得到的值組成乙個虛擬的圓環),將不同的key使用相同的hash函式計算出hash值。
假設hash演算法的值空間為(0~2^32-1),則整個hash環如上圖所示,整個空間按順時針在0到2~2^32-1取值,圓環的正上方為0,最終形成如上圖所示的hash環。
下一步就是將各個redis結點進行hash變換,可以使用主機的ip或者主機名作為關鍵字進行hash運算,這樣每台主機可以很方便的確定其在hash環上的位置。然後對所有的資料進行同樣的hash演算法處理,定位訪問到相應的伺服器,並將資料儲存到該伺服器,即我們將資料的key使用redis結點相同的hash函式計算出hash值,並確定其在hash環上的位置,然後沿著順時針檢查,當遇到第一台redis伺服器(即最近的順時針方向最近的一台redis伺服器),會將hash值儲存到該伺服器,從而實現將對應的資料分散儲存到對應的伺服器。
這樣做的好處是,當伺服器b宕機之後,a,c,d是不會受到影響的,而且之前所有儲存在b結點上的資料會儲存到c伺服器上,當在a伺服器和b伺服器之間增加乙個redis伺服器e時,則會將hash值在a到e之間的資料儲存到e結點上,將hash值在e到b之間的資料儲存到b結點上,就是順時針最接近的redis伺服器結點,綜上所述,一次性hash演算法,對於結點的增減,都只需要定位環中受影響的一小部分資料,具有較好的容錯性,和擴充套件性。
如果集群系統中只存在兩台伺服器,如圖所示,key進行hash計算之後,可能造成大部分資料順時針最近的伺服器為a伺服器,所以redis伺服器a中會儲存大量資料,可能使得伺服器a資料壓力過大。
為了解決hash環的資料傾斜問題,一次性hash演算法,引入了虛擬結點解決資料傾斜問題,即對每個結點進行多次hash,計算的位置都放置乙個子服務節點,即虛擬節點,我們可以在伺服器的ip或者主機名上增加編號來實現。
如圖,可以為每台伺服器計算三個虛擬節點,如nodea變成nodea#1,nodea#2,nodea#3,nodeb類似,然後將他們均勻分布到hash環上,從而得到多個虛擬節點(這裡為6個),同時資料定位的hash演算法不變,只是執行一步虛擬節點到實際節點的對映,如定位到nodea#1,nodea#2,nodea#3三個節點上的資料都會實際對映儲存到nodea redis服務結點上,從而實現資料的分散處理,實際應用中,會將虛擬節點設定為32或者更大,所以及時很少的實際節點也能做到資料的均勻分布,在redis集群中我們可以結合redis主從同步於哨兵機制,從而保證集群的高可用性。
Redis集群原理分析
redis集群的原理主要是圍繞著 槽 的概念展開的,先來理解集群中 槽 的概念。reids集群是通過將所有的key進行分割槽來實現的,redis集群最多有16384個分割槽 也可以稱作 槽 英文 slot 然後在集群節點中指定分割槽範圍來實現。例如 集群中的節點a負責0 10000,節點b負責 10...
Redis集群原理簡述
redis集群原理簡述 原理如圖 訪問資料 搭建好r edis cluster集群後.往redis中存入資料,資料會被隨機存入不同主機.如隨機存入100條資料,會隨機儲存,可能主機一20條,主機二50條,主機三30條等等,並且順序也隨機可能第一條存放在主機三,第二條存主機一等等.但存入後位置相對固定...
Redis實現原理簡介
物件的實現 底層資料結構介紹 資料庫實現 資料庫示例 持久化實現 命令處理模型 複習單機伺服器的內部構造及原理介 紹 redis 資料的構建方法 物件系統 redis 是乙個鍵值對 key value pair 資料庫,資料庫中的每個鍵都有與之對應的值,並且這些鍵和值都是物件 object 其中 舉...