Doris数据备份与恢复
目录
Doris 支持将当前数据以文件的形式,通过 broker 备份到远端存储系统中,之后可以通过 恢复 命令,从远端存储系统中将数据恢复到任意 Doris 集群。
通过这个功能,可以达到两个目的:
- 数据备份:Doris 可以支持将数据定期的进行快照备份
- 数据迁移:Doris 可以根据数据备份的快照将数据恢复到新表或不同集群间的表
一、基本原理
备份(Backup)
备份操作是将指定表或分区的数据,直接以 Doris 存储的文件的形式,上传到远端仓库中进行存储。Backup命令为异步操作,提交成功后需要通过 SHOW BACKUP 命令查看进度,仅支持备份 OLAP 类型的表。
当用户提交 Backup 请求后,系统内部会做如下操作:
1、快照及快照上传
快照阶段会对指定的表或分区数据文件进行快照,之后,备份都是对快照进行操作。在快照之后,对表进行的更改、导入等操作都不再影响备份的结果。快照只是对当前数据文件产生一个硬链,耗时很少。快照完成后,会开始对这些快照文件进行逐一上传,快照上传由各个 Backend 并发完成。
2、元数据准备及上传
数据文件快照上传完成后,FE 会首先将对应元数据写成本地文件,然后通过 broker 将本地元数据文件上传到远端仓库,完成最终备份作业。
恢复(Restore)
恢复操作需要指定一个远端仓库中已存在的备份,然后将这个备份的内容恢复到本地集群中,RESTORE 命令为异步操作,提交成功后,需通过 SHOW RESTORE 命令查看进度,仅支持恢复 OLAP 类型的表。
当用户提交 Restore 请求后,系统内部会做如下操作:
1、在本地创建对应的元数据
这一步首先会在本地集群中,创建恢复对应的表分区等结构,创建完成后,该表可见,但是不可访问。
2、本地snapshot
这一步是将上一步创建的表做一个快照。这其实是一个空快照(因为刚创建的表是没有数据的),其目的主要是在 Backend 上产生对应的快照目录,用于之后接收从远端仓库下载的快照文件。
3、下载快照
远端仓库中的快照文件,会被下载到对应的上一步生成的快照目录中。这一步由各个 Backend 并发完成。
4、生效快照
快照下载完成后,我们要将各个快照映射为当前本地表的元数据。然后重新加载这些快照,使之生效,完成最终的恢复作业。
二、应用实例
1、创建远程仓库
创建一个远端仓库路径,用于备份或恢复,该命令需要借助 Broker 进程访问远端存储,仅 root 或 superuser 用户可以创建仓库,创建过了就不需要再创建。
实例:创建一个名为hdfs_repo的仓库,依赖与hdfs,数据根目录为hdfs://zjyprc-hadoop-5/user/h_miui_ad/ad_bi/doris_data_backup
CREATE REPOSITORY `hdfs_repo`
WITH BROKER `hdfs_broker`
ON LOCATION "hdfs://zjy/user/h_miui_ad/ad_bi/hdfs_broker"
PROPERTIES
(
"username" = "user",
"password" = "password"
);
2、备份BACKUP
语法:
BACKUP SNAPSHOT [db_name].{snapshot_name}
TO `repository_name`
ON (
`table_name` [PARTITION (`p1`, ...)],
...
)
PROPERTIES ("key"="value", ...);
说明:
1). 同一数据库下只能有一个正在执行的 BACKUP 或 RESTORE 任务。
2). ON 子句中标识需要备份的表和分区,如果不指定分区,则默认备份该表的所有分区。
3). PROPERTIES 目前支持以下属性:
"type" = "full":表示这是一次全量更新(默认)。
"timeout" = "3600":任务超时时间,默认为一天,单位秒。
Examples:
1. 全量备份 example_db 下的表 example_tbl 到仓库 example_repo 中:
BACKUP SNAPSHOT example_db.snapshot_label1
TO example_repo
ON (example_tbl)
PROPERTIES ("type" = "full");
2. 全量备份 example_db 下,表 example_tbl 的 p1, p2 分区,以及表 example_tbl2 到仓库 example_repo 中:
BACKUP SNAPSHOT example_db.snapshot_label2
TO example_repo
ON
(
example_tbl PARTITION (p1,p2),
example_tbl2
);
3、SHOW BACKUP
查看最近一次 backup 作业的执行情况(完整信息可以使用Mysql Client 运行 HELP SHOW BACKUP):
- JobId:本次备份作业的 id。
- SnapshotName:用户指定的本次备份作业的名称(Label)。
- DbName:备份作业对应的 Database。
- State:备份作业当前所在阶段:
- PENDING:作业初始状态。
- SNAPSHOTING:正在进行快照操作。
- UPLOAD_SNAPSHOT:快照结束,准备上传。
- UPLOADING:正在上传快照。
- SAVE_META:正在本地生成元数据文件。
- UPLOAD_INFO:上传元数据文件和本次备份作业的信息。
- FINISHED:备份完成。
- CANCELLED:备份失败或被取消。
4、SHOW SNAPSHOT
查看远端仓库中已存在的备份。
如执行 SHOW SNAPSHOT ON `doris_data_bakup_repo` :
5、恢复 RESTORE
语法:
RESTORE SNAPSHOT [db_name].{snapshot_name}
FROM `repository_name`
ON (
`table_name` [PARTITION (`p1`, ...)] [AS `tbl_alias`],
...
)
PROPERTIES ("key"="value", ...);
说明:
1. 同一数据库下只能有一个正在执行的 BACKUP 或 RESTORE 任务。
2. ON 子句中标识需要恢复的表和分区,如果不指定分区,则默认恢复该表的所有分区。所指定的表和分区必须已存在于仓库备份中。
3. 可以通过 AS 语句将仓库中备份的表名恢复为新的表,但新表名不能已存在于数据库中,分区名称不能修改。
4. 可以将仓库中备份的表恢复替换数据库中已有的同名表,但须保证两张表的表结构完全一致。表结构包括:表名、列、分区、Rollup等等。
5. 可以指定恢复表的部分分区,系统会检查分区 Range 是否能够匹配。
6. PROPERTIES 目前支持以下属性:
- "backup_timestamp" = "2018-05-04-16-45-08":指定了恢复对应备份的哪个时间版本,必填。该信息可以通过`SHOW SNAPSHOT ON repo;` 语句获得。
- "replication_num" = "3":指定恢复的表或分区的副本数。默认为3。若恢复已存在的表或分区,则副本数必须和已存在表或分区的副本数相同。同时,必须有足够的 host 容纳多个副本。
- "timeout" = "3600":任务超时时间,默认为一天,单位秒。
- "meta_version" = 40:使用指定的 meta_version 来读取之前备份的元数据。注意,该参数作为临时方案,仅用于恢复老版本 Doris 备份的数据。最新版本的备份数据中已经包含 meta version,无需再指定。
Examples:
1. 从 example_repo 中恢复备份 snapshot_1 中的表 backup_tbl 到数据库 example_db1,时间版本为 "2018-05-04-16-45-08"。恢复为 1 个副本:
RESTORE SNAPSHOT example_db1.`snapshot_1`
FROM `example_repo`
ON ( `backup_tbl` )
PROPERTIES
(
"backup_timestamp"="2018-05-04-16-45-08",
"replication_num" = "1"
);
2.从 example_repo 中恢复备份 snapshot_2 中的表 backup_tbl 的分区 p1,p2,以及表 backup_tbl2 到数据库 example_db1,并重命名为 new_tbl,时间版本为 "2018-05-04-17-11-01"。默认恢复为 3 个副本:
RESTORE SNAPSHOT example_db1.`snapshot_2`
FROM `example_repo`
ON
(
`backup_tbl` PARTITION (`p1`, `p2`),
`backup_tbl2` AS `new_tbl`
)
PROPERTIES
(
"backup_timestamp"="2018-05-04-17-11-01"
);
6、SHOW RESTORE
查看最近一次 restore 作业的执行情况。
State:恢复作业当前所在阶段:
- PENDING:作业初始状态。
- SNAPSHOTING:正在进行本地新建表的快照操作。
- DOWNLOAD:正在发送下载快照任务。
- DOWNLOADING:快照正在下载。
- COMMIT:准备生效已下载的快照。
- COMMITTING:正在生效已下载的快照。
- FINISHED:恢复完成。
- CANCELLED:恢复失败或被取消。
7、CANCEL BACKUP
取消当前正在执行的备份作业。
8、CANCEL RESTORE
取消当前正在执行的恢复作业。
9、DROP REPOSITORY
删除已创建的远端仓库。删除仓库,仅仅是删除该仓库在 Doris 中的映射,不会删除实际的仓库数据。
三、注意事项
- 备份恢复相关的操作目前只允许拥有 ADMIN 权限的用户执行。
- 一个 Database 内,只允许有一个正在执行的备份或恢复作业。
- 备份和恢复都支持最小分区(Partition)级别的操作,当表的数据量很大时,建议按分区分别执行,以降低失败重试的代价。
- 因为备份恢复操作,操作的都是实际的数据文件,所以当一个表的分片过多,或者一个分片有过多的小版本时,可能即使总数据量很小,依然需要备份或恢复很长时间。用户可以通过
SHOW PARTITIONS FROM table_name
和SHOW TABLET FROM table_name
来查看各个分区的分片数量,以及各个分片的文件版本数量,来预估作业执行时间。文件数量对作业执行的时间影响非常大,所以建议在建表时,合理规划分区分桶,以避免过多的分片。 - 当通过
SHOW BACKUP
或者SHOW RESTORE
命令查看作业状态时,有可能会在TaskErrMsg
一列中看到错误信息,但只要State
列不为CANCELLED
,则说明作业依然在继续,这些 Task 有可能会重试成功。当然,有些 Task 错误,也会直接导致作业失败。
本文地址:https://blog.csdn.net/weixin_43161811/article/details/107385883
上一篇: 外星人都认为不好惹的人,等笑话
下一篇: 浅谈Java泛型及泛型的使用