下面的图形描述了 OceanBase 数据库物理备份的架构。
当用户用系统租户登录到备份集群以后,需要先用 SQL 发起日志归档,等日志归档发起完成启动阶段以后,才可以发起基线备份。
日志归档是定期备份到备份目的端的,只需要用户发起一次 alter system archivelog,日志备份就会在后台持续进行。日志归档是由每个 PG(PartitionGroup)的 leader 负责定期将该 PG 的日志归档到备份介质指定的路径,RS(RootService)负责定期统计日志归档的进度,并更新到内部表。
数据备份是需要用户触发的,比较常见的场景是周六触发一次全备,周二周四触发一次增量备份。当用户发起数据备份请求时,这个请求会首先被转发到 RS 所在的节点上;RS 会根据当前的租户和租户包含的 PG 生成备份数据的任务,然后把备份任务分发到 OBServer 上并行的执行备份任务;OBServer 负责备份 PG 的元信息和宏块到指定的备份目录,宏观是按照 PG 为单位管理的。
OceanBase 目前支持使用 OSS 和 NFS 两种文件系统作为备份的目的地。以下是备份功能在备份目的地创建的目录结构以及每个目录下保存的文件类型。
backup/ # 备份的根目录
└── ob1 # cluster_name
└── 1 # cluster_id
└── incarnation_1 #分身id
├── 1001 # 租户id
│ ├── clog # clog的根目录
│ │ ├── 1 # clog备份的round id
│ │ │ ├── data # 日志的数据目录
│ │ │ └── index # 日志的索引目录
│ │ └── tenant_clog_backup_info # 日志备份的元信息,按照round id分段记录
│ └── data # 数据的根目录
│ ├── backup_set_1 # 全量备份的目录
│ │ ├── backup_1 # 差异备份的目录,第一个差异备份目录是全量的meta
│ │ ├── backup_2 # 差异备份的目录。第二个差异备份的目录,meta也是全量备份的。
│ │ ├── backup_set_info # 记录了backup_set目录内的多次差异备份的信息
│ │ └── data #宏块数据的目录,包含了所有的全量和差异的宏块
│ └── tenant_data_backup_info # 记录了租户全部的数据备份信息
├── clog_info # server启动日志备份的信息
│ └── 1_100.88.110.158_12533 # 一个server一个启动日志备份信息
├── cluster_clog_backup_info # 集群级别的日志备份信息
├── cluster_data_backup_info # 集群级别的数据备份信息
├── tenant_info # 租户的信息
└── tenant_name_info #租户name和id的影射关系