原文:http://blog.sina.com.cn/s/blog_53b45c4d0102wg11.html
集群節點添加
節點新增包括新增主節點、從節點兩種情況。以下分別做一下測試:
1、新增主節點
新增一個節點7007作為主節點修改配置文件
- [root@localhost redis-cluster]# cp -r redis01 redis07
- [root@localhost redis-cluster]# cd redis07/
- [root@localhost redis07]# sed -i "s/7001/7007/g" ./redis.conf
啟動7007redis服務
- [root@localhost redis07]# ./redis-server redis.conf
- [root@localhost redis07]# netstat -anp | grep 7007
- tcp 0 0 127.0.0.1:17007 0.0.0.0:* LISTEN 13441/./redis-serve
- tcp 0 0 127.0.0.1:7007 0.0.0.0:* LISTEN 13441/./redis-serve
- [root@localhost redis07]#
上面可以看到,7007已經啟動,現在加入集群中。添加使用redis-trib.rb的add-node命令
- ./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7002
add-node是加入集群節點,127.0.0.1:7007為要加入的節點,127.0.0.1:7002 表示加入的集群的一個節點,用來辨識是哪個集群,理論上那個集群的節點都可以。
執行以下add-node
- [root@localhost redis-cluster]# ./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7002
- >>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7002
- >>> Performing Cluster Check (using node 127.0.0.1:7002)
- S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002
- slots: (0 slots) slave
- replicates a5db243087d8bd423b9285fa8513eddee9bb59a6
- M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003
- slots:10923-16383 (5461 slots) master
- 1 additional replica(s)
- M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005
- slots:5461-10922 (5462 slots) master
- 1 additional replica(s)
- S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004
- slots: (0 slots) slave
- replicates dd19221c404fb2fc4da37229de56bab755c76f2b
- S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006
- slots: (0 slots) slave
- replicates f9886c71e98a53270f7fda961e1c5f730382d48f
- M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001
- slots:0-5460 (5461 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 127.0.0.1:7007 to make it join the cluster.
- [OK] New node added correctly.
- [root@localhost redis-cluster]#
可以看到7007加入這個Cluster,並成為一個新的節點。
可以check以下7007節點狀態
- [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7007
- >>> Performing Cluster Check (using node 127.0.0.1:7007)
- M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007
- slots: (0 slots) master
- 0 additional replica(s)
- S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006
- slots: (0 slots) slave
- replicates f9886c71e98a53270f7fda961e1c5f730382d48f
- M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001
- slots:0-5460 (5461 slots) master
- 1 additional replica(s)
- M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003
- slots:10923-16383 (5461 slots) master
- 1 additional replica(s)
- S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002
- slots: (0 slots) slave
- replicates a5db243087d8bd423b9285fa8513eddee9bb59a6
- M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005
- slots:5461-10922 (5462 slots) master
- 1 additional replica(s)
- S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004
- slots: (0 slots) slave
- replicates dd19221c404fb2fc4da37229de56bab755c76f2b
- [OK] All nodes agree about slots configuration.
- >>> Check for open slots...
- >>> Check slots coverage...
- [OK] All 16384 slots covered.
- [root@localhost redis-cluster]#
M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007
slots: (0 slots) master
0 additional replica(s)
上面信息可以看到有4個M節點,3個S節點,7007成為了M主節點,它沒有附屬的從節點,而且Cluster並未給7007分配哈希卡槽(0 slots)。
可以從客戶端連接集群查看一下,集群節點的連接情況
- [root@localhost redis-cluster]# cd redis07/
- [root@localhost redis07]# ./redis-cli -c -p 7007
- 127.0.0.1:7007> cluster nodes
- 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006 slave f9886c71e98a53270f7fda961e1c5f730382d48f 0 1462955393326 3 connected
- dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001 master - 0 1462955388247 1 connected 0-5460
- ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007 myself,master - 0 0 0 connected
- f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003 master - 0 1462955390270 3 connected 10923-16383
- 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002 slave a5db243087d8bd423b9285fa8513eddee9bb59a6 0 1462955394334 7 connected
- a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005 master - 0 1462955392309 7 connected 5461-10922
- 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004 slave dd19221c404fb2fc4da37229de56bab755c76f2b 0 1462955389663 1 connected
- 127.0.0.1:7007>
redis-cluster在新增節點時並未分配卡槽,需要我們手動對集群進行重新分片遷移數據,需要重新分片命令 reshard
redis-trib.rb reshard 127.0.0.1:7005
這個命令是用來遷移slot節點的,后面的127.0.0.1:7005是表示是哪個集群,端口填[7000-7007]都可以,執行結果如下:
- [root@localhost redis-cluster]# ./redis-trib.rb reshard 127.0.0.1:7005
- >>> Performing Cluster Check (using node 127.0.0.1:7005)
- M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005
- slots:5461-10922 (5462 slots) master
- 1 additional replica(s)
- S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004
- slots: (0 slots) slave
- replicates dd19221c404fb2fc4da37229de56bab755c76f2b
- M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003
- slots:10923-16383 (5461 slots) master
- 1 additional replica(s)
- S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002
- slots: (0 slots) slave
- replicates a5db243087d8bd423b9285fa8513eddee9bb59a6
- M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007
- slots: (0 slots) master
- 0 additional replica(s)
- M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001
- slots:0-5460 (5461 slots) master
- 1 additional replica(s)
- S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006
- slots: (0 slots) slave
- replicates f9886c71e98a53270f7fda961e1c5f730382d48f
- [OK] All nodes agree about slots configuration.
- >>> Check for open slots...
- >>> Check slots coverage...
- [OK] All 16384 slots covered.
- How many slots do you want to move (from 1 to 16384)?
它提示我們需要遷移多少slot到7007上,我們平分16384個哈希槽給4個節點:16384/4 = 4096,我們需要移動4096個槽點到7007上。
- [OK] All 16384 slots covered.
- How many slots do you want to move (from 1 to 16384)? 4096
- What is the receiving node ID?
需要輸入7007的節點id,ee3efb90e5ac0725f15238a64fc60a18a71205d7
- Please enter all the source node IDs.
- Type 'all' to use all the nodes as source nodes for the hash slots.
- Type 'done' once you entered all the source nodes IDs.
- Source node #1:
redis-trib 會向你詢問重新分片的源節點(source node),即,要從特點的哪個節點中取出 4096 個哈希槽,還是從全部節點提取4096個哈希槽, 並將這些槽移動到7007節點上面。
如果我們不打算從特定的節點上取出指定數量的哈希槽,那么可以向redis-trib輸入 all,這樣的話, 集群中的所有主節點都會成為源節點,redis-trib從各個源節點中各取出一部分哈希槽,湊夠4096個,然后移動到7007節點上:
- Source node #1:all
然后開始從別的主節點遷移哈希槽,並且確認。
- Moving slot 1343 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1344 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1345 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1346 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1347 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1348 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1349 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1350 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1351 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1352 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1353 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1354 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1355 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1356 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1357 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1358 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1359 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1360 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1361 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1362 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1363 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Moving slot 1364 from dd19221c404fb2fc4da37229de56bab755c76f2b
- Do you want to proceed with the proposed reshard plan (yes/no)? yes
確認之后,redis-trib就開始執行分片操作,將哈希槽一個一個從源主節點移動到7007目標主節點。
重新分片結束后我們可以check以下節點的分配情況。
- [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7001
- >>> Performing Cluster Check (using node 127.0.0.1:7001)
- M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001
- slots:1365-5460 (4096 slots) master
- 1 additional replica(s)
- M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007
- slots:0-1364,5461-6826,10923-12287 (4096 slots) master
- 0 additional replica(s)
- M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005
- slots:6827-10922 (4096 slots) master
- 1 additional replica(s)
- S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006
- slots: (0 slots) slave
- replicates f9886c71e98a53270f7fda961e1c5f730382d48f
- M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003
- slots:12288-16383 (4096 slots) master
- 1 additional replica(s)
- S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002
- slots: (0 slots) slave
- replicates a5db243087d8bd423b9285fa8513eddee9bb59a6
- S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004
- slots: (0 slots) slave
- replicates dd19221c404fb2fc4da37229de56bab755c76f2b
- [OK] All nodes agree about slots configuration.
- >>> Check for open slots...
- >>> Check slots coverage...
- [OK] All 16384 slots covered.
- [root@localhost redis-cluster]#
slots:0-1364,5461-6826,10923-12287 (4096 slots) master
可以看到7007節點分片的哈希槽片不是連續的,間隔的移動。
- [root@localhost redis-cluster]# cd redis07/
- [root@localhost redis07]# ./redis-cli -c 7007
- Could not connect to Redis at 127.0.0.1:6379: Connection refused
- [root@localhost redis07]# ./redis-cli -c -p 7007
- 127.0.0.1:7007> keys *
- 1) "name"
- 2) "age"
- 127.0.0.1:7007>
- 127.0.0.1:7007>
可以看到將7001的age[741]和name[5798]移動到7007節點上,
主節點7007添加成功。