說明:
Redis叢集搭建完成之後,對於後續的操作和使用中進程需要對進群中的服務節點Node進行新增、刪除、修改之類的操作,以下記錄了在具體環境中對Node的處理:
1 節點組態管理 1.1 參數說明
建立叢集的操作可以通過使用位於Redis安裝資料夾內的redis-trib.rb來完成,redis-trib.rb是使用ruby開發的Redis叢集管理程式,具有建立叢集,檢查叢集的上線情況和槽指派情況、對叢集進行重新分區、向叢集添加新節點或者從叢集中移除節點等功能;
redis-trib.rb參數:
[root@node01src]$ ./redis-trib.rb
Usage:redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
fix host:port
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
add-node new_host:new_portexisting_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>
help (show this help)
1.2 主節點增加
./redis-trib.rb add-node 127.0.0.1:7006127.0.0.1:7000
可以看到.使用addnode 命令來添加節點,第一個參數是新節點的地址,第二個參數是任意一個已經存在的節點的IP和連接埠.
我們可以看到新的節點已經添加到叢集中:
新節點現在已經串連上了叢集,成為叢集的一份子,並且可以對用戶端的命令請求進行轉向了,但是和其他主節點相比,新節點還有兩點區別:
· 新節點沒有包含任何資料,因為它沒有包含任何雜湊槽.
· 儘管新節點沒有包含任何雜湊槽,但它仍然是一個主節點,所以在叢集需要將某個從節點升級為新的主節點時,這個新節點不會被選中。.
接下來,只要使用redis-trib程式,將叢集中的某些雜湊桶移動到新節點裡面,新節點就會成為真正的主節點了。
1.3 從節點增加
有兩種方法添加從節點,可以像添加主節點一樣使用redis-trib命令,也可以像下面的例子一樣使用 --slave選項:
./redis-trib.rb add-node --slave 127.0.0.1:7006127.0.0.1:7000
此處的命令和添加一個主節點命令類似,此處並沒有指定添加的這個從節點的主節點,這種情況下系統會在其他的複製集中的主節點中隨機選取一個作為這個從節點的主節點。
你可以通過下面的命令指定主節點:
./redis-trib.rb add-node --slave --master-id3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
也可以使用CLUSTERREPLICATE 命令添加.這個命令也可以改變一個從節點的主節點。
例如,要給主節點127.0.0.1:7005添加一個從節點,該節點雜湊槽的範圍1423-16383,節點 ID 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,我們需要連結新的節點(已經是空的主節點)並執行命令:
redis 127.0.0.1:7006> cluster replicate3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
我們新的從節點有了一些雜湊槽,其他的節點也知道(過幾秒後會更新他們自己的配置),可以使用如下命令確認:
$ redis-cli -p 7000 cluster nodes | grep slave | grep3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
./redis-cli -h 172.168.63.202 -p 7000 cluster nodes |grep slave | grep e0d02d64b9c14db140daef9b4d2489bbde25fe42
f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected
2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617198 3 connected
節點 3c3a0c...有兩個從節點,7002 (已經存在的)和 7006 (新添加的).
1.4 節點移除
只要使用redis-tribdel-node 命令即可:
./redis-trib del-node 127.0.0.1:7000 `<node-id>`
第一個參數是任意一個節點的地址,第二個節點是你想要移除的節點地址。
使用同樣的方法移除主節點,不過在移除主節點前,需要確保這個主節點是空的.如果不是空的,需要將這個節點的資料重新分區到其他主節點上.
替代移除主節點的方法是手動執行故障恢複,被移除的主節點會作為一個從節點存在,不過這種情況下不會減少叢集節點的數量,也需要重新分區資料.
1.5 從節點轉移
在Redis叢集中會存在改變一個從節點的主節點的情況,需要執行如下命令 :
cluster replicate <new-master-node-id>
在特定的情境下,不需要系統管理員的協助下,自動將一個從節點從當前的主節點切換到另一個主節的自動重新設定的過程叫做複製遷移(從節點遷移),從節點的遷移能夠提高整個Redis叢集的可用性.
1.6 節點重新分區
重新分區操作基本上就是將某些節點上的雜湊槽移動到另外一些節點上面,和建立叢集一樣,重新分區也可以使用 redis-trib程式來執行。執行以下命令可以開始一次重新分區操作:
./redis-trib.rb reshard 127.0.0.1:7000
需要指定叢集中其中一個節點的地址, redis-trib就會自動找到叢集中的其他節點。
目前redis-trib只能在管理員的協助下完成重新分區的工作,要讓 redis-trib自動將雜湊槽從一個節點移動到另一個節點,目前來說還做不到
How many slots do you want to move (from 1 to 16384)?
輸入:100
嘗試從將100個槽重新分區,除了移動的雜湊槽數量之外, redis-trib還需要知道重新分區的目標,也即是,負責接收這 1000個雜湊槽的節點。
What is the receivingnode ID?
輸入:e0d02d64b9c14db140daef9b4d2489bbde25fe42
我得目標節點是 e0d02d64b9c14db140daef9b4d2489bbde25fe42.
現在需要指定從哪寫節點來移動keys到目標借調我輸入的是all ,這樣就會從其他每個master上取一些雜湊槽。
Do you want to proceedwith the proposed reshard plan (yes/no)?
輸入:yes
最後確認後你將會看到每個redis-trib移動的槽的資訊,每個key的移動的資訊也會列印出來
在重新分區的過程中,你得例子程式是不會受到影響的,你可以停止或者重新啟動多次。
在重新分區結束後你可以通過如下命令檢查叢集狀態:
172.168.63.204:7001> cluster slots