在 Redis 3.0 以前,使用 哨兵(sentinel)機制來監控各個節點之間的狀態。 node
Redis Cluster 是 Redis 的 分佈式解決方案,在 3.0 版本正式推出,有效地解決了 Redis 在 分佈式 方面的需求。當遇到 單機內存、併發、流量 等瓶頸時,能夠採用 Cluster 架構方案達到 負載均衡 的目的。 redis
本文將從 集羣方案、數據分佈、搭建集羣、節點通訊、集羣伸縮、請求路由、故障轉移、集羣運維 等幾個方面介紹 Redis Cluster。 算法
Redis集羣方案 數據庫
Redis Cluster 集羣模式一般具備 高可用、可擴展性、分佈式、容錯 等特性。Redis 分佈式方案通常有兩種: 緩存
一、 客戶端分區方案 ruby
客戶端 就已經決定數據會被 存儲 到哪一個 redis 節點或者從哪一個 redis 節點 讀取數據。其主要思想是採用 哈希算法 將 Redis 數據的 key 進行散列,經過 hash 函數,特定的 key會 映射到特定的 Redis 節點上。
bash
客戶端分區方案 的表明爲 Redis Sharding,Redis Sharding 是 Redis Cluster 出來以前,業界廣泛使用的 Redis 多實例集羣 方法。Java 的 Redis 客戶端驅動庫 Jedis,支持 Redis Sharding 功能,即 ShardedJedis 以及 結合緩存池 的 ShardedJedisPool。 服務器
優勢 架構
不使用 第三方中間件,分區邏輯 可控,配置 簡單,節點之間無關聯,容易 線性擴展,靈活性強。 併發
缺點
客戶端 沒法 動態增刪 服務節點,客戶端須要自行維護 分發邏輯,客戶端之間 無鏈接共享,會形成 鏈接浪費。
二、代理分區方案
客戶端 發送請求到一個 代理組件,代理 解析 客戶端 的數據,並將請求轉發至正確的節點,最後將結果回覆給客戶端。
優勢:簡化 客戶端 的分佈式邏輯,客戶端 透明接入,切換成本低,代理的轉發和存儲分離。 缺點:多了一層 代理層,加劇了 架構部署複雜度 和 性能損耗。
代理分區 主流實現的有方案有 Twemproxy 和 Codis。
2.1. Twemproxy
Twemproxy 也叫 nutcraker,是 twitter 開源的一個 redis 和 memcache 的 中間代理服務器 程序。Twemproxy 做爲 代理,可接受來自多個程序的訪問,按照 路由規則,轉發給後臺的各個 Redis 服務器,再原路返回。Twemproxy 存在 單點故障 問題,須要結合 Lvs 和 Keepalived 作 高可用方案。
優勢:應用範圍廣,穩定性較高,中間代理層 高可用。 缺點:沒法平滑地 水平擴容/縮容,無 可視化管理界面,運維不友好,出現故障,不能 自動轉移。
2.2. Codis
Codis 是一個 分佈式 Redis 解決方案,對於上層應用來講,鏈接 Codis-Proxy 和直接鏈接 原生的 Redis-Server 沒有的區別。Codis 底層會 處理請求的轉發,不停機的進行 數據遷移 等工做。Codis 採用了無狀態的 代理層,對於 客戶端 來講,一切都是透明的。
優勢
實現了上層 Proxy 和底層 Redis 的 高可用,數據分片 和 自動平衡,提供 命令行接口 和 RESTful API,提供 監控 和 管理 界面,能夠動態 添加 和 刪除 Redis 節點。
缺點
部署架構 和 配置 複雜,不支持 跨機房 和 多租戶,不支持 鑑權管理。
三、查詢路由方案
客戶端隨機地 請求任意一個 Redis 實例,而後由 Redis 將請求 轉發 給 正確 的 Redis 節點。Redis Cluster 實現了一種 混合形式 的 查詢路由,但並非 直接 將請求從一個 Redis 節點 轉發 到另外一個 Redis 節點,而是在 客戶端 的幫助下直接 重定向( redirected)到正確的 Redis 節點。
優勢
無中心節點,數據按照 槽 存儲分佈在多個 Redis 實例上,能夠平滑的進行節點 擴容/縮容,支持 高可用 和 自動故障轉移,運維成本低。
缺點
嚴重依賴 Redis-trib 工具,缺少 監控管理,須要依賴 Smart Client (維護鏈接,緩存路由表,MultiOp 和 Pipeline 支持)。Failover 節點的 檢測過慢,不如 中心節點 ZooKeeper 及時。Gossip 消息具備必定開銷。沒法根據統計區分 冷熱數據。
數據分佈
一、數據分佈理論 分佈式數據庫首先要解決把整個數據集按照分區規則映射到 多個節點 的問題,即把數據集劃分到 多個節點 上,每一個節點負責 總體數據 的一個子集。
數據分佈一般有 哈希分區 和 順序分區 兩種方式,對好比下:
因爲 Redis Cluster 採用 哈希分區規則,這裏重點討論 哈希分區。常見的 哈希分區 規則有幾種,下面分別介紹:
1.1 節點取餘分區
使用特定的數據,如 Redis 的 鍵 或 用戶 ID,再根據 節點數量 N 使用公式:hash(key)% N 計算出 哈希值,用來決定數據 映射 到哪個節點上。
優勢
這種方式的突出優勢是 簡單性,經常使用於數據庫的分庫分表規則。通常採用預分區的方式,提早根據 數據量規劃好分區數。 好比劃分爲 512 或 1024 張表,保證可支撐將來一段時間的 數據容量,再根據 負載狀況 將 表 遷移到其餘 數據庫 中。擴容時一般採用 翻倍擴容,避免 數據映射 所有被 打亂,致使 全量遷移 的狀況。
缺點 當節點數量變化時,如擴容或收縮節點,數據節點映射關係須要從新計算,會致使數據的從新遷移。
1.2. 一致性哈希分區
一致性哈希 能夠很好的解決穩定性問題,能夠將全部的 存儲節點排列在收尾相接的Hash 環上,每一個 key 在計算 Hash後會順時針找到臨接的存儲節點存放。而當有節點加入或退出時,僅影響該節點在 Hash 環上順時針相鄰的後續節點。
優勢
加入 和 刪除 節點隻影響 哈希環 中 順時針方向 的 相鄰的節點,對其餘節點無影響。
缺點 加減節點會形成哈希環中部分數據 沒法命中。當使用少許節點 時,節點變化將大範圍影響哈希環 中數據映射,不適合少許數據節點 的分佈式方案。普通的 一致性哈希分區在增減節點時須要增長一倍或減去一半節點才能保證數據和負載的均衡。
注意:由於 一致性哈希分區 的這些缺點,一些分佈式系統採用 虛擬槽 對 一致性哈希 進行改進,好比 Dynamo 系統。
1.3. 虛擬槽分區
虛擬槽分區 巧妙地使用了 哈希空間,使用 分散度良好 的 哈希函數 把全部數據 映射 到一個 固定範圍 的 整數集合 中,整數定義爲 槽(slot)。
這個範圍通常遠遠大於節點數,好比 Redis Cluster 槽範圍是 0 ~ 16383。槽是集羣內數據管理和遷移的基本單位。採用大範圍槽的主要目的是爲了方便數據拆分和集羣擴展。每一個節點會負責 必定數量的槽,如圖所示:
當前集羣有 5 個節點,每一個節點平均大約負責 3276 個 槽。因爲採用 高質量 的 哈希算法,每一個槽所映射的數據一般比較 均勻,將數據平均劃分到 5 個節點進行 數據分區。Redis Cluster 就是採用 虛擬槽分區。
節點1: 包含 0 到 3276 號哈希槽。
節點2:包含 3277 到 6553 號哈希槽。
節點3:包含 6554 到 9830 號哈希槽。
節點4:包含 9831 到 13107 號哈希槽。
節點5:包含 13108 到 16383 號哈希槽。
這種結構很容易添加或者刪除節點。若是增長 一個節點 6,就須要從節點 1 ~ 5 得到部分槽分配到節點 6 上。若是想移除節點 1,須要將節點 1 中的 槽 移到節點 2 ~ 5 上,而後將沒有任何槽 的節點 1 從集羣中移除便可。
因爲從一個節點將 哈希槽 移動到另外一個節點並不會 中止服務,因此不管添加刪除或者改變某個節點的哈希槽的數量都不會形成集羣不可用的狀態。
二、Redis的數據分區
Redis Cluster 採用 虛擬槽分區,全部的 鍵 根據 哈希函數 映射到 0~16383 整數槽內,計算公式:slot = CRC16(key)& 16383。每一個節點負責維護一部分槽以及槽所映射的 鍵值數據,如圖所示:
Redis虛擬槽分區的特色
解耦數據和節點之間的關係,簡化了節點擴容和收縮難度。
節點自身 維護槽的 映射關係,不須要客戶端或者代理服務維護槽分區元數據。
支持 節點、槽、鍵 之間的 映射查詢,用於 數據路由、在線伸縮 等場景。
三、Redis集羣的功能限制
Redis 集羣相對 單機 在功能上存在一些限制,須要 開發人員 提早了解,在使用時作好規避。 key 批量操做支持有限。
相似 mset、mget 操做,目前只支持對具備相同 slot 值的 key 執行 批量操做。對於 映射爲不一樣 slot 值的 key 因爲執行 mget、mget 等操做可能存在於多個節點上,所以不被支持。
key 事務操做支持有限。
只支持 多 key 在 同一節點上 的 事務操做,當多個 key 分佈在 不一樣 的節點上時 沒法 使用事務功能。
key 做爲數據分區的最小粒度
不能將一個 大的鍵值 對象如 hash、list 等映射到 不一樣的節點。
不支持多數據庫空間 單機下的Redis能夠支持 16 個數據庫(db0 ~ db15),集羣模式 下只能使用一個數據庫空間,即 db0。
複製結構只支持一層
從節點 只能複製 主節點,不支持 嵌套樹狀複製 結構。
Redis集羣搭建
Redis-Cluster 是 Redis 官方的一個 高可用 解決方案,Cluster 中的 Redis 共有 2^14(16384) 個 slot 槽。建立 Cluster 後,槽 會 平均分配 到每一個 Redis 節點上。
下面介紹一下本機啓動 6 個 Redis 的 集羣服務,並使用 redis-trib.rb 建立 3主3從 的 集羣。搭建集羣工做須要如下三個步驟:
一、準備節點 Redis 集羣通常由多個節點組成,節點數量至少爲 6 個,才能保證組成完整高可用的集羣。每一個節點須要開啓配置 cluster-enabled yes,讓 Redis 運行在集羣模式下。
Redis 集羣的節點規劃以下:
注意:建議爲集羣內 全部節點 統一目錄,通常劃分三個目錄:conf、data、log,分別存放 配置、數據 和 日誌 相關文件。把 6 個節點配置統一放在 conf 目錄下。
1.一、建立redis各實例目錄
$ sudo mkdir -p /usr/local/redis-cluster
$ cd /usr/local/redis-cluster
$ sudo mkdir conf data log
$ sudo mkdir -p data/redis-6379 data/redis-6389 data/redis-6380 data/redis-6390 data/redis-6381 data/redis-6391複製代碼
1.2 redis配置文件管理
根據如下 模板 配置各個實例的 redis.conf,如下只是搭建集羣須要的 基本配置,可能須要根據實際狀況作修改。
# redis後臺運行
daemonize yes
# 綁定的主機端口
bind 127.0.0.1
# 數據存放目錄
dir /usr/local/redis-cluster/data/redis-6379
# 進程文件
pidfile /var/run/redis-cluster/${自定義}.pid
# 日誌文件
logfile /usr/local/redis-cluster/log/${自定義}.log
# 端口號
port 6379
# 開啓集羣模式,把註釋#去掉
cluster-enabled yes
# 集羣的配置,配置文件首次啓動自動生成
cluster-config-file /usr/local/redis-cluster/conf/${自定義}.conf
# 請求超時,設置10秒
cluster-node-timeout 10000
# aof日誌開啓,有須要就開啓,它會每次寫操做都記錄一條日誌
appendonly yes複製代碼
redis-6379.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6379
pidfile /var/run/redis-cluster/redis-6379.pid
logfile /usr/local/redis-cluster/log/redis-6379.log
port 6379
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6379.conf
cluster-node-timeout 10000
appendonly yes複製代碼
redis-6389.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6389
pidfile /var/run/redis-cluster/redis-6389.pid
logfile /usr/local/redis-cluster/log/redis-6389.log
port 6389
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6389.conf
cluster-node-timeout 10000
appendonly yes複製代碼
redis-6380.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6380
pidfile /var/run/redis-cluster/redis-6380.pid
logfile /usr/local/redis-cluster/log/redis-6380.log
port 6380
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6380.conf
cluster-node-timeout 10000
appendonly yes複製代碼
redis-6390.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6390
pidfile /var/run/redis-cluster/redis-6390.pid
logfile /usr/local/redis-cluster/log/redis-6390.log
port 6390
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6390.conf
cluster-node-timeout 10000
appendonly yes複製代碼
redis-6381.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6381
pidfile /var/run/redis-cluster/redis-6381.pid
logfile /usr/local/redis-cluster/log/redis-6381.log
port 6381
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6381.conf
cluster-node-timeout 10000
appendonly yes複製代碼
redis-6391.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6391
pidfile /var/run/redis-cluster/redis-6391.pid
logfile /usr/local/redis-cluster/log/redis-6391.log
port 6391
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6391.conf
cluster-node-timeout 10000
appendonly yes複製代碼
二、環境準備
2.1 安裝Ruby環境
$ sudo brew install ruby複製代碼
2.2. 準備rubygem redis依賴
$ sudo gem install redis
Password:
Fetching: redis-4.0.2.gem (100%)
Successfully installed redis-4.0.2
Parsing documentation for redis-4.0.2
Installing ri documentation for redis-4.0.2
Done installing documentation for redis after 1 seconds
1 gem installed複製代碼
2.3. 拷貝redis-trib.rb到集羣根目錄
redis-trib.rb 是redis官方推出的管理redis 集羣的工具,集成在redis的源碼src 目錄下,將基於 redis提供的集羣命令封裝成簡單、便捷、實用的操做工具。
$ sudo cp /usr/local/redis-4.0.11/src/redis-trib.rb /usr/local/redis-cluster 複製代碼
查看 redis-trib.rb 命令環境是否正確,輸出以下:
$ ./redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help)
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.複製代碼
redis-trib.rb 是 redis 做者用 ruby 完成的。redis-trib.rb 命令行工具 的具體功能以下:
三、安裝集羣
3.1 啓動redis服務節點
運行以下命令啓動 6 臺 redis 節點:
sudo redis-server conf/redis-6379.conf
sudo redis-server conf/redis-6389.conf
sudo redis-server conf/redis-6380.conf
sudo redis-server conf/redis-6390.conf
sudo redis-server conf/redis-6381.conf
sudo redis-server conf/redis-6391.conf複製代碼
啓動完成後,redis 以集羣模式啓動,查看各個 redis 節點的進程狀態:
$ ps -ef | grep redis-server
0 1908 1 0 4:59下午 ?? 0:00.01 redis-server *:6379 [cluster]
0 1911 1 0 4:59下午 ?? 0:00.01 redis-server *:6389 [cluster]
0 1914 1 0 4:59下午 ?? 0:00.01 redis-server *:6380 [cluster]
0 1917 1 0 4:59下午 ?? 0:00.01 redis-server *:6390 [cluster]
0 1920 1 0 4:59下午 ?? 0:00.01 redis-server *:6381 [cluster]
0 1923 1 0 4:59下午 ?? 0:00.01 redis-server *:6391 [cluster]複製代碼
在每一個 redis 節點的 redis.conf 文件中,咱們都配置了 cluster-config-file 的文件路徑,集羣啓動時,conf 目錄會新生成 集羣 節點配置文件。查看文件列表以下:
$ tree -L 3 .
.
├── appendonly.aof
├── conf
│ ├── node-6379.conf
│ ├── node-6380.conf
│ ├── node-6381.conf
│ ├── node-6389.conf
│ ├── node-6390.conf
│ ├── node-6391.conf
│ ├── redis-6379.conf
│ ├── redis-6380.conf
│ ├── redis-6381.conf
│ ├── redis-6389.conf
│ ├── redis-6390.conf
│ └── redis-6391.conf
├── data
│ ├── redis-6379
│ ├── redis-6380
│ ├── redis-6381
│ ├── redis-6389
│ ├── redis-6390
│ └── redis-6391
├── log
│ ├── redis-6379.log
│ ├── redis-6380.log
│ ├── redis-6381.log
│ ├── redis-6389.log
│ ├── redis-6390.log
│ └── redis-6391.log
└── redis-trib.rb
9 directories, 20 files複製代碼
3.2 redis-trib關聯集羣節點
按照 從主到從 的方式 從左到右 依次排列 6 個 redis 節點。
$ sudo ./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391 複製代碼
集羣建立後,redis-trib 會先將 16384 個哈希槽分配到3 個主節點,即 redis-6379,redis-6380 和 redis-6381。而後將各個 從節點 指 向 主節點,進行數據同步。
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:6379
127.0.0.1:6380
127.0.0.1:6381
Adding replica 127.0.0.1:6390 to 127.0.0.1:6379
Adding replica 127.0.0.1:6391 to 127.0.0.1:6380
Adding replica 127.0.0.1:6389 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
slots:0-5460 (5461 slots) master
M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
slots:5461-10922 (5462 slots) master
M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
slots:10923-16383 (5461 slots) master
S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
replicates ad4b9ffceba062492ed67ab336657426f55874b7
S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
replicates df23c6cad0654ba83f0422e352a81ecee822702e
S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
replicates ab9da92d37125f24fe60f1f33688b4f8644612ee複製代碼
而後輸入 yes,redis-trib.rb 開始執行 節點握手 和 槽分配 操做,輸出以下:
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
slots: (0 slots) slave
replicates df23c6cad0654ba83f0422e352a81ecee822702e
S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
slots: (0 slots) slave
replicates ab9da92d37125f24fe60f1f33688b4f8644612ee
M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
slots: (0 slots) slave
replicates ad4b9ffceba062492ed67ab336657426f55874b7
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.複製代碼
執行 集羣檢查,檢查各個 redis 節點佔用的哈希槽(slot)的個數以及slot覆蓋率。16384個槽位中,主節點 redis-637九、redis-6380 和 redis-6381 分別佔用了 546一、5461 和 5462 個槽位。
3.3. redis主節點的日誌
能夠發現,經過 BGSAVE 命令,從節點 redis-6389 在 後臺 異步地從 主節點 redis-6379 同步數據。
$ cat log/redis-6379.log
1907:C 05 Sep 16:59:52.960 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1907:C 05 Sep 16:59:52.961 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1907, just started
1907:C 05 Sep 16:59:52.961 # Configuration loaded
1908:M 05 Sep 16:59:52.964 * Increased maximum number of open files to 10032 (it was originally set to 256).
1908:M 05 Sep 16:59:52.965 * No cluster configuration found, I'm ad4b9ffceba062492ed67ab336657426f55874b7 1908:M 05 Sep 16:59:52.967 * Running mode=cluster, port=6379. 1908:M 05 Sep 16:59:52.967 # Server initialized 1908:M 05 Sep 16:59:52.967 * Ready to accept connections 1908:M 05 Sep 17:01:17.782 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH 1908:M 05 Sep 17:01:17.812 # IP address for this node updated to 127.0.0.1 1908:M 05 Sep 17:01:22.740 # Cluster state changed: ok 1908:M 05 Sep 17:01:23.681 * Slave 127.0.0.1:6389 asks for synchronization 1908:M 05 Sep 17:01:23.681 * Partial resynchronization not accepted: Replication ID mismatch (Slave asked for '4c5afe96cac51cde56039f96383ea7217ef2af41', my replication IDs are '037b661bf48c80c577d1fa937ba55367a3692921' and '0000000000000000000000000000000000000000') 1908:M 05 Sep 17:01:23.681 * Starting BGSAVE for SYNC with target: disk 1908:M 05 Sep 17:01:23.682 * Background saving started by pid 1952 1952:C 05 Sep 17:01:23.683 * DB saved on disk 1908:M 05 Sep 17:01:23.749 * Background saving terminated with success 1908:M 05 Sep 17:01:23.752 * Synchronization with slave 127.0.0.1:6389 succeeded複製代碼
3.4 redis集羣完整性檢測
使用 redis-trib.rb check 命令檢測以前建立的 兩個集羣 是否成功,check 命令只須要給出集羣中 任意一個節點地址 就能夠完成 整個集羣 的 檢查工做,命令以下:
$ ./redis-trib.rb check 127.0.0.1:6379 複製代碼
當最後輸出以下信息,提示集羣 全部的槽 都已分配到節點:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.複製代碼
本文介紹了Redis集羣解決方案,數據分佈和集羣搭建。
集羣方案包括客戶端分區方案,代理分區方案和查詢路由方案。數據分佈部分簡單地對節點取餘分區,一致性哈希分區以及虛擬槽分區進行了闡述和對比。
最後對使用 Redis-trib 搭建了一個 三主三從 的 虛擬槽集羣示例。