redis之slot迁移
简介
redis支持在线将slot迁移到指定的节点,但是slot迁移是一个很繁琐的步骤,这里将其脚本化。
基本步骤
# 初始化后的集群
# 插入测试数据
set name dsq
# 确定要迁移的slot
# 查看key在slot 5798
CLUSTER KEYSLOT ‘name'
# 查看节点和槽位对应关系, 当前slot 5798在192.168.1.2:4003,准备迁移到192.168.1.2:4005
cluster nodes
# 源节点192.168.1.2:4003上
cluster setslot 5798 MIGRATING sourcenodeid
# 目标节点192.168.1.2:4005上
cluster setslot 5798 IMPORTING targetnodeid
# 源节点上查看slot 5798有多少个key
cluster GETKEYSINSLOT 5798 1000
# 源节点上迁移key到目标节点 0是dbid 100是超时时间
migrate 192.168.1.2 4005 'name' 0 100
cluster setslot 5798 node targetnodeid
cluster nodes
# 目标节点上
cluster setslot 5798 node targetnodeid
cluster nodes
脚本化
sh migrate.sh node1 port1 node2 port2 slotid
将slotid从node1:port1迁移到node2:port2
如果配置了密码,在ex1 ex2快捷命令处添加-a xxx 就行
ip1=$1
port1=$2
ip2=$3
port2=$4
slotid=$5
alias ex1="redis-cli -h $ip1 -p $port1 -c"
alias ex2="redis-cli -h $ip2 -p $port2 -c"
ex1 cluster nodes > nodes.txt
id1=$(grep "$ip1:$port1" nodes.txt| awk '{print($1)}')
id2=$(grep "$ip2:$port2" nodes.txt| awk '{print($1)}')
echo $id1
echo $id2
ex1 cluster setslot $slotid migrating $id2
ex2 cluster setslot $slotid importing $id2
keys=`ex1 cluster getkeysinslot $slotid 1000 | tr '\n' ' '`
echo $keys
while [ "$keys" != " " ]
do
echo "$keys"
ex1 migrate $ip2 $port2 "" 0 100 keys $keys
keys=`ex1 cluster getkeysinslot $slotid 100 | tr '\n' ' '`
done
ex1 cluster setslot $slotid node $id2
ex2 cluster setslot $slotid node $id2
- 迁移单个key使用migrate targetip targetport 'xxx' 0 100 ;
- 迁移多个key使用migrate targetip targetport ’‘ 0 100 keys 'key1' 'key2' '...';
- 迁移的时候如果migrate失败,并且调用了cluster setslot slotid node nodeid, 就会导致数据丢失;建议将最后两行注释,迁移完之后手动确认一下数据是否迁移完了,然后执行setslot xx node nid命令。

浙公网安备 33010602011771号