Redis 第十章 集群

2021-10-06 07:15:11 字數 3471 閱讀 9870

redis cluster

是redis

的分布式解決方案,在

3.0版本正式推出,有效地解決了redis

分布式方面的需求。當遇到單機記憶體、併發、流量等瓶頸時,可以採用cluster

架構方案達到負載均衡的目的。之前,

redis

分布式方案一般有兩種:

客戶端分割槽方案,優點是分割槽邏輯可控,缺點是需要自己處理資料路由、高可用、故障轉移等問題。

**方案,優點是簡化客戶端分布式邏輯和公升級維護便利,缺點是加

重架構部署複雜度和效能損耗。

現在官方為我們提供了專有的集群方案:

redis cluster

,它非常優雅地解決了redis

集群方面的問題,因此理解應用好

redis cluster

將極大地解放我們使用分布式redis

的工作量,同時它也是學習分布式儲存的絕佳案例。

10.1 資料分布

10.1.1 資料分布理論

分布式資料庫首先要解決把整個資料集按照分割槽規則對映到多個節點的問題,即把資料集劃分到多個節點上,每個節點負責整體資料的乙個子集。如圖10-1

所示。

需要重點關注的是資料分割槽規則。常見的分割槽規則有

雜湊分割槽

和順序分割槽

兩種,表10-1

對這兩種分割槽規則進行了對比。

由於redis cluster

採用雜湊分割槽規則,這裡我們重點討論雜湊分割槽,常見的雜湊分割槽規則有幾種,下面分別介紹。

《1》節點取餘分割槽

使用特定的資料,如

redis

的鍵或使用者

id,再根據節點數量

n使用公式:hash(

key)

%n計算出雜湊值,用來決定資料對映到哪乙個節點上。這種方案存在乙個問題:當節點數量變化時,如擴容或收縮節點,資料節點對映關係需要重新計算,會導致資料的重新遷移。

這種方式的突出優點是簡單性,常用於資料庫的分庫分表規則,一般採用預分割槽的方式,提前根據資料量規劃好分割槽數,比如劃分為512

或1024

張表,保證可支撐未來一段時間的資料量,再根據負載情況將表遷移到其他資料庫中。擴容時通常採用翻倍擴容,避免資料對映全部被打亂導致全量遷移的情況,如圖10-2

所示。

《2》一致性雜湊分割槽

一致性雜湊分割槽(

distributed hash table

)實現思路是為系統中每個節點分配乙個token

,範圍一般在

0~232

,這些token

構成乙個雜湊環。資料讀寫執行節點查詢操作時,先根據key

計算hash

值,然後順時針找到第乙個大於等於該雜湊值的token

節點,如圖

10-3

所示。

這種方式相比節點取餘最大的好處在於加入和刪除節點只影響雜湊環中相鄰的節點,對其他節點無影響。但一致性雜湊分割槽存在幾個問題:

《3》 虛擬槽分割槽

虛擬槽分割槽巧妙地使用了雜湊空間,使用分散度良好的雜湊函式把所有資料對映到乙個固定範圍的整數集合中,整數定義為槽(slot

)。這個範圍一般遠遠大於節點數,比如redis cluster

槽範圍是

0~16383

。槽是集群內資料管理和遷移的基本單位。採用大範圍槽的主要目的是為了方便資料拆分和集群擴充套件。每個節點會負責一定數量的槽,如圖10-4

所示。

10.1.2 redis資料分割槽

redis cluser

採用虛擬槽分割槽,所有的鍵根據雜湊函式對映到

0~16383

整數槽內,計算公式:slot=crc16

(key

)&16383

。每乙個節點負責維護一部分槽以及槽所對映的鍵值資料,如圖10-5

所示。

虛擬槽分割槽的特點:

資料分割槽是分布式儲存的核心,理解和靈活運用資料分割槽規則對於掌握redis cluster非常有幫助。

10.1.3 集群功能限制

redis

集群相對單機在功能上存在一些限制,需要開發人員提前了解,在使用時做好規避。限制如下:

key批量操作支援有限。如

mset

、mget

,目前只支援具有相同

slot

值的key執行批量操作。對於對映為不同

slot

值的key

由於執行

mget

、mget

等操作可能存在於多個節點上因此不被支援。

key事務操作支援有限。同理只支援多key在同一節點上的事務操作,當多個

key分布在不同的節點上時無法使用事務功能。

key作為資料分割槽的最小粒度,因此不能將乙個大的鍵值物件如hash

、list

等對映到不同的節點。

不支援多資料庫空間。單機下的redis可以支援16個資料庫,集群模式下只能使用乙個資料庫空間,即

db0。

複製結構只支援一層,從節點只能複製主節點,不支援巢狀樹狀複製結構。

10.3.1 通訊流程

在分布式儲存中需要提供維護節點元資料資訊的機制,所謂元資料是指:節點負責哪些資料,是否出現故障等狀態資訊。常見的元資料維護方式分為:集中式和p2p

方式。redis

集群採用

p2p的

gossip

(流言)協議,gossip協議工作原理就是節點彼此不斷通訊交換資訊,一段時間後所有的節點都會知道集群完整的資訊,這種方式類似流言傳播,如圖10-12

所示。

通訊過程說明:

集群中的每個節點都會單獨開闢乙個

tcp通道,用於節點之間彼此通訊,通訊埠號在基礎埠上加10000。

每個節點在固定週期內通過特定規則選擇幾個節點傳送

ping

訊息。

接收到ping

訊息的節點用

pong

訊息作為響應。

第十章 Redis 集群搭建

redis學習 一 概述 二 redis cluster 集群安裝搭建步驟 wget tar zxvf redis 3.2.1.tar.gz 編譯並進行安裝 因為 redis 是用 c 實現的,所有要進行編譯。cd redis 3.2.1 make make install 相當於 make mak...

第十章 函式

使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...

第十章 屬性

z屬性 本章也比較簡單稍作介紹 無參屬性就是我們常見的屬性 可以封裝屬性 以執行緒安全方式訪問 有參屬性就是c 中的所引器 匿名型別 如圖遇到如下 具體點就是 上面的注釋也已經講清楚了,定義的型別之後,構造例項,然後初始化屬性。現在詳細說下 編譯器接收到 上圖 先用var 定義乙個型別,但是不具體指...