redis 集群-新增加节点并数据迁移

本文介绍如何在现有 Redis 集群基础上进行扩容,并通过迁移 Slot 实现负载均衡。具体包括添加新节点到集群、创建 slave 节点及编写脚本批量迁移 Slot 的详细步骤。

现在我们已经有一个包含6个节点的集群,我写了段代码,往集群写入10W条测试数据。
现在模拟机器扩容场景,为集群加入一个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的步骤是:

  1. 在目标节点上声明将从源节点上迁入Slot CLUSTER SETSLOT <slot> IMPORTING <source_node_id>
  2. 在源节点上声明将往目标节点迁出Slot CLUSTER SETSLOT <slot> IMPORTING <source_node_id>
  3. 批量从源节点获取KEY CLUSTER GETKEYSINSLOT <slot> <count>
  4. 将获取的Key迁移到目标节点 MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>
  5. 重复步骤3,4直到所有数据迁移完毕
  6. 分别向双方节点发送 CLUSTER SETSLOT <slot> NODE <target_node_id>,该命令将会广播给集群其他节点,已经将Slot转移到目标节点。
  7. 等待集群状态变为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 0c2954d21d7bcdae333f4fdecf468ce05aa 25544 10.211. 55.4:7001 master - 0 1449064400372 2 connected 5461-10922 384a3bb5bd9ecb2fc7db75c866abc7 15d7966f82 10.211.55.4: 7002 master - 0 1449064401381 3 connected 10923-16383 c3e09d286ef2dce49843268b20832d65a 5d516a1 10.211.55.4: 7004 slave 0c2954d21d7bcdae333f4fdecf468ce05aa 25544 0 1449064401885 5 connected 50737b4a91443ab1a34eec4ef99d4f6fe 5d358f4 10.211.55.4: 7005 slave 384a3bb5bd9ecb2fc7db75c866abc7 15d7966f82 0 1449064402389 6 connected 3c62cc6664bba378cceb8ae8e02f5d727deafe9d 10.211.55.4: 7007 slave 23b412673af0506df6382353e3a65960d5b7e66d 0 1449064400878 7 connected d6441916dcd89cbf431465d92dfc0eb3dd 235295 10.211. 55.4:7003 slave 6ee21c5d93a6d2f293a2df1b37e8c9c27cb55ad8 0 1449064402389 4 connected 6ee21c5d93a6d2f293a2df1b37e8c9c27cb55ad 8 10.211.55. 4: 7000 myself,master - 0 0 1 connected 1001-5460
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值