中止搬迁任务
假设目前要从节点A搬[slotlist] 这个集合slots 到节点B,节点A为srcNode
,节点B为dstNode
搬迁启动命令
在dstNode
节点执行:
cluster setslot importing nodeid [slotlist]
nodeid 是 srcNode在cluster nodes
命令中展示的id,slotslist
是需要搬迁的slots
(假设现在需要从node A
搬迁slot到node B
,那么node B
是dst Node
,node A
是src Node
)
注意这个nodeid
是srcNode
节点(当前持有slot的节点),而不是命令接受的节点。
改动后的搬迁命令执行后会返回一个对应这批搬迁任务的父任务taskid
,taskid
为这个dstNode
的nodeid
加上一个递增数字。
bash> redis-cli -h 127.0.0.1 -p 51002 cluster setslot importing $uuid_2 {6001..8000}
"58bc041e06d52913e416fb5579fcb872ee003b53-0"
bash> redis-cli -h 127.0.0.1 -p 51002 cluster setslot importing $uuid_3 {10001..12000}
"58bc041e06d52913e416fb5579fcb872ee003b53-1"
在扩容场景中可能有srcNode
往同一个dstNode
节点搬迁,这个时候会生成多个taskid
,可以在dstNode
节点使用cluster setslot info
命令查看,可以看到当前正在进行任务的taskid
中止一个或多个taskid任务的搬迁
在dstNode
或者srcNode
执行下面命令,后面跟需要中止的taskid
,可以加多个
cluster setslot stop [taskid list]
例如
cluster setslot stop 58bc041e06d52913e416fb5579fcb872ee003b53-0 58bc041e06d52913e416fb5579fcb872ee003b53-1
继续中止后的搬迁
这个时候 搬迁处于中间状态(部分成功 部分失败),这个时候如果执行搬迁启动的命令进行搬迁,那么会报错无法进行,因为某些检查会失败。
这个时候需要在dstNode
节点执行下面的命令,后面跟的是停止的任务之前正在搬迁的任务slots总列表.
cluster setslot restart [slotlist]
例如:
bash> redis-cli -h 127.0.0.1 -p 51002 cluster setslot restart $uuid_2 {6001..8000}
"58bc041e06d52913e416fb5579fcb872ee003b53-3"
bash> redis-cli -h 127.0.0.1 -p 51002 cluster setslot restart $uuid_3 {10001..12000}
"58bc041e06d52913e416fb5579fcb872ee003b53-4"
注意这个时候可能会报错( 类似(error) ERR:18,msg:slot in deleting task8001
),原因是有的slot数据搬迁到一半中止了,这个时候dstNode节点会有脏数据需要清理,做garbageDelete
操作,这里需要等脏数据清理完再进行重试即可。 默认garbageDelete
是一个线程删除,这个时候可以动态调整删除线程参数(garbageDeleteThreadnum
)加快清理速度。
终止当前全部任务
假如现在需要紧急中止所有搬迁任务(此时可能有多个节点往dstNode
节点搬数据),为了省去查询taskid
的时候,可以在dstNode
执行下面的命令:
cluster setslot stopall
这个时候dstNode
上所有的搬迁任务都会中止,执行完后可以配合cluster setslot info
查看,在dstNode
节点执行running receive task num
这个指标看到的值应该为0, 在srcNode 节点执行info命令看到running sender task num
为0
启动当前全部任务
这个命令需要搭配stopall
命令使用,假设现在 想要重启刚刚使用stopall
中止的所有任务,把剩余的slot搬迁完,可以直接在dstNode
执行下面的命令即可:
cluster setslot restartall
同理 由于脏数据清理,可能出现失败。由于restartall
可能涉及多个父任务的搬迁(每个启动命令都会产生父任务),有可能会出现部分重启成功,部分重启失败的情况, 这是因为有的任务脏数据清理完成了,有的没有完成,这个不影响最终正确性,只要稍后等脏数据清理完成再执行一次restartall
命令即可。
展示当前搬迁任务
在dstNode
或者srcNode
上执行
cluster setslot info
在dstNode
上执行该命令,能够看到接收方搬迁的slots
状态:
- importing taskid: 当前dstNode上搬迁的taskid 以及运行的时间
- importing slots: 正在搬迁的slots
- success import slots: 已完成的搬迁slots
- fail import slots: 搬迁失败的slots
- running receive task num: 运行的目标节点的搬迁子任务数
- sucesss receive task num: 任务成功的目标节点的搬迁子任务数
- fail receive task num: 任务失败的目标节点的搬迁子任务数
在srcNode
上执行该命令,能够看到发送方搬迁的slots
状态
- migrating taskid: 当前srcNode上在搬迁的taskid 以及运行的时间
- migrating slots: 正在搬迁的slots
- success migrate slots: 已完成的搬迁slots
- fail migrate slots: 搬迁失败的slots
- running sender task num: 运行的源节点节点的搬迁子任务数
- success sender task num: 任务成功的源节点的搬迁子任务数
- fail sender task num: 任务失败的源节点的搬迁子任务数