博客 大数据Doris(五十六):RESOTRE数据恢复

大数据Doris(五十六):RESOTRE数据恢复

   数栈君   发表于 2023-07-06 11:51  200  0

Doris 支持将当前数据以文件的形式,通过 broker 备份到远端存储系统中。之后可以
通过 恢复 命令,从远端存储系统中将数据恢复到任意 Doris 集群。通过这个功能,Doris
可以支持将数据定期的进行快照备份。也可以通过这个功能,在不同集群间进行数据迁移。
该功能需要 Doris 版本 0.8.2+
使用该功能,需要部署对应远端存储的 broker。如 BOS、HDFS 等。可以通过 SHOW
BROKER; 查看当前部署的 broker。

3.1、简要原理说明
3.1.1 备份(Backup)
备份操作是将指定表或分区的数据,直接以 Doris 存储的文件的形式,上传到远端仓库中进行存储。当用户提交 Backup 请求后,系统内部会做如下操作:
1)快照及快照上传
快照阶段会对指定的表或分区数据文件进行快照。之后,备份都是对快照进行操作。在快照之后,对表进行的更改、导入等操作都不再影响备份的结果。快照只是对当前数据文件产生一个硬链,耗时很少。快照完成后,会开始对这些快照文件进行逐一上传。快照上传由各个 Backend 并发完成。
2)元数据准备及上传
数据文件快照上传完成后,Frontend 会首先将对应元数据写成本地文件,然后通过broker 将本地元数据文件上传到远端仓库。完成最终备份作业。

3.1.2 恢复(Restore)
恢复操作需要指定一个远端仓库中已存在的备份,然后将这个备份的内容恢复到本地集群中。当用户提交 Restore 请求后,系统内部会做如下操作:
1)在本地创建对应的元数据
这一步首先会在本地集群中,创建恢复对应的表分区等结构。创建完成后,该表可见,但是不可访问。
2)本地 snapshot
这一步是将上一步创建的表做一个快照。这其实是一个空快照(因为刚创建的表是没有数据的),其目的主要是在 Backend 上产生对应的快照目录,用于之后接收从远端仓库下载的快照文件。
3)下载快照
远端仓库中的快照文件,会被下载到对应的上一步生成的快照目录中。这一步由各个Backend 并发完成。
4)生效快照
快照下载完成后,我们要将各个快照映射为当前本地表的元数据。然后重新加载这些快照,使之生效,完成最终的恢复作业。

3.1.3 最佳实践
1)备份
当前我们支持最小分区(Partition)粒度的全量备份(增量备份有可能在未来版本支持)。
如果需要对数据进行定期备份,首先需要在建表时,合理的规划表的分区及分桶,比如按时
间进行分区。然后在之后的运行过程中,按照分区粒度进行定期的数据备份。
2)数据迁移
用户可以先将数据备份到远端仓库,再通过远端仓库将数据恢复到另一个集群,完成数
据迁移。因为数据备份是通过快照的形式完成的,所以,在备份作业的快照阶段之后的新的
导入数据,是不会备份的。因此,在快照完成后,到恢复作业完成这期间,在原集群上导入
的数据,都需要在新集群上同样导入一遍。
建议在迁移完成后,对新旧两个集群并行导入一段时间。完成数据和业务正确性校验后,再将业务迁移到新的集群。
3)重点说明
(1)备份恢复相关的操作目前只允许拥有 ADMIN 权限的用户执行。
(2)一个 Database 内,只允许有一个正在执行的备份或恢复作业。
(3)备份和恢复都支持最小分区(Partition)级别的操作,当表的数据量很大时,建议
按分区分别执行,以降低失败重试的代价。
(4)因为备份恢复操作,操作的都是实际的数据文件。所以当一个表的分片过多,或
者一个分片有过多的小版本时,可能即使总数据量很小,依然需要备份或恢复很长时间。用
户可以通过 SHOW PARTITIONS FROM table_name; 和 SHOW TABLET FROM table_name;
来查看各个分区的分片数量,以及各个分片的文件版本数量,来预估作业执行时间。文件数
量对作业执行的时间影响非常大,所以建议在建表时,合理规划分区分桶,以避免过多的分
片。
(5)当通过 SHOW BACKUP 或者 SHOW RESTORE 命令查看作业状态时。有可能
会在 TaskErrMsg 一列中看到错误信息。但只要 State 列不为 CANCELLED,则说明作业
依然在继续。这些 Task 有可能会重试成功。当然,有些 Task 错误,也会直接导致作业失
败。
(6)如果恢复作业是一次覆盖操作(指定恢复数据到已经存在的表或分区中),那么
从恢复作业的 COMMIT 阶段开始,当前集群上被覆盖的数据有可能不能再被还原。此时如
果恢复作业失败或被取消,有可能造成之前的数据已损坏且无法访问。这种情况下,只能通
过再次执行恢复操作,并等待作业完成。因此,我们建议,如无必要,尽量不要使用覆盖的
方式恢复数据,除非确认当前数据已不再使用。

3.2 备份
3.2.1 创建一个远端仓库路径
CREATE REPOSITORY `hdfs_ods_dw_backup`
WITH BROKER `broker_name`
ON LOCATION "hdfs://hadoop1:8020/tmp/doris_backup"
PROPERTIES (
"username" = "",
"password" = ""
)
1
2
3
4
5
6
7
3.2.2 执行备份
语法:

BACKUP SNAPSHOT [db_name].{snapshot_name}
TO `repository_name`
ON (
`table_name` [PARTITION (`p1`, ...)],
...
)
PROPERTIES ("key"="value", ...);
1
2
3
4
5
6
7
示例:

BACKUP SNAPSHOT test_db.backup1
TO hdfs_ods_dw_backup
ON
(
table1
);
1
2
3
4
5
6
3.2.3 查看备份任务
SHOW BACKUP [FROM db_name]
1
3.2.4 查看远端仓库镜像
语法:

SHOW SNAPSHOT ON `repo_name`
[WHERE SNAPSHOT = "snapshot" [AND TIMESTAMP =
"backup_timestamp"]];
1
2
3
示例一:查看仓库 hdfs_ods_dw_backup 中已有的备份:

SHOW SNAPSHOT ON hdfs_ods_dw_backup;
1
示例二:仅查看仓库 hdfs_ods_dw_backup 中名称为 backup1 的备份:

SHOW SNAPSHOT ON hdfs_ods_dw_backup WHERE SNAPSHOT = "backup1";
1
示例三:查看仓库 hdfs_ods_dw_backup 中名称为 backup1 的备份,时间版本为 “2021-
05-05-15-34-26” 的详细信息:

SHOW SNAPSHOT ON hdfs_ods_dw_backup
WHERE SNAPSHOT = "backup1" AND TIMESTAMP = "2021-05-05-15-34-
26";
1
2
3
9.2.5 取消备份
取消一个正在执行的备份作业语法:

CANCEL BACKUP FROM db_name;
1
示例:取消 test_db 下的 BACKUP 任务

CANCEL BACKUP FROM test_db;
1
3.3 恢复
将之前通过 BACKUP 命令备份的数据,恢复到指定数据库下。该命令为异步操作。提
交成功后,需通过 SHOW RESTORE 命令查看进度。
⚫ 仅支持恢复 OLAP 类型的表
⚫ 支持一次恢复多张表,这个需要和你对应的备份里的表一致

3.3.1 使用语法
RESTORE SNAPSHOT [db_name].{snapshot_name}
FROM `repository_name`
ON (
`table_name` [PARTITION (`p1`, ...)] [AS `tbl_alias`],
...
)
PROPERTIES ("key"="value", ...);
1
2
3
4
5
6
7
说明:
(1)同一数据库下只能有一个正在执行的 BACKUP 或 RESTORE 任务。
(2)ON 子句中标识需要恢复的表和分区。如果不指定分区,则默认恢复该表的所有分区。所指定的表和分区必须已存在于仓库备份中
(3)可以通过 AS 语句将仓库中备份的表名恢复为新的表。但新表名不能已存在于数据库中。分区名称不能修改。
(4)可以将仓库中备份的表恢复替换数据库中已有的同名表,但须保证两张表的表结构完全一致。表结构包括:表名、列、分区、Rollup 等等。
(5)可以指定恢复表的部分分区,系统会检查分区 Range 或者 List 是否能够匹配。
(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,无需再指定。

3.3.2 使用示例
1)示例一
从 example_repo 中恢复备份 snapshot_1 中的表 backup_tbl 到数据库 example_db1,
时间版本为 “2021-05-04-16-45-08”。恢复为 1 个副本:

RESTORE SNAPSHOT example_db1.`snapshot_1`
FROM `example_repo`
ON ( `backup_tbl` )
PROPERTIES
(
"backup_timestamp"="2021-05-04-16-45-08",
"replication_num" = "1"
);
1
2
3
4
5
6
7
8
2)示例二
从 example_repo 中恢复备份 snapshot_2 中的表 backup_tbl 的分区 p1,p2,以及表
backup_tbl2 到数据库 example_db1,并重命名为 new_tbl,时间版本为 “2021-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"="2021-05-04-17-11-01"
);
1
2
3
4
5
6
7
8
9
10
11
3)演示

RESTORE SNAPSHOT test_db.backup1
FROM `hdfs_ods_dw_backup`
ON
(
table1 AS table_restore
)
PROPERTIES
(
"backup_timestamp"="2022-04-01-16-45-19"
);
1
2
3
4
5
6
7
8
9
10
3.3.3 查看恢复任务
可以通过下面的语句查看数据恢复的情况

SHOW RESTORE [FROM db_name]
1
3.3.4 取消恢复
下面的语句用于取消一个正在执行数据恢复的作业:

CANCEL RESTORE FROM db_name;
1
当取消处于 COMMIT 或之后阶段的恢复左右时,可能导致被恢复的表无法访问。此时
只能通过再次执行恢复作业进行数据恢复
示例:取消 example_db 下的 RESTORE 任务。

CANCEL RESTORE FROM example_db;
1
3.4 删除远端仓库
该语句用于删除一个已创建的仓库。仅 root 或 superuser 用户可以删除仓库。这里的
用户是指 Doris 的用户 语法:

DROP REPOSITORY `repo_name`;
1
说明:
删除仓库,仅仅是删除该仓库在 Doris 中的映射,不会删除实际的仓库数据。删除后,
可以再次通过指定相同的 broker 和 LOCATION 映射到该仓库。
示例:删除名为 hdfs_ods_dw_backup 的仓库:

DROP REPOSITORY `hdfs_ods_dw_backup`;
1

免责申明:

本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群