文章目錄
建立 Redis Cluster (Redis 5)
最近在部署上線用的各項服務,其中一個就是近幾年系統中不可獲缺的 redis,目前團隊打算採用 Redis Cluster 來增加 redis 處理效能及水平擴展能力,只是對於 redis cluster 我只有自己測試的經驗沒有真正應用在 production 過,重新檢視文件時發現 Redis 5 有新的 cluster 架設方式,測試順便筆記一下
基本環境說明
- macOS Mojave 10.14.6
- Redis 5.0.5
關於 Redis Cluster
- 僅適合於 Redis3.0(包括3.0)以上版本
- 每個 redis cluster 有 16384 個 hash slot,key 經過 CRC16 計算後決定儲存的 cluster node
- 每個 redis node 都需要開放兩個 TCP port:一個是 redis client 連線使用的 port (常見為
6379
) 另一個是 cluster bus 用來做 node 間的交互溝通 (固定為 client port 加上10000
) - 僅支援單一 database
- 不支援多個 key 的操作 (可能需要跨 node)
- 最少需要三個 master node,但建議使用 3 個 master nodes + 3 個 slave node
下載 Redis 並編譯
官網即提供完整 source code 下載,以下使用 Stable
版本
curl -O http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xzf redis-5.0.5.tar.gz
cd redis-5.0.5
make
使用自訂 config
準備 conffig
使用 6 個 node (3 master + 3 slave):7000,7001,7002,7003,7004,7005,因此需要 6 個 config,如果是同一台電腦上使用不同 port 來建立 instance ,記得 config 中的
port
與cluster-config-file
要切分開來最基本的 cluster node config
port 7000 # 每個 node 的 client port cluster-enabled yes # 啟用 redis cluster cluster-config-file nodes_7000.conf # 每個 node 需要獨立,cluster 自行維護使用,不需人為介入 cluster-node-timeout 5000 # node 判斷失效的時間 appendonly yes # 啟用 aof
其他可能需要的設定
port 7000 # 每個 node 的 client port cluster-enabled yes # 啟用 redis cluster cluster-config-file nodes_7000.conf # 每個 node 需要獨立,cluster 自行維護使用,不需人為介入 cluster-node-timeout 5000 # node 判斷失效的時間 appendonly yes # 啟用 aof daemonize yes # 背景執行 bind x.x.x.x # 允許 listen 特定 ip 的連線 requirepass password # 密碼設定 masterauth password # 從 master 的密碼
啟動
使用之前 build 出來的 redis-server.sh 與準備好的 config 逐一啟動 redis instance
./redis-5.0.5/src/redis-server ./7000/redis.conf ./redis-5.0.5/src/redis-server ./7001/redis.conf ./redis-5.0.5/src/redis-server ./7002/redis.conf ./redis-5.0.5/src/redis-server ./7003/redis.conf ./redis-5.0.5/src/redis-server ./7004/redis.conf ./redis-5.0.5/src/redis-server ./7005/redis.conf
加入 cluster
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
取得 cluster 資訊
可以對 cluster 任一 node 執行指令
cluster nodes
可以確認 cluster 現在的 node、每個 node 的 role 以及分配的 slot
./redis-5.0.5/src/redis-cli -p 7000 cluster nodes
cluster info
./redis-5.0.5/src/redis-cli -c -p 7000 cluster info
可以確認 cluster 的狀態
使用內建 script
如果主要的測試是放在 client 端,純粹只是想要有個 redis cluster 提供服務,照上面方式逐一建立 config 、啟動 redis 再將所有 redis instance join 為 cluster 的動作就變得有些擾人,這時就可以使用內建的 shell 來快速建立 redis cluster
需要在 ./utils/create-cluster/create-cluster.sh
所在目錄下執行 create-cluster.sh
才不會遇到路徑問題
啟動 redis instance (3 master + 3 slave)
預設會建立 30001,30002,30003,30004,30005,30006 六個 redis instance
./create-cluster start
建立 redis cluster
./create-cluster create
停止 redis cluster
./create-cluster stop
完整清除 redis cluster 相關設定
./create-cluster clean
心得
測試下來 redis 5 在 cli 上對於 redis cluster 的整合更完整了,過去只能透過其他 shell 來建立 cluster,現在不需要再想辦法看懂這些其他語言的 script 即可建立,相對方便許多,不過卻也有可能值得改進的地方:master 與 slave 的分配都是 cli 決定,反而失去了一些彈性,我嘗試在某些 node 的 config 上加入 replicaof
會無法正確啟動 redis
另外 redis-cli 在建立 redis cluster 時也將 sentinel 機制加入,也省去了自己建立 sentinel 時間跟精力
參考資訊
文章作者 Yowko Tsai
上次更新 2019-08-09
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。