2. 分割槽基礎知識
3. redis 分割槽的實現
4. 參考文獻
分割槽:如何在多個redis
例項之間拆分資料。
分割槽是將資料拆分給多個redis
例項的過程,因此每個例項將只包含鍵的乙個子集。 本文件的第一部分將向您介紹分割槽的概念,第二部分將向您展示redis
分割槽的替代方法。
在redis
服務中使用分割槽主要有兩個目的:
有多種分割槽方式。假設我們有4個redis
例項,分別是r0
,r1
,r2
,r3
,以及許多代表使用者的鍵,如:user:1
,uesr:2
, …等,我們可以使用多種方法來決定哪個例項儲存哪個鍵。
最簡單的方法是範圍分割槽(range partitioning
),將一定範圍的物件對映到指定的redis
例項。例如,使用者id
從0 ~ 10000分給r0
,10001 ~ 20000 分給r1
,依次類推。
上面這個方法有乙個缺點:需要乙個表記錄如何將範圍物件對映給例項。並且每種物件都需要這樣乙個表,這樣的話,分割槽效率很低,所以通常都不用range partitioning
方法來分割槽。
雜湊分割槽(hash partitioning
) 可以用來替換range partitioning
。雜湊分割槽適用於任何鍵,並不要求鍵的格式是object_name:id
。
還有許多其他方法可以執行分割槽,但是通過這兩個示例,您應該了解一下。 雜湊分割槽的一種高階形式稱為一致性雜湊
,由一些redis
客戶端和**實現。
redis
的某些功能在分割槽中不能很好地發揮作用:
從概念上來看,無論將redis
用作資料儲存還是用作快取,redis
中的分割槽都是相同的,但是在將其用作資料儲存時存在很大的限制。
當redis
用作資料儲存時,指定的鍵必須始終對映到同一redis
例項。 當redis
用作快取時,如果給定的節點不可用,則使用不同的節點也不是什麼大問題,因為我們希望提高系統的可用性。
如果指定的鍵的首選節點不可用,則通常可以通過一致性雜湊切換到其他節點。 同樣,如果您新增新節點,則部分新鍵將開始儲存在新節點上。
從上面的了解可知,分割槽的乙個問題是:除非將redis
作為快取,否則新增和刪除節點十分棘手。(當然,使用固定的key-instances對映
也沒這個問題。)
但是,資料儲存常常需要變化,所以固定的key-instances對映
不太符合實際。
由於redis
的占用空間非常小且重量輕,所以從一開始就可以在多個redis
例項使用分割槽。
為了盡量少的新增和刪除節點,從一開始就使用大量的redis
例項。例如,對於大多數使用者而言,32或64個例項可以解決問題,並將為增長提供足夠的空間。這樣,隨著資料儲存需求的增加以及您需要更多的redis
伺服器,您要做的就是將例項從一台伺服器移動到另一台伺服器。 一旦額外新增了第一台伺服器,您將需要將一半redis
例項從第一台伺服器移動到第二台伺服器,依此類推。
使用redis
副本,您將可以為使用者減少停機時間或減少停機時間。
redis cluster
是獲得自動分片和高可用性的首選方法。redis cluster
是query routing
和client side partitioning
的混合體。
twemproxy
支援在多個redis
例項之間進行自動分割槽,並在節點不可用的情況下彈出可選節點(這將更改key-instances對映
,因此僅在將redis
用作快取時才應使用此功能)。
基本上,twemproxy
是客戶端和redis
例項之間的中間層,它將以最小的額外複雜性可靠地為我們處理分割槽。
twemproxy
的替代方法是使用通過一致性雜湊
或其他類似演算法實現客戶端分割槽的客戶端。 有多個redis
客戶端支援一致性雜湊
,特別是redis-rb
和predis
。
那麼什麼是一致性雜湊呢?
還是拿前面的例子來說。4個redis
例項,使用簡單雜湊的過程如下:
使用hash
函式將鍵轉換成數字。
將此數字對4取模,結果為0、1、2、3分別對應redis
的4個例項r0、 r1、 r2、 r3。
但是,因為4個redis
例項不夠用了,又加了1個redis
例項,那麼前面的key-instances的對映
關係就會發生改變了,如果要解決這個問題就需要重新對所用的鍵的雜湊值對5取模,來決定對映到哪乙個redis
例項上,而且在新對映的機器中沒有之前存的鍵了。
當機器數量發生變動的時候,幾乎所有的資料都會移動,就redis
而言可能造成快取雪崩
(在這一時刻,所有快取都沒了,因為新對映的機器中沒有存對應的鍵)。此時的問題是,當增加或者刪除節點時,對於大多數記錄,保證原來分配到的某個節點,現在仍然應該分配到那個節點,將資料遷移量的降到最低,這就是一致性雜湊要做的事情。在這裡我們不指定是資料庫還是什麼,反正都是分布式儲存節點。
一致性雜湊
就是解決的上述問題。從 2 個方向去考慮:
節點宕機時,資料記錄會被定位到下乙個節點上;
新增節點時,相關區間內的資料記錄就需要重新雜湊。
根據節點一致性 hash
演算法也是使用取模的思想,只是,剛才描述的取模法是對節點數量進行取模,而一致性hash演算法是對 232 取模,什麼意思呢?簡單來說,一致性hash演算法將整個雜湊值空間組織成乙個虛擬的圓環,如假設某雜湊函式h的值空間為0 ~ 232-1(即雜湊值是乙個32位無符號整形),整個雜湊環如下,從 0 ~ 232-1 代表的分別是乙個個的節點,這個環也叫雜湊環
。
ip
或者其他進行雜湊,並對 232 取模,找到這些節點在雜湊環中的位置;
根據redis
中的鍵進行雜湊,並對 232 取模,找到這個鍵在雜湊環中的位置;
從這個鍵的位置順時針找到的第乙個節點就是應該對映的節點了。
當伺服器節點過少時,使用一致性雜湊
可能會出現資料傾斜問題
(也就是,被快取的物件大部分都在某一台伺服器上)。採用虛擬節點機制
,即對每乙個服務節點計算多個雜湊,每個計算結果位置都放置乙個此服務節點,稱為虛擬節點
。具體做法可以在伺服器ip
或主機名
的後面增加編號來實現。
[1] redis 官方文件 partitioning
[2] 一致性雜湊
[3] 面試必備:什麼是一致性hash演算法?
初識Liunx 分割槽 Partition
主分割槽,擴充套件分割槽,邏輯分割槽 主分割槽 擴充套件分割槽 4,因為mbr 主引導記錄 是512位元組 擴充套件分區內劃分邏輯分割槽.linux管理硬體與windows完全不同 所有硬體,所有裝置在linux看來全為檔案.方便程式設計.linux分割槽命名 dev xxyn dev 這個字串是所...
初識redis快取
redis是用 c語言開發的乙個開源的高效能鍵值對 key value 資料庫。它通過提供多種鍵值資料型別來適應不同場景下的儲存需求,目前為止 redis 支援的鍵值資料型別如 下 字串型別 雜湊型別 列表型別 集合型別 有序集合型別。快取 資料查詢 短連線 新聞內容 商品內容等等 最多使用 分布式...
Redis系列 (一)初識Redis
redis是由義大利人salvatore sanfilippo 網名 antirez 開發的一款記憶體快取記憶體資料庫。redis全稱為 remote dictionary server 遠端資料服務 redis 是乙個開源的,基於c語言編寫的 遵守bsd協議 支援網路互動 可基於記憶體也可持久化的...