前言
在redis源碼編譯的時候,在src目錄下會有一個redis-trib.rb的腳本,這個腳本是ruby寫的,用於管理redis cluster。
安裝系統依賴包
yum -y install epel-release
yum -y install ruby rubygem-redis
redis-trib.rb
/opt/redis/bin/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具有以下功能:
create:創建集群 --replicas可以指定從節點個數
check:檢查集群
info:查看集群信息
fix:修復集群
reshard:在線遷移slot
rebalance:平衡集群節點slot數量
add-node:將新節點加入集群
del-node:從集群中刪除節點
set-timeout:設置集群節點間心跳連接的超時時間
call:在集群全部節點上執行命令
import:將外部redis數據導入集群
常用例子
1、create創建集群:create命令可選replicas參數,replicas表示需要有幾個slave。
/opt/redis/bin/redis-trib.rb create --replicas 1 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006
2、info查看集群:info命令用來查看集群的信息。info命令也是先執行load_cluster_info_from_node獲取完整的集群信息。
/opt/redis/bin/redis-trib.rb info 127.0.0.1:8001
3、check檢查集群:檢查集群狀態的命令,沒有其他參數,只需要選擇一個集群中的一個節點即可。
/opt/redis/bin/redis-trib.rb check 127.0.0.1:8001
4、fix修復集群:fix命令的流程跟check的流程很像,顯示加載集群信息,然後在check_cluster方法內傳入fix為
true的變量,會在集群檢查出現異常的時候執行修複流程。目前fix命令能修復兩種異常,一種是集群有處於遷移中的slot的節點,一種是slot未完全分配的異常。
/opt/redis/bin/redis-trib.rb fix 127.0.0.1:8001
5、reshard在線遷移slot:reshard命令可以在線把集群的一些slot從集群原來slot負責節點遷移到新的節點,利用reshard可以完成集群的在線橫向擴容和縮容。
/opt/redis/bin/redis-trib.rb reshard 127.0.0.1:8001
(然後根據提示操作就可以了,也可以根據參數直接設置完成)
6、rebalance平衡集群節點slot數量:rebalance命令可以根據用戶傳入的參數平衡集群節點的slot數量,rebalance功能非常強大,可以傳入的參數很多。
host:port:這個是必傳參數,用來從一個節點獲取整個集群信息,相當於獲取集群信息的入口。
--weight :節點的權重,格式為node_id=weight,如果需要為多個節點分配權重的話,需要添加多個–weight 參數,即--weight a44dd3ede3f=5 --weight 8e60b3a1=5,node_id可為節點名稱的前綴,只要保證前綴位數能唯一區分該節點即可。沒有傳遞–weight的節點的權重默認為1。
--auto-weights:這個參數在rebalance流程中並未用到。
--threshold :只有節點需要遷移的slot閾值超過threshold,才會執行rebalance操作。具體計算方法可以參考下面的rebalance命令流程的第四步。
--use-empty-masters:rebalance是否考慮沒有節點的master,默認沒有分配slot節點的master是不參與rebalance的,設置--use-empty-masters可以讓沒有分配slot的節點參與rebalance。
--timeout :設置migrate命令的超時時間。
--simulate:設置該參數,可以模擬rebalance操作,提示用戶會遷移哪些slots,而不會真正執行遷移操作。
--pipeline :與reshar的pipeline參數一樣,定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值為10。
/opt/redis/bin/redis-trib.rb rebalance --threshold 1 127.0.0.1:8001
7、add-node將新節點加入集群:add-node命令可以將新節點加入集群,節點可以為master,也可以為某個master節點的slave。
--slave:設置該參數,則新節點以slave的角色加入集群
--master-id:這個參數需要設置了–slave才能生效,–master-id用來指定新節點的master節點。如果不設置該參數,則會隨機為節點選擇master節點。
/opt/redis/bin/redis-trib.rb add-node --slave --master-id b12f7ab5c229fdf817aa7b5a4c534463ce223c62 127.0.0.1:8007
8、del-node從集群中刪除節點:del-node可以把某個節點從集群中刪除。del-node只能刪除沒有分配slot的節點。
/opt/redis/bin/redis-trib.rb del-node 127.0.0.1:8001 7ec63a08d2355448d16a84b502974832c52359e1
9、set-timeout設置集群節點間心跳連接的超時時間:set-timeout用來設置集群節點間心跳連接的超時時間,單位是毫秒,不得小於100毫秒,因為100毫秒對於心跳時間來說太短了。
/opt/redis/bin/redis-trib.rb set-timeout 127.0.0.1:8001 30000
10、call在集群全部節點上執行命令:call命令可以用來在集群的全部節點執行相同的命令。call命令也是需要通過集群的一個節點地址,連上整個集群,然後在集群的每個節點執行該命令。
/opt/redis/bin/redis-trib.rb call 127.0.0.1:8001 get key
11、import將外部redis數據導入集群:import命令可以把外部的redis節點數據導入集群。
總結
redis cluster集群有了這個腳本就輕鬆多了,不需要通過redis-cli一個個操作。