redis 集群-新增加节点并数据迁移
2017-08-17 14:56
453 查看
现在我们已经有一个包含6个节点的集群,我写了段代码,往集群写入10W条测试数据。
现在模拟机器扩容场景,为集群加入一个master节点7006和一个slave节点7007。
以上命令将7006节点接入7000所在的集群。接下来,我们为7006增加一个slave节点。
以上命令表示增加slave节点,将7006的节点加入7000节点所在的集群中作为slave节点,随机依附现有的master节点中slave最少的节点,如果需要再指定特别的master节点,使用
其中的
接下来我们用坐负载均衡,Slot是Redis Cluster数据承载的最小单位,我们可以指定将一定范围的Slot转移到新的节点来实现负载均衡。
Redis Cluster转移一个Slot的步骤是:
在目标节点上声明将从源节点上迁入Slot
在源节点上声明将往目标节点迁出Slot
批量从源节点获取KEY
将获取的Key迁移到目标节点
重复步骤3,4直到所有数据迁移完毕
分别向双方节点发送
等待集群状态变为OK
我编写了一个脚本来批量迁移Slot
执行命令
cluster nodes 23b412673af0506df6382353e3a65960d5b7e66d
10.211.55.4:7006 master -
0 1449064402389
7 connected 0-1000
0c2954d21d7bcdae333f4fdecf468ce05aa25544 10.211.55.4:7001 master -
0 1449064400372
2 connected 5461-10922
384a3bb5bd9ecb2fc7db75c866abc715d7966f82
10.211.55.4:7002 master -
0 1449064401381
3 connected 10923-16383 c3e09d286ef2dce49843268b20832d65a5d516a1
10.211.55.4:7004 slave
0c2954d21d7bcdae333f4fdecf468ce05aa25544 0
1449064401885 5 connected
50737b4a91443ab1a34eec4ef99d4f6fe5d358f4
10.211.55.4:7005 slave
384a3bb5bd9ecb2fc7db75c866abc715d7966f82
0 1449064402389
6 connected 3c62cc6664bba378cceb8ae8e02f5d727deafe9d
10.211.55.4:7007 slave
23b412673af0506df6382353e3a65960d5b7e66d
0 1449064400878
7 connected d6441916dcd89cbf431465d92dfc0eb3dd235295 10.211.55.4:7003 slave
6ee21c5d93a6d2f293a2df1b37e8c9c27cb55ad8
0 1449064402389
4 connected 6ee21c5d93a6d2f293a2df1b37e8c9c27cb55ad8 10.211.55.4:7000 myself,master -
0 0
1 connected 1001-5460
现在模拟机器扩容场景,为集群加入一个master节点7006和一个slave节点7007。
redis-trib.rb add-node 10.211.55.4:7006 10.211.55.4:7000
以上命令将7006节点接入7000所在的集群。接下来,我们为7006增加一个slave节点。
redis-trib.rb add-node --slave 10.211.55.4:7007 10.211.55.4:7000
以上命令表示增加slave节点,将7006的节点加入7000节点所在的集群中作为slave节点,随机依附现有的master节点中slave最少的节点,如果需要再指定特别的master节点,使用
redis-trib.rb add-node --slave --master-id 23b412673af0506df6382353e3a65960d5b7e66d 10.211.55.4:7007 10.211.55.4:7000
其中的
23b412673af0506df6382353e3a65960d5b7e66d是7006节点的id,我们可以通过
cluster nodes命令查看节点的id。
接下来我们用坐负载均衡,Slot是Redis Cluster数据承载的最小单位,我们可以指定将一定范围的Slot转移到新的节点来实现负载均衡。
Redis Cluster转移一个Slot的步骤是:
在目标节点上声明将从源节点上迁入Slot
CLUSTER SETSLOT <slot> IMPORTING <source_node_id>
在源节点上声明将往目标节点迁出Slot
CLUSTER SETSLOT <slot> IMPORTING <source_node_id>
批量从源节点获取KEY
CLUSTER GETKEYSINSLOT <slot> <count>
将获取的Key迁移到目标节点
MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>
重复步骤3,4直到所有数据迁移完毕
分别向双方节点发送
CLUSTER SETSLOT <slot> NODE <target_node_id>,该命令将会广播给集群其他节点,已经将Slot转移到目标节点。
等待集群状态变为OK
CLUSTER INFO中的
cluster_state = ok
我编写了一个脚本来批量迁移Slot
#!/bin/bash source_host=$1 # 源节点HOST source_port=$2 # 源节点端口 target_host=$3 # 目标节点HOST target_port=$4 # 目标节点端口 start_slot=$5 # 迁移节点的其实范围 end_slot=$6 # 迁移节点的结束范围 for slot in `seq ${start_slot} ${end_slot}` do redis-cli -c -h ${target_host} -p ${target_port} cluster setslot ${slot} importing `redis-cli -c -h ${source_host} -p ${source_port} cluster nodes | grep ${source_port} | awk '{print $1}'` echo "Setslot importing ${slot} to ${target_host}:${target_port} success" redis-cli -c -h ${source_host} -p ${source_port} cluster setslot ${slot} migrating `redis-cli -c -h ${target_host} -p ${target_port} cluster nodes | grep ${target_port} | awk '{print $1}'` echo "Setslot migrating ${slot} from ${source_host}:${source_port} success" while [ 1 -eq 1 ] do allkeys=`redis-cli -c -h ${source_host} -p ${source_port} cluster getkeysinslot ${slot} 10` if [ -z "${allkeys}" ] then redis-cli -c -h ${source_host} -p ${source_port} cluster setslot ${slot} node `redis-cli -c -h ${target_host} -p ${target_port} cluster nodes | grep ${target_port} | awk '{print $1}'` redis-cli -c -h ${target_host} -p ${target_port} cluster setslot ${slot} node `redis-cli -c -h ${source_host} -p ${target_port} cluster nodes | grep ${target_port} | awk '{print $1}'` echo "Migrate slot ${slot} finish" break else for key in ${allkeys} do redis-cli -c -h ${source_host} -p ${source_port} migrate ${target_host} ${target_port} ${key} 0 5000 echo "Migrate slot ${slot} key ${key} success" done fi done done
执行命令
bash rebalance-cluster.sh 10.211.55.4 7000 10.211.55.4 7006 0 1000将7000节点上0-1000这个范围内的Slot转移到7006节点,通过
cluster nodes命令我们可以看到0-1000这个区间是slot已经从7000转移到7006
cluster nodes 23b412673af0506df6382353e3a65960d5b7e66d
10.211.55.4:7006 master -
0 1449064402389
7 connected 0-1000
0c2954d21d7bcdae333f4fdecf468ce05aa25544 10.211.55.4:7001 master -
0 1449064400372
2 connected 5461-10922
384a3bb5bd9ecb2fc7db75c866abc715d7966f82
10.211.55.4:7002 master -
0 1449064401381
3 connected 10923-16383 c3e09d286ef2dce49843268b20832d65a5d516a1
10.211.55.4:7004 slave
0c2954d21d7bcdae333f4fdecf468ce05aa25544 0
1449064401885 5 connected
50737b4a91443ab1a34eec4ef99d4f6fe5d358f4
10.211.55.4:7005 slave
384a3bb5bd9ecb2fc7db75c866abc715d7966f82
0 1449064402389
6 connected 3c62cc6664bba378cceb8ae8e02f5d727deafe9d
10.211.55.4:7007 slave
23b412673af0506df6382353e3a65960d5b7e66d
0 1449064400878
7 connected d6441916dcd89cbf431465d92dfc0eb3dd235295 10.211.55.4:7003 slave
6ee21c5d93a6d2f293a2df1b37e8c9c27cb55ad8
0 1449064402389
4 connected 6ee21c5d93a6d2f293a2df1b37e8c9c27cb55ad8 10.211.55.4:7000 myself,master -
0 0
1 connected 1001-5460
相关文章推荐
- redis3.0.6集群动态 增加节点
- redis集群——增加节点
- redis集群动态增加或者删除节点
- redis集群动态增加或者删除节点
- linux下redis的集群搭建,节点的增加和删除,sentinel主从切换
- 总结redis第四部分(集群搭建以及增加和删除节点)
- redis集群动态增加或者删除节点
- Redis集群动态增加或者删除节点
- redis集群动态增加或者删除节点
- redis集群动态增加或者删除节点 和Docker启动报错
- redis集群动态增加或者删除节点
- redis集群——增加节点
- 【redis】redis集群节点选举
- (八)Redis集群常用命令、集群节点新增删除
- redis 集群之动态添加redis节点,删除指定ID的redis节点,以及查看redis集群中各个节点的信息
- (转)高性能网站架构之缓存篇—Redis集群增删节点
- mongodb 安装常用命令 集群架构 调整,增加延迟备份节点服务器,删除仲裁节点
- Redis学习3之单节点上redis集群搭建和使用
- redis4.0集群安装配置(双节点)
- redis集群删除节点