天天看點

詳解叢集級備份恢複:實體細粒度備份恢複

作者:華為雲開發者聯盟

本文分享自華為雲社群《GaussDB(DWS)之實體細粒度備份恢複-雲社群-華為雲》,作者:我的橘子呢 。

認識實體細粒度備份恢複

相對于叢集級備份恢複海量的檔案備份恢複操作,實體細粒度備份能夠從更小的粒度、以更少的資料檔案操作,對單庫、單表進行備份與恢複。在實際使用過程中,資料庫叢集級的故障并非高機率事件,如何安全高效地幫助客戶備份恢複一部分資料庫元素,如schema或部分表,才是更加實際的需求,這也是細粒度備份恢複的意義所在。

實體細粒度備份以小粒度如database級、schema級、表級等為機關,對資料庫檔案進行實體備份,由于相對于叢集級粒度更小,是以也更加高效實用。目前Roach工具支援的實體細粒度備份恢複功能主要包括:schema級全量備份、schema級增量備份、從細粒度備份集恢複單表/多表、從叢集級備份集(帶細粒度參數)恢複單表或多表。這些功能基本上滿足了實際使用過程中對細粒度備份恢複的要求。實體細粒度備份恢複功能圖如圖1所示。

詳解叢集級備份恢複:實體細粒度備份恢複

圖1 細粒度備份恢複功能示意圖

了解實體細粒度備份

實體細粒度的備份能力是從Roach的基線版本繼承而來的,大部分沿用了叢集級備份的設計思路,即基本的備份流程是備份行存檔案,建立一緻性點,備份xlog、clog等檔案,最後備份列存檔案。實體細粒度備份在此基礎上需要進一步考慮以下幾個問題。

備份的資料内容

給定對應粒度備份任務如一張表,如何在備份最少資料的情況下保證恢複該表時資料的完整性?考慮該問題需要同時從備份資料小和資料完整性兩個方面考慮。備份資料量最小最理想的情況是隻備份資料庫中該表以及相關表對應的實體檔案,同時不考慮資料的拷貝檔案,也就是隻備份節點中主DN對應的資料檔案。然而從資料的完整性角度來說,隻備份表對應的實體檔案是不夠的,為了保證恢複階段能恢複到一緻性點,需要依賴xlog、clog等日志檔案,而這些檔案不能以更小的粒度劃分,是以需要全部備份。圖2列出了細粒度備份在保證資料完整性的情況下所必須備份的檔案示意圖。

詳解叢集級備份恢複:實體細粒度備份恢複

圖2 實體細粒度備份資料内容示意圖

備份集的存儲結構

現階段叢集級備份時會将資料檔案和配置檔案等壓縮進同一個備份的rch檔案中,在恢複單表時需要一起擷取回來并過濾,邏輯較為混亂。是以,為了恢複時能夠更精确地擷取檔案,細粒度備份對資料備份結構進行了進一步改造,将不同類型的檔案存儲在不同的rch檔案中,以更小的粒度對存儲結構進行了劃分。如圖3所示,行列存相關的檔案存儲在data目錄下,以database為機關進行了劃分,每個database目錄下存在row目錄和col目錄,分别對應存儲行存檔案和列存檔案。archive檔案夾儲存xlog相關檔案,xact檔案存儲clog相關檔案,gloabal檔案夾儲存資料目錄下其他檔案。

詳解叢集級備份恢複:實體細粒度備份恢複

圖3 實體細粒度備份存儲結構示意圖

備份資料相關檔案的組織形式

考慮這樣一個問題,當備份一張表時,除了備份這張表本身對應的資料檔案,我們還應該備份與這張表關聯的一些輔助表,比如列存表的cudesc表、存在變長字段對應的toast表等,隻有這樣才能保證恢複後這張表的可用性,那麼備份的時候怎麼知道該表存在哪些關聯表呢?細粒度備份采用Map檔案對表關系進行組織,對表所有的關聯表及檔案進行統一收集記錄。該資訊對于細粒度備份恢複至關重要,主要有以下兩個方面的作用:

(1)備份時:得到一張表的Map資訊,在備份行列存檔案時,按照Map中記錄的資訊,将表需要備份的相關檔案加入到需要備份的file_list中,後續備份時就可以按照該file_list進行檔案的備份,省去了檔案的掃描動作。

(2)恢複時:恢複時根據Map資訊,得到目标表相關的檔案記錄,就可以對應擷取所需的資料檔案,并根據表的元資訊建立恢複時的路徑映射關系。

Map檔案的生成是在備份行存檔案之前,各節點以主DN個數為機關,并行擷取Map資訊,分别生成自己的Map檔案。Map資訊的擷取,需要從多個level進行:

Agent –> Instance –> Database –> Schema –>Table –> RelatedRelations

在得到各表對應的Map資訊後,會按照一定的格式架構組織多層的json格式,并将對應的json資訊以schema為機關寫入到schemaname.map中,最終持久化存儲到媒體下中繼資料目錄對應的節點級根路徑中:

/roach/backup_key/map/dn_6001_6002/databasename/schemaname.map

  Map檔案對應的json存儲内容如圖4所示。

詳解叢集級備份恢複:實體細粒度備份恢複

圖4 Map檔案Json格式

備份壓縮檔案與資料檔案的映射關系

考慮細粒度恢複一張表時,如何在備份集大量的rch壓縮檔案中挑選出我們想要的表在哪些rch檔案裡。細粒度備份恢複在備份過程中會生成額外的fine_file_list資訊,每張rch檔案都有一個fine_file_list檔案與之相對應。該fine_file_list檔案記錄了對應rch檔案中儲存了哪些表,在恢複時就可以根據fine_file_list找到待恢複表涉及哪些rch檔案,精準擷取必要的rch檔案,這樣就可以大幅提升細粒度恢複的性能。

隻有行列存資料的rch檔案存在對應的fine_file_list檔案。fine_file_list儲存在節點元資訊目錄下對應的檔案夾中:

  /roach/backup_key/fine_file_list/dn_6001_6002/row/file_0_fine_list

  /roach/backup_key/fine_file_list/dn_6001_6002/col/file_0_fine_list

備份表定義導出檔案

細粒度恢複是線上進行的,在進行單表或多表恢複時需要建立出與原表定義相同的表,再進行表實體檔案的替換,這就必須知道原表的DDL元資訊。是以,在備份過程中需要同時導出各個表的DDL元資訊。實體細粒度備份恢複利用的GaussDB(DWS)自帶的gs_dump工具對表定義進行導出。由于該資訊隻用于恢複過程,是以在細粒度備份剛開始時會啟動gs_dump去導出所有的表的DDL資訊,并讓備份過程與DDL導出并行,不需要阻塞等待,減少整體實體細粒度的備份時間。DDL導出流程如圖5所示。

詳解叢集級備份恢複:實體細粒度備份恢複

圖5 導出DDL流程圖

導出的DDL資訊以schema為機關存儲在節點元資訊目錄下對應的檔案夾中:   /roach/backup_key/dumped_ddl/databasename.schemaname

實體細粒度備份整體流程

經過以上介紹,細粒度備份的關鍵步驟都已經清楚了,下面給出細粒度備份的整體流程圖,如圖6所示。

詳解叢集級備份恢複:實體細粒度備份恢複

圖6 實體細粒度備份流程圖

了解實體細粒度恢複

與叢集級恢複停止叢集進行資料覆寫的方式不同,細粒度恢複采用線上恢複的方式,該方法的核心思想就是在目前叢集中建立與原表定義完全相同的目标表,再将兩張表相關的實體檔案進行一一替換。細粒度恢複的方法能夠線上進行,對現有叢集影響較小,但同時也對恢複過程資料的控制有了更高的要求。

實體細粒度恢複的大緻流程如圖7所示。

詳解叢集級備份恢複:實體細粒度備份恢複

圖7 實體細粒度恢複流程圖

使用實體細粒度備份恢複

GaussDB(DWS)的Roach工具現階段支援schema級的實體細粒度備份,下面介紹如何發起實體細粒度備份以及如何從細粒度備份集中恢複一張表。

擷取實體細粒度備份集

Roach工具現支援schema級的細粒度備份,如下為指令行中發起schema級實體細粒度備份的指令:

詳解叢集級備份恢複:實體細粒度備份恢複

圖8 發起schema級備份

以下參數為必選參數:

  • –master-port : 程序端口号
  • –media-type : 存儲媒體
  • –media-destination : 壓縮資料存儲路徑
  • –metadata-destination : 中繼資料存儲路徑
  • –dbname : 資料庫名稱
  • –schema-list : 多schema清單檔案名,内容格式為每行一個schema名
  • –physical-fine-grained : 實體細粒度參數

其中指定schema清單時如果隻有一個schema,也可以直接使用–schemaname參數直接指定需要備份的schema名稱,此外,同時備份多個schema時,schema需要在同一個database下。

除了schema級别備份,為支援從叢集級備份集中細粒度恢複單表或多表,可以通過在叢集級指令中加入實體細粒度參數:–physical-fine-grained來生成細粒度恢複需要的Map檔案、fine_file_list資訊。如下為叢集級帶細粒度參數的指令:

詳解叢集級備份恢複:實體細粒度備份恢複

圖9 叢集級備份帶細粒度參數

需要說明的是,帶細粒度參數的叢集級備份依然是叢集級的,隻是為支援從該備份集細粒度恢複單表生成了額外的細粒度相關檔案。

從實體細粒度備份集恢複表

Roach工具現支援從細粒度備份集或(叢集級帶細粒度參數備份集)恢複單表或多表,假如目前資料庫使用者不小心删除了一張表,又不想對停止業務對整個叢集進行恢複,如果之前做過實體細粒度相關備份,備份集中有這張表,那麼細粒度恢複就是最好的選擇。細粒度恢複可以線上進行,不影響叢集的正常使用,發起細粒度恢複的指令如下:

詳解叢集級備份恢複:實體細粒度備份恢複

圖10 細粒度恢複表指令

以下參數為必選參數:

  • –clean
  • –master-port
  • –media-type
  • –media-destination
  • –metadata-destination
  • –backup-key : 恢複基于的備份集
  • –physical-fine-grained : 實體細粒度參數
  • –dbname : 資料庫名稱
  • –table-list : 待恢複表清單,格式為schemaname.tablename
  • –restore-target-list : 恢複後表清單,格式為schemaname.tablename

其中–table-list指定了需要恢複的哪些表,–restore-target-list指定了恢複後表的名稱,要求–restore-target-list的表順序與–table-list的表順序一一對應。如果要全部恢複到原表,則這兩個表清單可以指向相同檔案。兩個表清單參數對應的檔案内容格式是:每個表一行,且必須帶schema名。

總結

細粒度備份和恢複以更小的粒度對資料檔案進行了備份恢複操作。考慮到備份資料的完整性以及備份恢複的性能,細粒度備份過程增加了ddl導出、Map檔案生成等關鍵步驟,其中從資料目錄下的實體檔案資訊到Map資訊、再從Map資訊到備份的rch檔案對應的fine_file_list資訊,形成了對備份資料檔案連續的記錄鍊條。恢複過程中如果出現缺少資料的情況,可以通過對備份過程中以上所說資訊的互相對比快速定位到出現問題的環節,是以,掌握以上資訊十分關鍵,可以幫助我們更好地使用細粒度備份恢複功能。

點選關注,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲

繼續閱讀