1. 程式人生 > >redis cluster 集群搭建(增、刪、改、查) :5.0.2

redis cluster 集群搭建(增、刪、改、查) :5.0.2

The 簡單命令 dde sta ranch 取整 sets sel 默認

環境簡介:
1:centos 7  ;
2:redis version  5.0.2   ;
3:  安裝方式:編譯安裝 ;
4:。。。

創建集群

節點IP地址

10.42.166.105:6379 
10.42.142.202:6379 
10.42.11.183:6379 
10.42.35.201:6379 
10.42.181.22:6379 
10.42.225.72:6379

使用公司redis docker 鏡像啟動6個實例後,開始創建集群:
create命令可選replicas參數,replicas表示需要有幾個slave。最簡單命令使用如下:

redis-cli --cluster create --cluster-replicas 1 10.42.166.105:6379 10.42.142.202:6379 10.42.11.183:6379 10.42.35.201:6379 10.42.181.22:6379 10.42.225.72:6379 

查看集群節點

redis-cli cluster nodes

測試創建key

set testkey1 testvalue1
get testkey1

模擬故障,刪除鏡像

直接在rancher集群直接delete 10.42.141.119 節點

查看狀態

root@redis-cluster-redis-cluster-test-1:/data# redis-cli cluster nodes
21322d2e62d027393a46add604a8eed37c53b460 10.42.1.140:6379@16379 slave 39cde9a04a9cfde37337840f31fa1bc1ab8fb37a 0 1546933324975 6 connected
dfa238fff8a7a49230cff7eb74f573f5645c8ec5 10.42.166.105:6379@16379 myself,master - 0 1546933324000 1 connected 0-5460
f1e99f5f57b2390cba33c8142cb79c2e062db854 10.42.158.17:6379@16379 master - 0 1546933325980 2 connected 5461-10922
3f20faa26d09fd263f249976fbdac859d26a511a 10.42.91.228:6379@16379 slave f1e99f5f57b2390cba33c8142cb79c2e062db854 0 1546933326981 5 connected
39cde9a04a9cfde37337840f31fa1bc1ab8fb37a 10.42.221.211:6379@16379 master - 0 1546933325000 3 connected 10923-16383

### 集群顯示節點連接失敗
9460c46ed7e8e9d809a896d966754823c7fb9e5d 10.42.141.119:6379@16379 slave,fail dfa238fff8a7a49230cff7eb74f573f5645c8ec5 1546933279432 1546933277829 4 connected

從集群徹底刪除節點

從集群中移除 node_id 指定的節點。

redis-cli cluster forget dfa238fff8a7a49230cff7eb74f573f5645c8ec5

返回
OK

### 從集群中刪除節點 
del-node可以把某個節點從集群中刪除。del-node只能刪除沒有分配slot的節點。刪除命令傳遞兩個參數:

host:port:從該節點獲取集群信息。
node_id:需要刪除的節點id。

redis-cli cluster del-node 10.42.141.211:6379  dfa238fff8a7a49230cff7eb74f573f5645c8ec5

添加新節點 (添加從節點)

--slave:設置該參數,則新節點以slave的角色加入集群
--master-id:這個參數需要設置了--slave才能生效,--master-id用來指定新節點的master節點。如果不設置該參數,則會隨機為節點選擇master節點。

redis-cli --cluster add-node  新節點IP地址:端口    存在節點IP:端口 --cluster-slave (從節點) --cluster-master-id (master節點的ID)

redis-cli --cluster add-node   10.42.141.119:6379  10.42.166.105:6379  --cluster-slave   --cluster-master-id  dfa238fff8a7a49230cff7eb74f573f5645c8ec5

返回結果如下:

>>> Adding node 10.42.141.119:6379 to cluster 10.42.166.105:6379
>>> Performing Cluster Check (using node 10.42.166.105:6379)
M: dfa238fff8a7a49230cff7eb74f573f5645c8ec5 10.42.166.105:6379
   slots:[0-5460] (5461 slots) master
..........
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 10.42.141.119:6379 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 10.42.166.105:6379.
[OK] New node added correctly.

添加一組集群節點

節點如下:
10.42.42.180 (主)
10.42.22.184 (從)

方法:先添加主節點,然後添加從節點;

添加主節點

redis-cli --cluster add-node 新節點IP:端口 已存在節點IP:端口
實例:
redis-cli --cluster add-node 10.42.42.180:6379 10.42.166.105:6379

root@redis-cluster-redis-cluster-test-1:/data# redis-cli --cluster add-node 10.42.42.180:6379  10.42.166.105:6379
>>> Adding node 10.42.42.180:6379 to cluster 10.42.166.105:6379
>>> Performing Cluster Check (using node 10.42.166.105:6379)
M: 748273d7a0a186d229028edefdcff2711c1c0e0d 10.42.166.105:6379
...........
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 10.42.42.180:6379 to make it join the cluster.  《== 添加成功
[OK] New node added correctly.

驗證

root@redis-cluster-redis-cluster-test-1:/data# redis-cli cluster nodes
........
b18bef6a47c06a624d1e2ba0f5d83d4c4ce97ff7 10.42.11.183:6379@16379 master - 0 1546941402518 3 connected 10923-16383
6764b152d0d7526b48a16621ff2a4c72f6494622 10.42.142.202:6379@16379 master - 0 1546941402000 2 connected 5461-10922

### 新節點
0488e5f3e006f0df2806bf0b178a2414b248b1e5 10.42.42.180:6379@16379 master - 0 1546941402000 0 connected

添加從節點

redis-cli --cluster add-node 新節點IP地址:端口 存在節點IP:端口 --cluster-slave (從節點) --cluster-master-id (master節點的ID)

實例:
redis-cli --cluster add-node 10.42.22.184:6379 10.42.42.180:6379 --cluster-slave --cluster-master-id 0488e5f3e006f0df2806bf0b178a2414b248b1e5

root@redis-cluster-redis-cluster-test-1:/data# redis-cli --cluster add-node   10.42.22.184:6379  10.42.42.180:6379  --cluster-slave   --cluster-master-id  0488e5f3e006f0df2806bf0b178a2414b248b1e5
>>> Adding node 10.42.22.184:6379 to cluster 10.42.42.180:6379
>>> Performing Cluster Check (using node 10.42.42.180:6379)
M: 0488e5f3e006f0df2806bf0b178a2414b248b1e5 10.42.42.180:6379
   slots: (0 slots) master
................
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 10.42.22.184:6379 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 10.42.42.180:6379.
[OK] New node added correctly.

驗證

root@redis-cluster-redis-cluster-test-1:/data# redis-cli cluster nodes
f41d8746a1fd31135b0af1737f69a77ec8e6cd26 10.42.225.72:6379@16379 slave b18bef6a47c06a624d1e2ba0f5d83d4c4ce97ff7 0 1546941516826 6 connected
.......
6764b152d0d7526b48a16621ff2a4c72f6494622 10.42.142.202:6379@16379 master - 0 1546941514822 2 connected 5461-10922

## 新加節點添加成功,但還沒有分配槽位
0488e5f3e006f0df2806bf0b178a2414b248b1e5 10.42.42.180:6379@16379 master - 0 1546941515825 7 connected
f9bc8def897915d73569b140d1478fbf94d3dbef 10.42.22.184:6379@16379 slave 0488e5f3e006f0df2806bf0b178a2414b248b1e5 0 1546941515000 7 connected

rebalance平衡集群節點slot數量

語法:

rebalance       host:port
                --weight <arg>
                --auto-weights
                --threshold <arg>
                --use-empty-masters
                --timeout <arg>
                --simulate
                --pipeline <arg>

host:port:這個是必傳參數,用來從一個節點獲取整個集群信息,相當於獲取集群信息的入口。
--weight <arg>:節點的權重,格式為node_id=weight,如果需要為多個節點分配權重的話,需要添加多個--weight <arg>參數,即--weight b31e3a2e=5 --weight 60b8e3a1=5,node_id可為節點名稱的前綴,只要保證前綴位數能唯一區分該節點即可。沒有傳遞–weight的節點的權重默認為1。
--auto-weights:這個參數在rebalance流程中並未用到。
--threshold <arg>:只有節點需要遷移的slot閾值超過threshold,才會執行rebalance操作。具體計算方法可以參考下面的rebalance命令流程的第四步。
--use-empty-masters:rebalance是否考慮沒有節點的master,默認沒有分配slot節點的master是不參與rebalance的,設置--use-empty-masters可以讓沒有分配slot的節點參與rebalance。
--timeout <arg>:設置migrate命令的超時時間。
--simulate:設置該參數,可以模擬rebalance操作,提示用戶會遷移哪些slots,而不會真正執行遷移操作。
--pipeline <arg>:與reshar的pipeline參數一樣,定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值為10。

實例:

redis-cli --cluster rebalance 10.42.35.201:6379 --cluster-threshold 1 --cluster-use-empty-masters --pipeline 10

如果需要模擬執行添加 : --cluster-simulate

root@redis-cluster-redis-cluster-test-1:/data# redis-cli --cluster rebalance  10.42.35.201:6379 --cluster-threshold 1 --cluster-use-empty-masters
>>> Performing Cluster Check (using node 10.42.35.201:6379)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 4 nodes. Total weight = 4.00
Moving 1366 slots from 10.42.142.202:6379 to 10.42.42.180:6379
###############################################################################################
Moving 1365 slots from 10.42.166.105:6379 to 10.42.42.180:6379
#############################################################################################
Moving 1365 slots from 10.42.11.183:6379 to 10.42.42.180:6379
#############################################################################################

驗證rebalance 結果:

redis-cli cluster nodes

root@redis-cluster-redis-cluster-test-1:/data# redis-cli cluster  nodes
f41d8746a1fd31135b0af1737f69a77ec8e6cd26 10.42.225.72:6379@16379 slave b18bef6a47c06a624d1e2ba0f5d83d4c4ce97ff7 0 1546942598000 6 connected
e538c397a1c8ca6217561a88d72b08b0e513da84 10.42.181.22:6379@16379 slave 6764b152d0d7526b48a16621ff2a4c72f6494622 0 1546942598000 5 connected
39aceb27ccdce533c5cfbf51eb13928d2515fadc 10.42.35.201:6379@16379 slave 748273d7a0a186d229028edefdcff2711c1c0e0d 0 1546942599807 4 connected
6764b152d0d7526b48a16621ff2a4c72f6494622 10.42.142.202:6379@16379 master - 0 1546942598803 2 connected 6827-10922
748273d7a0a186d229028edefdcff2711c1c0e0d 10.42.166.105:6379@16379 myself,master - 0 1546942597000 1 connected 1365-5460
b18bef6a47c06a624d1e2ba0f5d83d4c4ce97ff7 10.42.11.183:6379@16379 master - 0 1546942598000 3 connected 12288-16383

## 新加節點已經有分配槽位
f9bc8def897915d73569b140d1478fbf94d3dbef 10.42.22.184:6379@16379 slave 0488e5f3e006f0df2806bf0b178a2414b248b1e5 0 1546942600809 7 connected
0488e5f3e006f0df2806bf0b178a2414b248b1e5 10.42.42.180:6379@16379 master - 0 1546942597000 7 connected 0-1364 5461-6826 10923-12287

常用命令參考:

集群

cluster info :打印集群的信息
cluster nodes :列出集群當前已知的所有節點( node),以及這些節點的相關信息。
節點

cluster meet <ip> <port> :將 ip 和 port 所指定的節點添加到集群當中,讓它成為集群的一份子。
cluster forget <node_id> :從集群中移除 node_id 指定的節點。
cluster replicate <node_id> :將當前節點設置為 node_id 指定的節點的從節點。
cluster saveconfig :將節點的配置文件保存到硬盤裏面。
槽(slot)

cluster addslots <slot> [slot ...] :將一個或多個槽( slot)指派( assign)給當前節點。
cluster delslots <slot> [slot ...] :移除一個或多個槽對當前節點的指派。
cluster flushslots :移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。
cluster setslot <slot> node <node_id> :將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麽先讓另一個節點刪除該槽>,然後再進行指派。
cluster setslot <slot> migrating <node_id> :將本節點的槽 slot 遷移到 node_id 指定的節點中。
cluster setslot <slot> importing <node_id> :從 node_id 指定的節點中導入槽 slot 到本節點。
cluster setslot <slot> stable :取消對槽 slot 的導入( import)或者遷移( migrate)。
鍵

cluster keyslot <key> :計算鍵 key 應該被放置在哪個槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的鍵值對數量。
cluster getkeysinslot <slot> <count> :返回 count 個 slot 槽中的鍵

參考文檔:

http://weizijun.cn/2016/01/08/redis%20cluster%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7redis-trib-rb%E8%AF%A6%E8%A7%A3/

redis cluster 集群搭建(增、刪、改、查) :5.0.2