初識 Redis 資料分割槽

2021-10-07 13:14:03 字數 3859 閱讀 4361

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 clusterquery routingclient side partitioning的混合體。

twemproxy支援在多個redis例項之間進行自動分割槽,並在節點不可用的情況下彈出可選節點(這將更改key-instances對映,因此僅在將redis用作快取時才應使用此功能)。

基本上,twemproxy是客戶端和redis例項之間的中間層,它將以最小的額外複雜性可靠地為我們處理分割槽。

twemproxy的替代方法是使用通過一致性雜湊或其他類似演算法實現客戶端分割槽的客戶端。 有多個redis客戶端支援一致性雜湊,特別是redis-rbpredis

那麼什麼是一致性雜湊呢?

還是拿前面的例子來說。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協議 支援網路互動 可基於記憶體也可持久化的...