Redis Cluster的限制及解決方案

2021-10-11 16:30:20 字數 1875 閱讀 2490

部分摘自:並作修改

redis cluster 是 redis 原生的資料分片實現,可以自動在多個節點上分布資料,不需要依賴任何外部的工具。

redis cluster 中所有 key 會被分派到16384slot(hash 槽)中,這些 slot 又會被指派到多個 redis 節點上。

乙個 key 會對映到某個 slot,演算法:

hash_slot = crc16(key) mod 16384
不像單機redis,redis cluster 只支援乙個資料庫(database 0),select命令就不能用了,但實際也很少有人使用多資料庫,所以這個限制並沒什麼影響。

multi-key 即 多key。

某些情況是多 key 的操作,例如:

這類情況都需要特別注意,因為:redis cluster 要求,只有這些 key 都在同乙個 slot 時才能執行。

例如,有2個key,key1 和 key2。

key1 是對映到 5500 這個 slot 上,儲存在 node a。

key2 是對映到 5501 這個 slot 上,儲存在 node b。

那麼就不能對 key1 和 key2 做事務操作。

對於多key場景,需要做好資料空間的設計,redis cluster 提供了乙個hash tag的機制,可以讓我們把一組 key 對映到同乙個 slot。

例如:user1000.following這個 key 儲存使用者 user1000 關注的使用者;user1000.followers儲存使用者 user1000 的粉絲。

這兩個 key 有乙個共同的部分user1000,可以指定對這個共同的部分做 slot 對映計算,這樣他們就可以在同乙個槽中了。

使用方式:

.following 和 .followers
就是把共同的部分使用包起來,計算 slot 值時,如果發現了花括號,就會只對其中的部分進行計算:

hash tags 【注意:位置任意,例如user::ids和user::tweets】

hashtag機制可以影響key被分配到的slot,從而可以使用那些被限制在slot中操作。

hashtag即是用{}包裹key的乙個子串,如1,2

在設定了hashtag的情況下,集群會根據hashtag決定key分配到的slot, 兩個key擁有相同的hashtag:, 它們會被分配到同乙個slot,允許我們使用mget命令。

通常情況下,hashtag不支援巢狀,即將第乙個中間的內容作為hashtag。若花括號中不包含任何內容則會對整個key進行雜湊,如{}user:

hashtag可能會使過多的key分配到同乙個slot中,造成資料傾斜影響系統的吞吐量,務必謹慎使用。

multi-key 這一點是 redis cluster 對於我們日常使用中最大的限制,一定要注意,如果多key不在同乙個 slot 中就會報錯,例如:

(error) crossslot keys in request don't hash to the same slot
需要使用hash tag設計好 key 的空間。

redis cluster的資料遷移

我們可以參考redis trip或者cachecloud的 來了解cluster資料遷移的流程,主要分為如下幾部 設定遷移中的節點狀態,比如要把slot x的資料從節點a遷移到節點b的話,需要把a設定成migrating狀態,b設定成importing狀態。1cluster setslot impo...

CygWin安裝RedisCluster指南

安裝前確認磁碟有6g以上的磁碟容量,安裝時雙擊setup x86 64.exe,基本按照預設設定安裝就行,也可自己指定安裝路徑等,3 deps hiredis net.c中注釋掉 並在 include sds.h 之後追加 ifdef cygwin define tcp keepcnt 8 defi...

RedisCluster搭建步驟

安裝redis 配置並啟動redis節點 選兩台機器執行該步驟 把redis安裝目錄redis.conf修改如下並複製進對應的700 資料夾 bind 10.11.147.40 redis安裝機器ip 注意這裡千萬不要用127.0.0.1或者注釋掉這行,以上兩種都會導致遠端機器連線不到redis p...