备份与恢复
备份恢复功能主要用于快速的将集群快照备份到远端存储上,并且在需要的时候可以快速的从备份的数据中恢复。
不同于 数据导出 功能,备份功能是直接将数据文件拷贝到远端存储上,因此从整体速度上说优于导出功能,但备份的数据只能用于 Doris 自身的恢复功能,而导出的数据可以被其他系统读取和利用。
基本概念
-
仓库(Repository)
在进行备份恢复操作前,用户需要先创建一个仓库(Repository)。仓库是一个远端存储系统上的目录在 Doris 中的映射。备份操作会将数据上传到这个路径中,而恢复操作则是从这个路径中下载数据。
Doris 支持创建和删除仓库。具体帮助可参阅 CREATE REPOSITORY 以及 DROP REPOSITORY 命令手册。通过 SHOW REPOSITORIES 命令可以查看已经创建好的仓库。
-
备份(Backup)
备份操作可以以最小分区粒度,直接以 Doris 存储的文件的形式,上传到远端仓库中进行存储。当用户提交 Backup 请求后,系统内部会做如下操作:
-
快照及快照上传
快照阶段会对指定的表或分区数据文件进行快照。之后,备份都是对快照进行操作。在快照之后,对表进行的更改、导入等操作都不再影响备份的结果。快照只是对当前数据文件产生一个硬链,耗时很少。快照完成后,会开始对这些快照文件进行逐一上传。快照上传由各个 Compute Node 节点并发完成。
-
元数据准备及上传
数据文件快照上传完成后,Leader Node 节点会首先将对应元数据写成本地文件,然后将本地元数据文件上传到远端仓库。完成最终备份作业。
关于备份的具体操作,可以参阅 BACKUP 语法手册。备份操作是一个异步操作,可以通过 SHOW BACKUP 命令查看操作进度。同时,可以通过 CANCEL BACKUP 命令取消一个正在运行的备份操作。
-
-
恢复(Restore)
恢复操作需要指定一个远端仓库中已存在的备份,然后将这个备份的内容恢复到本地集群中。当用户提交 Restore 请求后,系统内部会做如下操作:
-
在本地创建对应的元数据
这一步首先会在本地集群中,创建恢复对应的表分区等结构。创建完成后,该表可见,但是不可访问。
-
下载快照
下载远端仓库中的快照文件到各自对应的 Compute Node 节点上。
-
生效快照
快照下载完成后,我们要将各个快照映射为当前本地表的元数据。然后重新加载这些快照,使之生效,完成最终的恢复作业。
关于恢复的具体操作,可以参阅 RESTORE 语法手册。恢复操作是一个异步操作,可以通过 SHOW-RESTORE 命令查看操作进度。同时,可以通过 CANCEL RESTORE 命令取消一个正在运行的恢复操作。
-
操作示例
我们通过一个完整示例展示如果通过备份恢复操作,将 A 集群的数据迁移至 B 集群。
-
在 A 集群创建仓库
CREATE REPOSITORY `bos_repo` WITH BROKER `bos` ON LOCATION "bos://my_bucket/doris_backup" PROPERTIES ( "bos_endpoint" = "http://bj.bcebos.com", "bos_accesskey" = "xxxxxxxxxxxxxxxxxx", "bos_secret_accesskey"="yyyyyyyyyyyyyyy" );
创建一个名为
bos_repo
的仓库,指向doris_backup
目录。更多详细帮助,请参阅 CREATE REPOSITORY。 -
在 A 集群进行备份数据操作
BACKUP SNAPSHOT example_db.snapshot1 TO `bos_repo` ON ( example_tbl PARTITION (p1,p2), example_tbl2 );
指定
example_db
库中的example_tbl
表的两个分区,以及example_tbl2
表进行备份。备份到bos_repo
这个仓库中。本次备份的名称为snapshot1
。关于备份操作的更多详细帮助,请参阅 BACKUP。备份操作是一个异步命令,具体进度须通过 SHOW BACKUP 命令查看。当返回结果中的
State
字段为 FINISHED,即表示备份完成。 -
在 B 集群创建相同的仓库:
CREATE REPOSITORY `bos_repo` WITH BROKER `bos` ON LOCATION "bos://my_bucket/doris_backup" PROPERTIES ( "bos_endpoint" = "http://bj.bcebos.com", "bos_accesskey" = "xxxxxxxxxxxxxxxxxx", "bos_secret_accesskey"="yyyyyyyyyyyyyyy" );
-
在 B 集群查看仓库中的备份快照
SHOW SNAPSHOT ON `bos_repo`;
更多帮助,可以查看 SHOW SNAPSHOT 语法手册。
-
在 B 集群执行恢复数据操作
RESTORE SNAPSHOT example_db.`snapshot1` FROM `bos_repo` ON ( `example_tbl2` ) PROPERTIES ( "backup_timestamp"="2020-05-04-16-45-08", "replication_num" = "1" );
指定
bos_repo
中名称为snapshot1
的备份数据,选择恢复其中的example_tbl2
表。每个备份数据都有一个时间戳(backup_timestamp
),需要显示指定。同时这里我们指定只恢复一个副本。恢复操作也是一个异步命令,具体进度须通过 SHOW RESTORE 命令查看。当返回结果中的
State
字段为 FINISHED,即表示恢复完成。
最佳实践
备份
当前我们支持最小分区(Partition)粒度的全量备份。如果需要对数据进行定期备份,首先需要在建表时,合理的规划表的分区及分桶,比如按时间进行分区。然后在之后的运行过程中,按照分区粒度进行定期的数据备份。
通过按分区粒度进行备份,可以起到增量备份的目的。
数据迁移
用户可以先将数据备份到远端仓库,再通过远端仓库将数据恢复到另一个集群,完成数据迁移。因为数据备份是通过快照的形式完成的,所以,在备份作业的快照阶段之后的新的导入数据,是不会备份的。因此,在快照完成后,到恢复作业完成这期间,在原集群上导入的数据,都需要在新集群上同样导入一遍。
建议在迁移完成后,对新旧两个集群并行导入一段时间。完成数据和业务正确性校验后,再将业务迁移到新的集群。