概述
Redis Cluster 是 Redis 原生的數據分片實現,可以自動在多個節點上分布數據,不需要依賴任何外部的工具。
Redis Cluster 中所有 key 會被分派到 16384 個 slot(hash 槽)中,這些 slot 又會被指派到多個 Redis 節點上。
一個 key 會映射到某個 slot,算法:
HASH_SLOT = CRC16(key) mod 16384
這個 slot 的機制會給我們帶來一點麻煩,后面會講到。
優勢
- 高性能
-
Redis Cluster 的性能與單節點部署是同級別的。
- 高可用
-
Redis Cluster 支持標准的 master-replica 配置來保障高可用和高可靠。
-
Redis Cluster 也實現了一個類似 Raft 的共識方式,來保障整個集群的可用性。
- 易擴展
-
向 Redis Cluster 中添加新節點,或者移除節點,都是透明的,不需要停機。
-
水平、垂直方向都非常容易擴展。
- 原生
-
部署 Redis Cluster 不需要其他的代理或者工具,而且 Redis Cluster 和單機 Redis 幾乎完全兼容。
限制
- 需要客戶端的支持
-
客戶端需要修改,以便支持 Redis Cluster。
-
雖然 Redis Cluster 已經發布有幾年時間了,但仍然有些客戶端是不支持的,所以需要到 Redis 官網上去查詢一下。
- 只支持一個數據庫
-
不像單機 Redis,Redis Cluster 只支持一個數據庫(database 0),select 命令就不能用了,但實際也很少有人使用多數據庫,所以這個限制並沒什么影響。
- Multi-Key 操作受限
Multi-Key(多 key)是什么意思?某些情況是多 key 的操作,例如:
-
SUNION,這類命令會操作多個 key
-
事務,會在一個事務中操作多個 key
-
LUA 腳本,也會操作多個 key
這類情況都需要特別注意,因為:Redis Cluster 要求,只有這些 key 都在同一個 slot 時才能執行。例如,有 2 個 key,key1 和 key2。
-
key1 是映射到 5500 這個 slot 上,存儲在 Node A。
-
key2 是映射到 5501 這個 slot 上,存儲在 Node B。
那么就不能對 key1 和 key2 做事務操作。
Multi-Key 限制的處理
對於多 key 場景,需要做好數據空間的設計,Redis Cluster 提供了一個 hash tag 的機制,可以讓我們把一組 key 映射到同一個 slot。
例如:user1000.following 這個 key 保存用戶 user1000 關注的用戶;user1000.followers 保存用戶 user1000 的粉絲。
這兩個 key 有一個共同的部分 user1000,可以指定對這個共同的部分做 slot 映射計算,這樣他們就可以在同一個槽中了。
使用方式:
{user1000}.following 和 {user1000}.followers
就是把共同的部分使用 { } 包起來,計算 slot 值時,如果發現了花括號,就會只對其中的部分進行計算。
小結
Multi-Key 這一點是 Redis Cluster 對於我們日常使用中最大的限制,一定要注意,如果多 key 不在同一個 slot 中就會報錯,例如:
(error) CROSSSLOT Keys in request don't hash to the same slot
需要使用 hash tag 設計好 key 的空間。