关于 OBServer 启动过程中,停机时间长,再次启动之后补齐 SSTable 基线数据的问题

【 使用环境 】测试环境
【 组件 】OBServer
【 使用版本 】3.1.5
【 问题描述 】

我在研究 OB 启动流程代码,查看资料时,看到 OBCP 的 PPT 里,关于 OBServer 服务启动恢复逻辑,有这么 2 句话:

  1. 停机时间短(分钟或者小时级别),一般只追齐 clog

  2. 停机时间长(天级别),clog 落后太多,会直接追齐 ssd 基线数据,然后补齐合并版本后的 clog

第 1 句话能理解,停机后,OBServer 实例再次启动时,需要同步 leader 的 clog 日志到本机,从 clog 回放数据到 memtable。

第 2 句话,停机时间长(天级别),我的理解是:停机时间没有超过 server_permanent_offline_time,但是停机 >= 1 天,导致 clog 落后 leader 太多,如果从 leader 同步 clog 到本机再回放,由于 clog 可能会很多,回放时间长,所以会选择直接追齐 SSTable 基线数据。

关于追齐基线数据,有 2 个问题:

  1. 这个指的是追齐 Major SSTable,还是 Minor SSTable、Mini SSTable,或者有一套复杂的逻辑?这块逻辑的代码入口、关键方法或函数是哪些呢?

  2. 追齐基线数据由哪个线程负责执行,代码入口、关键方法或函数是哪些呢?(我找了 migration、restore 相关的类,只找到了 alter system replica … 等语句的实现逻辑,没找到启动过程中补齐基线数据的逻辑)

请 OB 的研发大佬们帮忙解答下上面 2 个问题,多谢!

已路由给相关同学

看问题描述可能你关心的是重启恢复的流程, 这个路径是不会有补齐sstable的动作, 重启过程只会加载本地数据, 启动后如果发现clog落后过多, RS节点会调度补副本任务, 这个时候会从其它副本拉取基线数据和转储数据到本地

是的,我关心的是重启恢复流程,clog 落后过多,RS 调度执行补副本任务这个逻辑就比较容易理解了,感谢大佬,解决了我的疑问。

另外,基于大佬的回答,我有另一个问题:
一个 OBServer 实例停止之后,如果不再启动,RS 会在多长时间之后调度其它 OBServer 实例补副本呢?

https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001697241 由server_permanent_offline_time决定,可以看下这个文档

好的,多谢大佬