上一篇,我介绍了怎样搭建redis 3.0集群环境,本篇继续学习怎样人工干预redis 集群环境,动态的增加、删除、重新分配节点。
//集群(cluster)
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
//节点(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)。
//键 (key)
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
这些命令是集群所独有的。执行上述命令要先登录,可以从集群的任意一个节点进行登录:
redis-cli -c -p 7002 -h 127.0.0.1 //登录集群
127.0.0.1:7002> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:3
cluster_stats_messages_sent:249371
cluster_stats_messages_received:88204
[root@localhost cluster]# cp -r 7000 ./7006
[root@localhost 7006]# rm -rf appendonly.aof dump.rdb nodes.conf //删除7000节点的相关文件
vi redis.conf
修改
port 7006
pidfile /var/run/redis_7006.pid
同样操作创建7007节点,然后启动两个redis节点:
[root@localhost 7006]# redis-server redis.conf
[root@localhost local]# cd redis-3.0.0/src/
[root@localhost src]# ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7001
注释:
127.0.0.1:7006 是新增的节点
127.0.0.1:7001 集群任一个旧节点
#查看 7006节点的node id
127.0.0.1:7001> cluster nodes
5da7b4b37f4e14638d9558e66166c042b752d417 127.0.0.1:7006 master - 0 1458724292695 0 connected
bda1c8d3dacc62fd3f94e681056d24df9c9509d5 127.0.0.1:7005 slave 56dbded984085df8ab3565828a5a8fad02560988 0 1458724292184 6 connected
ed3afe6671e902df9572eae4d3364007344c0c71 127.0.0.1:7001 myself,master - 0 0 2 connected 5461-10922
0e7b636594a7ef4d575d8160225b2e1ca90ac375 127.0.0.1:7000 slave 49ed626134079dc301f586ff4edb1670a3a42a8c 0 1458724291672 7 connected
56dbded984085df8ab3565828a5a8fad02560988 127.0.0.1:7002 master - 0 1458724291672 3 connected 10923-16383
49ed626134079dc301f586ff4edb1670a3a42a8c 127.0.0.1:7003 master - 0 1458724293202 7 connected 0-5460
62dea9349dd9b53be602f653b62ab21adad06d26 127.0.0.1:7004 slave ed3afe6671e902df9572eae4d3364007344c0c71 0 1458724292694 5 connected
#添加7007成为7006的slave
[root@localhost src]# ./redis-trib.rb add-node --slave --master-id 5da7b4b37f4e14638d9558e66166c042b752d417 127.0.0.1:7007 127.0.0.1:7001
注释:
–slave,表示添加的是从节点
–master-id 5da7b4b37f4e14638d9558e66166c042b752d417 ,主节点的node id,在这里是前面新添加的7006的node id
127.0.0.1:7007,新节点
127.0.0.1:7001集群任一个旧节点
[root@localhost src]# redis-trib.rb reshard 127.0.0.1:7001 //下面是主要过程
How many slots do you want to move (from 1 to 16384)? 1000 //设置slot数1000
What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新节点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 //表示全部节点重新洗牌
Do you want to proceed with the proposed reshard plan (yes/no)? yes //确认重新分
在查看集群nodes信息,得到如下结果:
新添加的主节点是没有slot的,主节点如果没有slots的话,存取数据就都不会被选中。所以重新洗牌后就新加的master node 就有slot了。 注意:如果用’all’则会将其他每个master节点的slot 分给目标节点。最好别用‘all’, 会造成slot 分割碎片。图为用’all’的情况。
redis-trib.rb del-node 127.0.0.1:7001 '9c240333476469e8e2c8e80b089c48f389827265'
注意:如果主节点有从节点,将从节点转移到其他主节点在删除
127.0.0.1:7007> cluster replicate 49ed626134079dc301f586ff4edb1670a3a42a8c
注:49ed626134079dc301f586ff4edb1670a3a42a8c 为master节点7003的node id
如果主节点有slot,去掉分配的slot,然后在删除主节点
# redis-trib.rb reshard 127.0.0.1:7006 //取消分配的slot,下面是主要过程
How many slots do you want to move (from 1 to 16384)? 1000 //被删除master的所有slot数量
What is the receiving node ID? 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 //接收7007节点slot的master
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:03ccad2ba5dd1e062464bc7590400441fafb63f2 //被删除master的node-id
Source node #2:done
Do you want to proceed with the proposed reshard plan (yes/no)? yes //取消slot后,reshard
注意:source node 要用 ‘done’,如果用all 则会全部洗牌,7006还是会得到slot.
最后删除主节点7006:
redis-trib.rb del-node 127.0.0.1:7001 '5da7b4b37f4e14638d9558e66166c042b752d417'
注:
127.0.0.1:7001 代表cluster的一个node
5da7b4b37f4e14638d9558e66166c042b752d417 为要删除的7006这个节点的id.