在线恢复

在线恢复(Online Recovery)是一种数据恢复技术,用于在分布式文件系统中修复不一致或损坏的数据副本。与传统的离线恢复方法不同,在线恢复可以在数据节点持续写入数据的过程中进行,而不会中断或影响正常的数据处理操作。DolphinDB Online Recovery 技术仅复制副本之间差异的数据,从而减少分区数据恢复的时间。

在线恢复分异步恢复和同步恢复两个阶段进行。在异步恢复阶段,源节点仍可以正常进行读写任务。等待恢复的数据量小于 dfsSyncRecoveryChunkRowSize 配置值时,开始同步恢复。同步恢复会阻塞源节点写入,但因剩余待恢复数据量很小,在短时间内可以完成拷贝,所以对源节点的写入影响也比较小。

DolphinDB 在线恢复的完整流程如下:

  1. 当某个数据节点从故障中恢复重启后,会向控制节点汇报自己的分区信息。

  2. 控制节点收到数据节点的汇报后,判断需要进行 Recovery,会将需要 Recovery 的分区放入待 Recovery 队列。

  3. Recovery 线程从待 Recovery 队列中取出 Recovery 任务,根据收到的汇报来确定 Recovery 的源节点(数据拷贝的来源)和目标节点,并向源节点发起 Recovery 任务。

  4. 源节点收到任务后,开始一次拷贝,即从自身拷贝数据到目标节点,并接收目标节点返回的拷贝结果(数据拷贝成功或失败)。此过程异步执行,不影响数据库的正常读写。

  5. 重复步骤4,直至两个副本之间的差异小于10W行,或者拷贝次数大于5次时,源节点向控制节点发起转换为同步阶段的请求。

  6. 控制节点收到请求后,将分区状态设置为 RECOVERING,阻塞写入。由于同步节点需要拷贝的数据量比较少,因此耗时很短,对数据库的影响也很小。

  7. 源节点收到转同步成功的回复后,继续拷贝差异的数据。直到数据完全一致,源节点向控制节点汇报 Recovery 任务结束。

  8. 控制节点收到 Recovery 任务结束的报告后,更新副本状态为 COMPLETE。此时允许数据写入。

Online Recovery 只复制增量部分数据,能够有效提高恢复性能,且恢复过程不影响生产数据的写入。

以包含一个控制节点和三个数据节点的集群为例。该集群副本数为2,Datanode1 从故障中恢复。通过图示展示 Online Recovery 的过程:

为提高在线恢复的性能,DolphinDB 提供配置项 dfsRecoveryConcurrency设置恢复任务执行的并发度,同时提供配置项 recoveryWorkers设置同步恢复 Chunk 的工作线程数量(也可通过函数 resetRecoveryWorkerNum 进行动态设置)。

在在线恢复过程中,用户可通过getRecoveryTaskStatus 获取恢复任务的状态;也可通过 suspendRecovery 暂停恢复任务;通过 resumeRecovery 重启恢复任务;通过 cancelRecoveryTask 取消恢复任务。