数据备份源码流程,真正执行数据块备份到备份地址的任务线程入口在哪?

【产品名称】

【产品版本】

【问题描述】源代码中数据备份部分, RS根据租户包含的PG 生成备份数据的任务我看任务都放到了__all_tenant_pg_backup_task这个表, OBServer 并行地执行备份任务的入口在哪,没找到,谁能指点下?这些执行备份任务的线程启动的条件是什么?

我现在的理解是RS 将任务放到__all_tenant_pg_backup_task这个表, 真正执行备份任务的线程遍历这张表来获取任务并执行,执行后有将状态更新到这张表,不知道理解的对不对

另外,是否顺便给梳理下备份恢复各位置(src/rootservic/ 下 、share/backup/下、storage/下)代码分别负责的功能

大概流程是这样的:

  1. rs调度observer,生成prepare_task,并等待任务finish
  2. dag 调度 observer处理prepare_task,并生成parent 和 child task,放到dag任务队列,等待被调度
  3. 所有任务调度完成后,prepare_task调度完毕,并判断是否finish,是则结束

相关函数入口:

rs生成任务入口:ObPartGroupBackupTask::do_task()

obsever执行任务入口:ObBackupPrepareTask::process()

宏块拷贝执行任务入口:int ObMigrateCopyPhysicalTask::process()

你好,感谢,这是底层的备份任务调度, 我现在是置顶向下在了解这部分, 目的是想了解备份过程中出现故障我能根据库中内部表或视图来看任务状态和可能出现问题的地方, 我从ALTER SYSTEM BACKUP DATABASE; 这条SQL执行开始跟, 语法解析后执行,rpc调用找到int ObRootService::handle_backup_database(const obrpc::ObBackupDatabaseArg& in_arg), 然后开始调度int ObBackupScheduler::start_schedule_backup(), 到int ObRootBackup::do_tenant_backup(...),再往下跟逻辑就没太明白, 之后是在哪里开始调度observer 生成prepare task的?能否指点下,或者对于阅读代码有啥思路上的建议?c++不是太熟,可能问的比较低级,希望得到耐心解答 /\

了解备份逻辑前,先理解ob的几个执行线程以及线程入口:

1.root backup线程,ObRootBackup::run3

2.root balance线程,ObRootBalancer::run3

3.balance线程,ObRebalanceTaskMgr::run3

4.Dag调度线程,ObDagWorker::run1


由上而下执行过程

1/ 通过SQL指令执行alter system backup database

ALTER SYSTEM BACKUP DATABASE // SQL命令

    -> ObCmdExecutor::execute // 执行器

      -> ObBackupDatabaseExecutor::execute // 执行备份

        -> common_proxy->backup_database // RPC call 调度到RS


2/ RS接收到RPC后,执行:

ObRootService::handle_backup_database

 ->ObBackupScheduler::start_schedule_backup

   ->ObBackupScheduler::schedule_backup

      ->ObBackupScheduler::start_backup

        -> root_backup_->wakeup(); // 唤醒root_backup线程


3/ root backup线程被唤醒后,执行:

ObRootBackup::do_with_status

->ObRootBackup::do_scheduler

  ->ObRootBackup::do_backup 

    ->ObRootBackup::do_tenant_backup

      ->ObTenantBackup::do_backup

         ->ObTenantBackup::do_generate

           ->root_balancer_->wakeup // 唤醒root_balance 线程 


4/ root balance 被唤醒后,执行:

ObPartitionBackup::partition_backup // 执行backup

->ObPartitionBackup::backup_pg

   ->task_mgr_->add_task // 把task 加入到ObRebalanceTaskMgr调度队列


5/ balance 线程循环pop queue处理task

ObRebalanceTaskMgr::execute_task

  -> task_executor_->execute 

  // 上面的task_executor_->execute 就是 下面的ObBackupTask::execute

  ObBackupTask::execute

  ->rpc_proxy.to(dst_).backup_replica_batch

   ->ObRpcBackupReplicaBatchP::process

     ->ObService::backup_replica_batch

       -> ObPartitionService::backup_replica_batch

         ->ObPartGroupMigrator::get_instance().schedule(task_list, arg.task_id_) // 将ObGroupMigrateExecuteTask加入Dag中

     

最终由Dag调度执行备份任务

ObDagWorker::run1

-> task_->do_work()

  -> ObGroupMigrateExecuteTask::process()

    -> group_task_->do_task() //执行具体的任务,此时执行的是ObPartGroupBackupTask::do_task()


当然上述过程涉及RS以及OBServer的状态机变迁以及许多细节过程,这点您自己研究下代码

1 个赞