##准備一個redis集群,集群的搭建參考我上一篇 https://www.cnblogs.com/lansetuerqi/p/15385933.html
這是一個3主3從的集群
192.168.2.64:6370(主) 192.168.2.24:6375(從) (0-5460)
192.168.2.64:6372(主) 192.168.2.24:6373(從) (5461-10922)
192.168.2.64:6371(主) 192.168.2.24:6374(從) (10923-16383)
[root@ora redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -a 123456 -c cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375@16375 slave 05afba26af286f583204ed8db95cef91cf422d9f 0 1634092111839 1 connected 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370@16370 myself,master - 0 1634092107000 1 connected 0-5460 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374@16374 slave bd6c1bd4328c3a8f0b17987285f007e7a3733776 0 1634092112842 2 connected bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371@16371 master - 0 1634092110835 2 connected 10923-16383 a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372@16372 master - 0 1634092110000 9 connected 5461-10922 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373@16373 slave a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 0 1634092113845 9 connected
一、往集群中新增數據節點
1、現准備三個閑置redis節點,配置與上面一致,192.168.2.34 6376 6377 6378 加入集群。
##第一種方式 redis-cli --cluster add-node {new host}:{new port} {exist host}:{exist port}
##也可以一步到位,直接指定為master的slave
## ./bin/redis-cli -a 123456 --cluster add-node 172.17.0.9:6379 172.17.0.2:6379 --cluster-slave --cluster-master-id d1cfb89071861866baa7ba53f878905f15616445(master節點id)
[root@ora redis]# ./bin/redis-cli -a 123456 -c --cluster add-node 192.168.2.34:6376 192.168.2.64:637
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.>>> Adding node 192.168.2.34:6376 to cluster 192.168.2.64:6370
>>> Performing Cluster Check (using node 192.168.2.64:6370) M: 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375 slots: (0 slots) slave replicates 05afba26af286f583204ed8db95cef91cf422d9f S: 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374 slots: (0 slots) slave replicates bd6c1bd4328c3a8f0b17987285f007e7a3733776 M: bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373 slots: (0 slots) slave replicates a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 192.168.2.34:6376 to make it join the cluster. [OK] New node added correctly.
##已經以master形式加入,無slot
##Reids集群內有16384個slot,數據只會存儲在slot上,故此節點無法存儲數據,即使通過此節點登錄集群存入數據,也只會存儲到擁有數據槽(0-16383)的其他節點上
##如果某個slot沒有歸屬於任意節點,那么此slot上的數據也是不可用的
##key通過CRC16算法取hash值然后對16384取余得出slot位置)
[root@ora redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -c -a 123456 cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375@16375 slave 05afba26af286f583204ed8db95cef91cf422d9f 0 1634093065655 1 connected 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370@16370 myself,master - 0 1634093064000 1 connected 0-5460 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374@16374 slave bd6c1bd4328c3a8f0b17987285f007e7a3733776 0 1634093067662 2 connected bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371@16371 master - 0 1634093068665 2 connected 10923-16383 a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372@16372 master - 0 1634093062545 9 connected 5461-10922 0936b30e022b7fad6ddb3ce6aee1b96b8c1d1c6b 192.168.2.34:6376@16376 master - 0 1634093066659 7 connected 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373@16373 slave a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 0 1634093068000 9 connected
##第二種方式 ./bin/redis-cli -h 192.168.2.64 -p 6370 -c -a 123456 cluster meet 192.168.2.34 6377
[root@ora redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -c -a 123456 cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375@16375 slave 05afba26af286f583204ed8db95cef91cf422d9f 0 1634093065655 1 connected 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370@16370 myself,master - 0 1634093064000 1 connected 0-5460 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374@16374 slave bd6c1bd4328c3a8f0b17987285f007e7a3733776 0 1634093067662 2 connected bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371@16371 master - 0 1634093068665 2 connected 10923-16383 a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372@16372 master - 0 1634093062545 9 connected 5461-10922 0936b30e022b7fad6ddb3ce6aee1b96b8c1d1c6b 192.168.2.34:6376@16376 master - 0 1634093066659 7 connected 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373@16373 slave a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 0 1634093068000 9 connected [root@ora redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -c -a 123456 cluster meet 192.168.2.34 6377 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. OK [root@ora redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -c -a 123456 cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375@16375 slave 05afba26af286f583204ed8db95cef91cf422d9f 0 1634093462000 1 connected 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370@16370 myself,master - 0 1634093461000 1 connected 0-5460 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374@16374 slave bd6c1bd4328c3a8f0b17987285f007e7a3733776 0 1634093464848 2 connected bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371@16371 master - 0 1634093462842 2 connected 10923-16383 a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372@16372 master - 0 1634093461840 9 connected 5461-10922 0936b30e022b7fad6ddb3ce6aee1b96b8c1d1c6b 192.168.2.34:6376@16376 master - 0 1634093463845 7 connected e954db69f71beb9426e01325064de520d156a67a 192.168.2.34:6377@16377 master - 0 1634093461000 0 connected 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373@16373 slave a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 0 1634093459000 9 connected
將6378節點也加入集群,此處不做展示
PS:以上兩種增加方式都可往集群中增加節點,但推薦使用redis-cli add-node 將節點加入集群,該命令會對新節點的狀態做檢查,如果新節點已加入到其它集群或者包含數據,則會放棄加入集群,並報出如下異常(未驗證)。
[ERR] Node 192.168.2.34:6376 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
而 cluster meet不會做檢查操作,如果通過cluster meet加入的節點已經加入到其它集群,會出現被加入節點的集群合並到現有集群的現象,造成數據錯亂,所以線上推薦使用redis-cli --cluster add-node方式將新節點加入到集群。

二、修改節點
1、將192.168.2.34 6376 修改為 192.168.2.64 6371 的 從節點,前面ip為需要更改的新增節點,后面id為master節點node_id
[root@ora redis]# ./bin/redis-cli -h 192.168.2.34 -p 6376 -a 123456 -c cluster replicate bd6c1bd4328c3a8f0b17987285f007e7a3733776 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. OK [root@ora redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -c -a 123456 cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375@16375 slave 05afba26af286f583204ed8db95cef91cf422d9f 0 1634103157373 1 connected 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370@16370 myself,master - 0 1634103157000 1 connected 0-5460 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374@16374 slave bd6c1bd4328c3a8f0b17987285f007e7a3733776 0 1634103155366 2 connected 2f899821dbfe2e2d5aa2c22e9e023eb9a9f127f3 192.168.2.34:6378@16378 master - 0 1634103154363 8 connected bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371@16371 master - 0 1634103158376 2 connected 10923-16383 a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372@16372 master - 0 1634103156370 9 connected 5461-10922 0936b30e022b7fad6ddb3ce6aee1b96b8c1d1c6b 192.168.2.34:6376@16376 slave bd6c1bd4328c3a8f0b17987285f007e7a3733776 0 1634103158376 2 connected e954db69f71beb9426e01325064de520d156a67a 192.168.2.34:6377@16377 master - 0 1634103154000 0 connected 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373@16373 slave a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 0 1634103159379 9 connected
2、為新增master節點 6377 分配1025個slot
[root@project-deve redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -a 123456 -c --cluster reshard 192.168.2.34:6377 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing Cluster Check (using node 192.168.2.34:6377) M: e954db69f71beb9426e01325064de520d156a67a 192.168.2.34:6377 slots: (0 slots) master S: c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375 slots: (0 slots) slave replicates 05afba26af286f583204ed8db95cef91cf422d9f M: 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374 slots: (0 slots) slave replicates bd6c1bd4328c3a8f0b17987285f007e7a3733776 S: 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373 slots: (0 slots) slave replicates a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 M: 2f899821dbfe2e2d5aa2c22e9e023eb9a9f127f3 192.168.2.34:6378 slots: (0 slots) master S: 0936b30e022b7fad6ddb3ce6aee1b96b8c1d1c6b 192.168.2.34:6376 slots: (0 slots) slave replicates bd6c1bd4328c3a8f0b17987285f007e7a3733776 M: bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371 slots:[10923-16383] (5461 slots) master 2 additional replica(s) [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)? 1025 ##分配1025個slot What is the receiving node ID? e954db69f71beb9426e01325064de520d156a67a ##新節點node_id 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: all ##輸入all表示所有節點slot重新洗牌,輸入單個node_id 或者多個node_id(空格分開)表示從輸入的節點中抽取 Ready to move 1025 slots. Source nodes: M: 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372 slots:[5461-10922] (5462 slots) master 1 additional replica(s) M: 2f899821dbfe2e2d5aa2c22e9e023eb9a9f127f3 192.168.2.34:6378 slots: (0 slots) master M: bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371 slots:[10923-16383] (5461 slots) master 2 additional replica(s) Destination node: M: e954db69f71beb9426e01325064de520d156a67a 192.168.2.34:6377 slots: (0 slots) master Resharding plan: Moving slot 5461 from a0069cc8774b1139c4ff696c1c2dbfbe0b44d598
...
##再次查看node信息,6377已經有了slot,並且在多個區段內 [root@project-deve redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -a 123456 -c cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375@16375 slave 05afba26af286f583204ed8db95cef91cf422d9f 0 1634110713692 1 connected 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370@16370 myself,master - 0 1634110708000 1 connected 342-5460 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374@16374 slave bd6c1bd4328c3a8f0b17987285f007e7a3733776 0 1634110712187 2 connected 2f899821dbfe2e2d5aa2c22e9e023eb9a9f127f3 192.168.2.34:6378@16378 master - 0 1634110711184 8 connected bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371@16371 master - 0 1634110710000 2 connected 11264-16383 a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372@16372 master - 0 1634110714193 9 connected 5803-10922 0936b30e022b7fad6ddb3ce6aee1b96b8c1d1c6b 192.168.2.34:6376@16376 slave e954db69f71beb9426e01325064de520d156a67a 0 1634110710182 10 connected e954db69f71beb9426e01325064de520d156a67a 192.168.2.34:6377@16377 master - 0 1634110710000 10 connected 0-341 5461-5802 10923-11263 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373@16373 slave a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 0 1634110713190 9 connected
三、刪除節點
刪除集群中6377節點,刪除之前先把cluster分配的slot給重新分配一下(很重要)。
##轉移6377的1025個slot,刪除6377節點 [root@project-deve redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -a 123456 -c --cluster reshard 192.168.2.34:6378 How many slots do you want to move (from 1 to 16384)? 1025 ##6377原有的1025個slot What is the receiving node ID? 2f899821dbfe2e2d5aa2c22e9e023eb9a9f127f3 #6378的node_id 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: e954db69f71beb9426e01325064de520d156a67a ##6377的node_id Source node #2: done ##結束 ##查看slot已經全部分配給了6378,6377已經沒有slot [root@project-deve redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -a 123456 -c cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375@16375 slave 05afba26af286f583204ed8db95cef91cf422d9f 0 1634112240719 1 connected 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370@16370 myself,master - 0 1634112238000 1 connected 342-5460 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374@16374 slave bd6c1bd4328c3a8f0b17987285f007e7a3733776 0 1634112242707 2 connected 2f899821dbfe2e2d5aa2c22e9e023eb9a9f127f3 192.168.2.34:6378@16378 master - 0 1634112238000 13 connected 0-341 5461-5802 10923-11263 bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371@16371 master - 0 1634112243710 2 connected 11264-16383 a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372@16372 master - 0 1634112240000 9 connected 5803-10922 0936b30e022b7fad6ddb3ce6aee1b96b8c1d1c6b 192.168.2.34:6376@16376 slave e954db69f71beb9426e01325064de520d156a67a 0 1634112241704 12 connected e954db69f71beb9426e01325064de520d156a67a 192.168.2.34:6377@16377 master - 0 1634112239089 12 connected 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373@16373 slave a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 0 1634112242000 9 connected ##刪除6377 ./bin/redis-cli -a {password} --cluster del-node {del_ip}:{del_port} {del_node_id} [root@project-deve redis]# ./bin/redis-cli -a 123456 --cluster del-node 192.168.2.34:6377 e954db69f71beb9426e01325064de520d156a67a Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Removing node e954db69f71beb9426e01325064de520d156a67a from cluster 192.168.2.34:6377 >>> Sending CLUSTER FORGET messages to the cluster... >>> Sending CLUSTER RESET SOFT to the deleted node. ##查看節點信息,node 6377已經被刪除 [root@project-deve redis]# ./bin/redis-cli -h 192.168.2.64 -p 6370 -a 123456 -c cluster nodes Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. c4729c87272ebab033d1b78ca00b6c93a15c02eb 192.168.2.24:6375@16375 slave 05afba26af286f583204ed8db95cef91cf422d9f 0 1634112950788 1 connected 05afba26af286f583204ed8db95cef91cf422d9f 192.168.2.64:6370@16370 myself,master - 0 1634112948000 1 connected 342-5460 36f8084c986ce896593ea7cf00496fdcdef70a11 192.168.2.24:6374@16374 slave bd6c1bd4328c3a8f0b17987285f007e7a3733776 0 1634112953797 2 connected 2f899821dbfe2e2d5aa2c22e9e023eb9a9f127f3 192.168.2.34:6378@16378 master - 0 1634112951000 13 connected 0-341 5461-5802 10923-11263 bd6c1bd4328c3a8f0b17987285f007e7a3733776 192.168.2.64:6371@16371 master - 0 1634112947276 2 connected 11264-16383 a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 192.168.2.64:6372@16372 master - 0 1634112951790 9 connected 5803-10922 0936b30e022b7fad6ddb3ce6aee1b96b8c1d1c6b 192.168.2.34:6376@16376 slave 2f899821dbfe2e2d5aa2c22e9e023eb9a9f127f3 0 1634112950000 13 connected 088548d9ebb6e3b908bb74e0f8d8a397b2c53cd3 192.168.2.24:6373@16373 slave a0069cc8774b1139c4ff696c1c2dbfbe0b44d598 0 1634112952794 9 connected
備注:./bin/redis-cli -a 123456 --cluster del-node 192.168.2.34:6377 e954db69f71beb9426e01325064de520d156a67a
通過這種方式將節點從集群中移除,如果后續要將該節點再次加入集群,直接加入也會報上面這個異常,因為此時節點的nodes_cluster.conf配置文件中存在之前集群節點信息,需要將該文件刪除再啟動節點加入集群。
五、集群的啟停
。。。
