中止搬迁任务

假设目前要从节点A搬[slotlist] 这个集合slots 到节点B,节点A为srcNode,节点B为dstNode

搬迁启动命令

dstNode节点执行:

  1. cluster setslot importing nodeid [slotlist]

nodeid 是 srcNode在cluster nodes命令中展示的id,slotslist是需要搬迁的slots (假设现在需要从node A搬迁slot到node B,那么node Bdst Node,node Asrc Node)

注意这个nodeidsrcNode节点(当前持有slot的节点),而不是命令接受的节点。

改动后的搬迁命令执行后会返回一个对应这批搬迁任务的父任务taskid,taskid为这个dstNodenodeid加上一个递增数字。

  1. bash> redis-cli -h 127.0.0.1 -p 51002 cluster setslot importing $uuid_2 {6001..8000}
  2. "58bc041e06d52913e416fb5579fcb872ee003b53-0"
  3. bash> redis-cli -h 127.0.0.1 -p 51002 cluster setslot importing $uuid_3 {10001..12000}
  4. "58bc041e06d52913e416fb5579fcb872ee003b53-1"

在扩容场景中可能有srcNode往同一个dstNode节点搬迁,这个时候会生成多个taskid,可以在dstNode节点使用cluster setslot info命令查看,可以看到当前正在进行任务的taskid

migrate-new-command

中止一个或多个taskid任务的搬迁

dstNode或者srcNode执行下面命令,后面跟需要中止的taskid,可以加多个

  1. cluster setslot stop [taskid list]

例如

  1. cluster setslot stop 58bc041e06d52913e416fb5579fcb872ee003b53-0 58bc041e06d52913e416fb5579fcb872ee003b53-1

继续中止后的搬迁

这个时候 搬迁处于中间状态(部分成功 部分失败),这个时候如果执行搬迁启动的命令进行搬迁,那么会报错无法进行,因为某些检查会失败。

这个时候需要在dstNode节点执行下面的命令,后面跟的是停止的任务之前正在搬迁的任务slots总列表.

  1. cluster setslot restart [slotlist]

例如:

  1. bash> redis-cli -h 127.0.0.1 -p 51002 cluster setslot restart $uuid_2 {6001..8000}
  2. "58bc041e06d52913e416fb5579fcb872ee003b53-3"
  3. bash> redis-cli -h 127.0.0.1 -p 51002 cluster setslot restart $uuid_3 {10001..12000}
  4. "58bc041e06d52913e416fb5579fcb872ee003b53-4"

注意这个时候可能会报错( 类似(error) ERR:18,msg:slot in deleting task8001),原因是有的slot数据搬迁到一半中止了,这个时候dstNode节点会有脏数据需要清理,做garbageDelete操作,这里需要等脏数据清理完再进行重试即可。 默认garbageDelete是一个线程删除,这个时候可以动态调整删除线程参数(garbageDeleteThreadnum)加快清理速度。

终止当前全部任务

假如现在需要紧急中止所有搬迁任务(此时可能有多个节点往dstNode节点搬数据),为了省去查询taskid的时候,可以在dstNode执行下面的命令:

  1. cluster setslot stopall

这个时候dstNode上所有的搬迁任务都会中止,执行完后可以配合cluster setslot info查看,在dstNode节点执行running receive task num这个指标看到的值应该为0, 在srcNode 节点执行info命令看到running sender task num为0

启动当前全部任务

这个命令需要搭配stopall命令使用,假设现在 想要重启刚刚使用stopall中止的所有任务,把剩余的slot搬迁完,可以直接在dstNode执行下面的命令即可:

  1. cluster setslot restartall

同理 由于脏数据清理,可能出现失败。由于restartall可能涉及多个父任务的搬迁(每个启动命令都会产生父任务),有可能会出现部分重启成功,部分重启失败的情况, 这是因为有的任务脏数据清理完成了,有的没有完成,这个不影响最终正确性,只要稍后等脏数据清理完成再执行一次restartall命令即可。

展示当前搬迁任务

dstNode或者srcNode上执行

  1. 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: 任务失败的源节点的搬迁子任务数

migrate-new-command