作為mysql數據的分佈式大型集群替代,TiDB被越來越多企業在生產中使用。作為一個超大的數據庫集群,對TB集合數據的備份和還原是一個難點和挑戰。最近TiDB官方在4.0 RC版本中新增加了一個數據備份和還原工具BR,用來實現對超大規模(10TB)數據的高速備份和還原,可以將備份還原速度提高到1GB/s甚至更高。本文蟲蟲就給大家介紹這個高性能備份還原工具BR。
概述
TiDB是一個與MySQL高度兼容的開放源代碼的NewSQL數據庫,支持混合事務處理/分析處理(HTAP)工作負載。對於大型TiDB集群而言,備份和還原長期以來一直是一個具有挑戰性的問題。由於數據分佈在不同的節點中,因此TiDB沒有一致的物理快照。
Mysdumper和myloader是MySQL數據中最常用的數據備份和還原工具。TiDB和MySQL協議兼容,所以TiDB中也使用他們進行備份和還原。但是對超大的TiDB集群mydumper不適用存在嚴重的短板:mydumper無法合理利用群集資源來提高備份速度。因此會嚴重影響應用程序請求甚至會導致TiDB的內存不足(OOM)錯誤。
根據實踐中的測試數據。TiDB Loader恢復1 TB的數據大約需要19個小時。很明顯,這樣的速度不能滿足日常數據高效恢復的需求。
因此,儘管可以使用mydumper和Loader做數據備份和恢復,但他們在對待大規模數據時候,已經完全不適應生產需求。因此,TiDB新引入了備份和還原工具BR。
主要原理
BR是用於快速分佈式備份和還原TiDB群集數據的命令行工具。與mydumper和Loader相比,BR更適合於TB級別的大規模TiDB數據集。
TiDB的經典體系架構如下圖
在TiDB平臺內部,主要組件如下:
TiDB Server是無狀態SQL層。
TiKV服務器是數據持久化的分佈式事務鍵值存儲層。
Placement Driver(PD)是服務器管理群集。
數據備份
BR的主要實現:水平可伸縮性和強一致性。
1、執行數據備份命令時,會按順序執行以下操作:
首先從 PD 獲取相關元數據信息:
當前的 TS 作為備份快照的時間點
集群的 TiKV 節點信息
2、根據這些數據,在內部啟動一個新實例,獲取對應TS的數據庫或表信息,過程中會忽略系統數據庫information_schema,performance_schema和mysql。
3、備份子命令令根據需求執行如下操作:
全量備份:BR 遍歷全部庫表,並且根據這些表構建需要備份的 KV Range
單表備份:BR 根據該表構建需要備份的KV Range
4、最後,BR 將需要備份的KV Range收集後,構造完整的備份請求分發給集群內的 TiKV 節點。
數據恢復
對數據庫恢復,BR按順序執行以下任務:
1、解析備份路徑下的backupMeta文件,根據解析出來的庫表信息,新創建一個實例在新集群創建對應的庫表。
2、對解析出來的SST文件,進行表聚合。
3、根據Key Range進行預切分 Region,使得各個Region至少對應一個SST文件。
4、遍歷要恢復的每一張表和其對應的SST文件。
5、找到Region,發送下載文件的請求到對應的TiKV節點,下載成功後,發送加載請求。
6、TiKV 收到加載SST文件的請求後,利用 Raft 機制保證加載 SST 數據的強一致性。
7、在加載成功後,下載下來的 SST 文件會被異步刪除。
完成恢復操作後,BR會對恢復後的數據校驗計算,和備份數據進行對比。
BR使用初步
BR命令是由子命令、選項和參數組成的。一個典型的命令如下:
br backup full --pd "${PDIP}:2379" -s "local:///tmp/backup"
子命令不帶-和--的字符(如本例中的backup,full)。選項即以-或者--開頭的字符(本例中的-s或者等效的—storage,--pd)。參數即子命令或選項字符後緊跟的、並傳遞給命令和選項的字符,一般要用引號括住(本例中的
常見子命令
BR 命令由多層構成。BR支持backup、restore 和 version 三個子命令:
backup 用於備份TiDB集群
restore 用於恢復TiDB集群
version 用於顯示BR版本信息
以上三個子命令可能還包含下面的一些子命令:
full:可用於全庫備份或恢。
db:可用於備份或恢復集群中的特定的數據庫。
table:可用於備份或恢復集群中特定的單張表。
常用選項
--pd
-h/--help:獲取所有命令和子命令的使用幫助。比如 br backup --help。
--ca:指定 PEM 格式的受信任CA的證書文件路徑。
--cert:指定 PEM 格式的SSL證書文件路徑。
--key:指定 PEM 格式的SSL證書密鑰文件路徑。
--status-addr:BR 向Prometheus提供統計數據的監聽地址。
實例:
備份全部集群數據:
br backup full \\
--pd "${PDIP}:2379" \\
--storage "local:///tmp/backup" \\
--ratelimit 120 \\
--concurrency 4 \\
--log-file backupfull.log
所有集群數據會被備份到各自TiKV節點的 /tmp/backup 路徑,同時備份的元數據文件backupmeta。--ratelimit 和 --concurrency 選項限制了每個TiKV執行備份任務的速度上限(單位 MiB/s)和併發數上限。--log-file 選項指定把 BR 的 log 寫到 backupfull.log 文件中。
備份期間有進度條在終端中顯示。當進度條前進到 100% 時,說明備份已完成。。進度條效果如下:
Full Backup 19.02%.
備份單個庫
br backup db \\
--pd "${PDIP}:2379" \\
--db test \\
--storage "local:///tmp/backup" \\
--ratelimit 120 \\
--concurrency 4 \\
--log-file backuptable.log
備分單個表
br backup table \\
--pd "${PDIP}:2379" \\
--db test \\
--table usertable \\
--storage "local:///tmp/backup" \\
--ratelimit 120 \\
--concurrency 4 \\
--log-file backuptable.log
恢復操作
br restore full \\
--pd "${PDIP}:2379" \\
--storage "local:///tmp/backup" \\
--concurrency 128 \\
--log-file restorefull.log
官方基準測試(10TB)
官方提供了BR備份恢復的基準測試,其結果如下圖所示
對10 TB數據的群集,BR能夠以2.7 GB/s的平均速度(五個TiDB實例的平均548 MB/s)。測試期間的最大速度略高於4 GB/s,每個實例的最大備份速度在770 MB/s至866 MB/s之間。
對10 TB數據集群,恢復操作平均速度為0.7 GB/s,五個TiDB實例的平均速度為150 MB/s。在測試過程中,BR的最大存儲速度約為1.2 GB/s,每個實例的最大恢復速度為247 MB/s至268 MB/s。
備份速度
備份了兩個表。在下圖中,綠色曲線代表所有TiKV實例的總體備份速度,其他曲線代表每個實例的備份速度。
在11:15和11:28,備份索引數據。由於索引條目很短,因此備份速度會降低。
恢復速度
備份後,還原了兩個表。綠色曲線代表總體還原速度,其他曲線代表每個TiKV實例的還原速度。
BR將還原任務分為多個子任務,然後按順序執行這些子任務。這樣我們可以看到圖中的故障。它們可能是需要進一步優化的潛在問題。
在1:00和1:15,將還原索引數據。因為索引條目很短,所以還原速度會降低。