Redis 集群模式說明

2021-08-28 18:58:30 字數 2608 閱讀 6845

基礎概念:cluster模式為server端模式,及資料分布由server控制

設計基本思路

在原有模型(data <—> instance)上抽象出中間層 slot,即:data <—> slot <—> instance,明顯可知演化出了兩種對應關係

請求簡化過程

其他說明

server端模式

主從模式

遺留問題

slot重分配之後,資料的轉移操作由誰負責?server端?

sharded模式為client端模式,及資料分布由client控制

設計基本思路

sharded模式採用的是consistenthash演算法。

如果說cluster模式是「資料落槽」的話,那麼sharded模式則是「資料找槽」

因為cluster模式下,對資料的slot計算將會得到乙個明確的slot;但是在sharded中,對資料的計算只能得到該資料對應的index,接著還需要通過index按照一定的方向去尋找離得最近的slot。

在網上,針對consistenthash演算法的介紹已經是一片一片了,這裡我簡單展示一下原始碼,不細聊該演算法。

public

class

sharded

shardinfo

>

private

final hashing algo;

// md5 演算法

private treemap

nodes;

// index與shardinfo的對映關係,使用有序對映結構 -- treemap

private

final map

, r> resources =

newlinkedhashmap

, r>()

;// shardinfo與jedis的對映關係

public

sharded

(list

shards, hashing algo, pattern tagpattern)

private

void

initialize

(list

shards)

// 儲存shardinfo與jedis至resources

resources.

put(shardinfo, shardinfo.

createresource()

);}}

public s getshardinfo

(byte

key)

return tail.

get(tail.

firstkey()

);// 返回大於等於index的nodes中的第乙個元素

}}

很明顯,sharded模式下,資料的分布 由client控制,即server端根本不知道自己存的是哪一部分的資料,甚至可以說,server端根本不知道自己只是儲存了一部分的資料。

既然是這樣,那麼sharded模式根本就不能正常的進行集群擴容。其實 更準確的說,sharded模式下,集群不能進行資料分布的調整。但是 如果能進行「不調整資料分布的擴容」那麼還是可以實現集群擴容的。

pre-sharding設計

為實現擴容,在sharded模式上,還需要新增一點要求,即instance需要小且多(記憶體小,數量多)。

簡單說明

不調整資料分布:即不調整每個instance上所存放資料的範圍。

在這種前提下,並且假設每個instance的記憶體上限為100g,那麼將會是這樣的情況:

擴容過程

首先假設集群組成:12個instance(1 to 12),各instance大小為10g,集群總容量120g;物理節點2個(a、b),即6個instance分配至乙個物理節點。---- a(1 to 6)、b(7 to 12)

由於生產要求,需要進行集群擴容,新增一台物理機器c,則可以做如下規劃:a(1 to 4)、b(7 to 10)、c(5、6、11、12)。

操作3.1. 在c節點上啟動4個instance(提公升maxmemory閾值),並分別設定成5、6、11、12的從節點

3.2. 待主從同步完成之後,將網域名稱**伺服器進行調整,使client連線至新的instance

3.3. 關閉原5、6、11、12instance服務,釋放資源

3.4. 調整其餘各instance maxmemory引數,實現動態擴容(config set maxmemory)

整個集群中各instance就此全部擴容完畢

其他說明

正是因為sharded模式下,資料的分布不會被調整,所以shardedjedis是支援pipeline的。但是仍然不支援mget & mset,因為,它們是一次性傳送的請求至服務端的,然而,這些操作中對應的key可能並不分布在一起

感覺整體上sharded模式好像比cluster模式要好點,但是似乎沒有必要使用consistenthash演算法(個人感覺)

參考文章

Redis集群模式詳解

1.集群節點 1.2 節點啟動 2.槽指派 3.在集群中執行命令 4.重新分片 5.複製與故障轉移 6.集群訊息 7.gossip協議 參考文獻 clusterstate結構 typedef struct clusterstateclusternode結構struct clusternodeclus...

Redis的模式與集群

剛開始學習的時候有一些誤區,以為redis有三種集群模式 主從模式 哨兵模式 cluster模式。再此梳理一下我的簡單理解 1 單機模式 只有乙個redis節點,讀寫都在其上執行,這樣是redis最簡單的使用,但是萬一節點宕機了,服務就無法使用了。2 主從模式 為了解決單機模式的不足,同時開啟多個r...

Redis 十一 集群模式

集群是redis的分布式方案,通過分片來進行資料共享,並提供複製和故障轉移功能。一 節點node 集群模式下的redis伺服器叫節點,一開始各個節點相互獨立,連起來後叫集群。通過向某個節點傳送命令 cluster meet 節點和 ip port 伺服器握手成功後就將其新增到所在的集群中。啟動節點 ...