文章目錄
- 簡要原理說明
-
- 備份
-
- 快照及快照上傳
- 中繼資料準備及上傳
- 恢複
-
- 在本地建立對應的中繼資料
- 本地snapshot
- 下載下傳快照
- 生效快照
- 最佳實踐
-
- 備份
- 資料遷移
- 重點說明
- 備份
-
- 建立一個遠端倉庫路徑
- 執行備份
- 檢視備份任務
- 檢視遠端倉庫鏡像
- 取消備份
- 恢複
-
- 使用文法
- 使用示例
-
- 示例1
- 示例2
- 檢視恢複任務
- 取消恢複
- 删除遠端倉庫
簡要原理說明
Doris支援将目前資料以檔案的形式,通過broker備份到遠端存儲系統中,之後可以通過恢複指令,從遠端存儲系統中将資料恢複到任意Doris叢集。通過這個功能,Doris支援将資料進行定期快照備份,并且在不同叢集間進行資料遷移,不過需要Doris版本0.8.2+。
使用該功能,需要部署對應的遠端存儲broker,如HDFS、BOS等,可以通過
show broker
檢視目前部署的broker。
備份
備份操作是将指定表或分區的資料,直接以Doris存儲的檔案的形式,上傳到遠端倉庫中進行存儲。當使用者送出Backup請求後,系統内部會做如下操作:
快照及快照上傳
快照階段會對指定的表或分區資料檔案進行快照,在快照之後,對表進行的更改、導入等操作都不再影響備份的結果。快照隻是對目前資料檔案産生一個硬鍊,耗時很少。快照完成後,會開始對這些快照檔案進行逐一上傳,快照上傳由各個Backend并發完成。
中繼資料準備及上傳
資料檔案快照上傳完成後,Frontend會首先将對應中繼資料寫成本地檔案,然後通過broker将本地中繼資料檔案上傳到遠端倉庫,完成最終備份作業。
恢複
恢複操作需要指定一個遠端倉庫中已存在的備份,然後将這個備份的内容恢複到本地叢集中。當使用者送出Restore請求後,系統内部會做如下操作:
在本地建立對應的中繼資料
這一步首先會在本地叢集中,建立恢複對應的表分區等結構。建立完成後,該表可見,但是不可通路。
本地snapshot
這一步是将上一步建立的表做一個快照。這其實是一個空快照(因為剛建立的表是沒有資料的),其目的主要是在Backend上産生對應的快照目錄,用于之後接收從遠端倉庫下載下傳的快照檔案。
下載下傳快照
遠端倉庫中的快照檔案,會被下載下傳到對應的上一步生成的快照目錄中,這一步由各個Backend并發完成。
生效快照
快照下載下傳完成後,我們要将各個快照映射為目前本地表的中繼資料。然後重新加載這些快照,使之生效,完成最終的恢複作業。
最佳實踐
備份
目前我們支援最小分區(Partition)粒度的全量備份(增量備份有可能在未來版本支援)。如果需要對資料進行定期備份,首先需要在建表時,合理的規劃表的分區及分桶,比如按時間進行分區。然後在之後的運作過程中,按照分區粒度進行定期的資料備份。
資料遷移
使用者可以先将資料備份到遠端倉庫,再通過遠端倉庫将資料恢複到另一個叢集,完成資料遷移。因為資料備份是通過快照的形式完成的,是以,在備份作業的快照階段之後的新的導入資料,是不會備份的。是以,在快照完成後,到恢複作業完成這期間,在原叢集上導入的資料,都需要在新叢集上同樣導入一遍。建議在遷移完成後,對新舊兩個叢集并行導入一段時間。完成資料和業務正确性校驗後,再将業務遷移到新的叢集。
重點說明
- 備份恢複相關的操作目前隻允許擁有ADMIN權限的使用者執行。
- 一個Database 内,隻允許有一個正在執行的備份或恢複作業。
- 備份和恢複都支援最小分區(Partition)級别的操作,當表的資料量很大時,建議按分區分别執行,以降低失敗重試的代價。
- 因為備份恢複操作,操作的都是實際的資料檔案。是以當一個表的分片過多,或者一個分片有過多的小版本時,可能即使總資料量很小,依然需要備份或恢複很長時間。使用者可以通過
和SHOW PARTITIONS FROM table_name;
來檢視各個分區的分片數量,以及各個分片的檔案版本數量,來預估作業執行時間。檔案數量對作業執行的時間影響非常大,是以建議在建表時,合理規劃分區分桶,以避免過多的分片。SHOW TABLET FROM table_name;
- 當通過
或者SHOW BACKUP
指令檢視作業狀态時,有可能會在SHOW RESTORE
一列中看到錯誤資訊。但隻要TaskErrMsg
列不為State
,則說明作業依然在繼續。這些Task有可能會重試成功,當然,有些Task錯誤,也會直接導緻作業失敗。CANCELLED
- 如果恢複作業是一次覆寫操作(指定恢複資料到已經存在的表或分區中),那麼從恢複作業的COMMIT階段開始,目前叢集上被覆寫的資料有可能不能再被還原。此時如果恢複作業失敗或被取消,有可能造成之前的資料已損壞且無法通路。這種情況下,隻能通過再次執行恢複操作,并等待作業完成。是以,我們建議,如無必要,盡量不要使用覆寫的方式恢複資料,除非确認目前資料已不再使用。
備份
建立一個遠端倉庫路徑
CREATE REPOSITORY `hdfs_ods_dw_backup`
WITH BROKER `broker_name`
ON LOCATION "hdfs://scentos:8020/tmp/doris_backup"
PROPERTIES (
"username" = "",
"password" = ""
);
執行備份
文法:
BACKUP SNAPSHOT [db_name].{snapshot_name}
TO `repository_name`
ON (
`table_name` [PARTITION (`p1`, ...)],
...
)
PROPERTIES ("key"="value", ...);
示例:
BACKUP SNAPSHOT test.backup1
TO hdfs_ods_dw_backup
ON
(
table1
);
檢視備份任務
文法:
示例:
mysql> show backup;
+-------+--------------+--------+----------+-------------------------------+---------------------+----------------------+---------------------+---------------------+-----------------+----------+------------+--------+---------+
| JobId | SnapshotName | DbName | State | BackupObjs | CreateTime | SnapshotFinishedTime | UploadFinishedTime | FinishedTime | UnfinishedTasks | Progress | TaskErrMsg | Status | Timeout |
+-------+--------------+--------+----------+-------------------------------+---------------------+----------------------+---------------------+---------------------+-----------------+----------+------------+--------+---------+
| 14289 | backup1 | test | FINISHED | [default_cluster:test.table1] | 2022-05-17 16:23:00 | 2022-05-17 16:23:03 | 2022-05-17 16:23:12 | 2022-05-17 16:23:19 | | | | [OK] | 86400 |
+-------+--------------+--------+----------+-------------------------------+---------------------+----------------------+---------------------+---------------------+-----------------+----------+------------+--------+---------+
1 row in set (0.01 sec)
檢視遠端倉庫鏡像
文法:
示例1,檢視倉庫hdfs_ods_dw_backup中已有備份:
mysql> SHOW SNAPSHOT ON hdfs_ods_dw_backup;
+----------+---------------------+--------+
| Snapshot | Timestamp | Status |
+----------+---------------------+--------+
| backup1 | 2022-05-17-16-23-00 | OK |
+----------+---------------------+--------+
1 row in set (0.02 sec)
示例2,檢視倉庫hdfs_ods_dw_backup中名稱為backup1的備份:
mysql> SHOW SNAPSHOT ON hdfs_ods_dw_backup where snapshot = 'backup1';
+----------+---------------------+--------+
| Snapshot | Timestamp | Status |
+----------+---------------------+--------+
| backup1 | 2022-05-17-16-23-00 | OK |
+----------+---------------------+--------+
1 row in set (0.26 sec)
取消備份
前提是備份作業正在進行,文法:
示例:
恢複
将之前通過
BACKUP
指令備份的資料,恢複到指定資料庫下。該指令為異步操作。送出成功後,需通過
SHOW RESTORE
指令檢視進度。
- 僅支援恢複 OLAP 類型的表
- 支援一次恢複多張表,這個需要和你對應的備份裡的表一緻。
使用文法
RESTORE SNAPSHOT [db_name].{snapshot_name}
FROM `repository_name`
ON (
`table_name` [PARTITION (`p1`, ...)] [AS `tbl_alias`],
...
)
PROPERTIES ("key"="value", ...);
說明:
- 同一資料庫下隻能有一個正在執行的BACKUP或RESTORE任務。
-
子句中辨別需要恢複的表和分區。如果不指定分區,則預設恢複該表的所有分區。所指定的表和分區必須已存在于倉庫備份中ON
- 可以通過
語句将倉庫中備份的表名恢複為新的表,但新表名不能已存在于資料庫中。分區名稱不能修改。AS
- 可以将倉庫中備份的表恢複替換資料庫中已有的同名表,但須保證兩張表的表結構完全一緻。表結構包括:表名、列、分區、Rollup等等。
- 可以指定恢複表的部分分區,系統會檢查分區Range或者List是否能夠比對。
- PROPERTIES目前支援以下屬性:
-
:指定了恢複對應備份的哪個時間版本,必填。該資訊可以通過"backup_timestamp" = "2018-05-04-16-45-08"
語句獲得。SHOW SNAPSHOT ON repo;
-
:指定恢複的表或分區的副本數。預設為 3。若恢複已存在的表或分區,則副本數必須和已存在表或分區的副本數相同。同時,必須有足夠的host容納多個副本。"replication_num" = "3"
-
:任務逾時時間,預設為一天。機關秒。"timeout" = "3600"
-
:使用指定的meta_version來讀取之前備份的中繼資料。注意,該參數作為臨時方案,僅用于恢複老版本Doris備份的資料。最新版本的備份資料中已經包含"meta_version" = 40
,無需再指定。meta version
-
使用示例
示例1
從hdfs_ods_dw_backup中恢複備份backup1裡的表table1到資料庫example,時間版本為2022-05-17-16-23-00:
RESTORE SNAPSHOT example.`backup1`
FROM `hdfs_ods_dw_backup`
ON ( `table1` )
PROPERTIES
(
"backup_timestamp"="2022-05-17-16-23-00",
"replication_num" = "1"
);
運作結果:
mysql> create database example;
Query OK, 0 rows affected (0.00 sec)
mysql> RESTORE SNAPSHOT example.`backup1`
-> FROM `hdfs_ods_dw_backup`
-> ON ( `table1` )
-> PROPERTIES
-> (
-> "backup_timestamp"="2022-05-17-16-23-00",
-> "replication_num" = "1"
-> );
Query OK, 0 rows affected (0.54 sec)
示例2
從hdfs_ods_dw_backup中恢複備份backup1裡的表table1到資料庫example,并重命名為table_r,時間版本為2022-05-17-16-23-00:
RESTORE SNAPSHOT example.`backup1`
FROM `hdfs_ods_dw_backup`
ON ( `table1` AS `table_r` )
PROPERTIES
(
"backup_timestamp"="2022-05-17-16-23-00",
"replication_num" = "1"
);
運作結果:
mysql> RESTORE SNAPSHOT example.`backup1`
-> FROM `hdfs_ods_dw_backup`
-> ON ( `table1` AS `table_r` )
-> PROPERTIES
-> (
-> "backup_timestamp"="2022-05-17-16-23-00",
-> "replication_num" = "1"
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> select * from example.table_r;
+--------+----------+--------------+------+
| siteid | citycode | username | pv |
+--------+----------+--------------+------+
| 3 | 2 | tom | 2 |
| 4 | 3 | bush | 3 |
| 99 | 99 | haha | 5 |
| 2 | 1 | grace | 2 |
| 11 | 3 | hehe | 9 |
| 11 | 3 | heihei | 10 |
| 11 | 21 | szc | 2 |
| 11 | 23 | haha | 8 |
| 5 | 3 | helen | 3 |
| 1 | 1 | jim | 2 |
| 22 | NULL | wuyanzu | 3 |
| 33 | 3 | flink-stream | 3 |
+--------+----------+--------------+------+
12 rows in set (0.10 sec)
檢視恢複任務
文法:
取消恢複
取消一個正在執行的資料恢複作業:
當取消處于commit或之後階段的恢複作業時,可能導緻被恢複的表無法通路,此時隻能再次執行恢複作業進行資料恢複。
删除遠端倉庫
删除一個已建立的遠端倉庫,隻有doris裡的root或superuser才能執行:
注意,這裡的删除倉庫隻是删除該倉庫再doris中的映射,不會删除實際的倉庫資料。删除後,可以再次通過指定相同的broker和location映射到該倉庫。
示例,删除hdfs_ods_dw_backup倉庫:
mysql> DROP REPOSITORY `hdfs_ods_dw_backup`;
Query OK, 0 rows affected (0.01 sec)