天天看點

Doris學習筆記之備份與恢複簡要原理說明備份恢複删除遠端倉庫

文章目錄

  • 簡要原理說明
    • 備份
      • 快照及快照上傳
      • 中繼資料準備及上傳
    • 恢複
      • 在本地建立對應的中繼資料
      • 本地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

    列不為

    CANCELLED

    ,則說明作業依然在繼續。這些Task有可能會重試成功,當然,有些Task錯誤,也會直接導緻作業失敗。
  • 如果恢複作業是一次覆寫操作(指定恢複資料到已經存在的表或分區中),那麼從恢複作業的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", ...);
           

說明:

  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

      ,無需再指定。

使用示例

示例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)
           

繼續閱讀