CloudQuery 如何實現(xiàn)云上數(shù)據(jù)導(dǎo)入導(dǎo)出

雖然行業(yè)正在迎來云和大數(shù)據(jù)時代,我們?nèi)粘J褂玫墓ぞ邊s仍然停留在 PC 機時代。在數(shù)據(jù)批量操作時,逐個單點工具慢慢無法應(yīng)付逐漸增大的數(shù)據(jù)量和更加靈活的操作場景。因此 CloudQuery 在 1.4.0 版本提出了「DTS」概念,即「數(shù)據(jù)庫工具箱服務(wù)」,旨在為數(shù)據(jù)管理員提供各類數(shù)據(jù)批量操作工具,大幅提升工作效率。本文我們將詳細闡述 CloudQuery「DTS」的第一款工具——「數(shù)據(jù)導(dǎo)入導(dǎo)出」。
以往 DBA 實現(xiàn)數(shù)據(jù)備份、數(shù)據(jù)導(dǎo)入導(dǎo)出通常需要借助現(xiàn)有桌面端工具,不僅成功率無法保證,在文件格式的選擇上也難以做到兩全。若導(dǎo)出格式為查看數(shù)據(jù)友好的 excel 格,則對數(shù)據(jù)量的要求較高,一旦導(dǎo)出數(shù)據(jù)量超出excel的承載,導(dǎo)出動作往往會走向失?。蝗绻x擇 sql 格式,雖然避開了數(shù)據(jù)量限制的問題,卻面臨著定位數(shù)據(jù)困難、特殊字段無法再次導(dǎo)入等問題。
并且,市面上的導(dǎo)入導(dǎo)出工具通常不具備云端數(shù)據(jù)存儲能力,導(dǎo)出文件只能存放在導(dǎo)出機本地,如果對數(shù)據(jù)有留存或共享需求,則需要借助其他各種云盤工具,但由于文件往往較大,所以上傳下載都耗時較長,非常不靈活。
此外,導(dǎo)入導(dǎo)出動作在企業(yè)內(nèi)部屬于高風(fēng)險動作,一旦發(fā)生數(shù)據(jù)庫賬號信息泄漏或盜用事件會給企業(yè)數(shù)據(jù)安全帶來極大威脅。開篇也提到數(shù)據(jù)通常是一個企業(yè)的立足根本,內(nèi)部數(shù)據(jù)的泄漏往往比外部損害更加致命。
所以 CloudQuery 對數(shù)據(jù)管理員的使用場景進行評估,結(jié)合業(yè)務(wù)實際需求,推出了獨特的「導(dǎo)入導(dǎo)出」功能,主要具備以下特點:
① 導(dǎo)出文件云端存儲
平臺提供個人文件夾功能,每個用戶都屬于自己的云端空間。所有導(dǎo)出數(shù)據(jù)保留在服務(wù)器上,真正做到跨客戶端數(shù)據(jù)同步,讓操作人員從不同客戶端登錄平臺都可以隨時獲取遠端數(shù)據(jù),無需通過各種移動硬盤或云盤來進行數(shù)據(jù)共享。
② 工具使用權(quán)限納入管控
CloudQuery 將工具使用權(quán)限納入平臺權(quán)限管控體系,員工使用「導(dǎo)入導(dǎo)出」功能,需管理員對其開通對應(yīng)權(quán)限,否則無法使用該工具。工具使用權(quán)限納入平臺權(quán)限管控體系貫徹了 CloudQuery 作為數(shù)據(jù)管控平臺的安全原則,將用戶在平臺上的所有動作納入管控體系,盡可能降低數(shù)據(jù)泄露風(fēng)險,防止因賬號泄露或盜用導(dǎo)致大批量數(shù)據(jù)泄露、拖庫拖表事件發(fā)生。
③ 云原生形態(tài),操作方式更靈活
在企業(yè)內(nèi)部 DBA 通常面臨繁多復(fù)雜的數(shù)據(jù)交互場景,例如數(shù)據(jù)定時備份、生產(chǎn)到測試數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入導(dǎo)出等等,但現(xiàn)有桌面端工具囿于PC的不靈活性會使得 DBA 在進行異端恢復(fù)時面臨無數(shù)的麻煩。CloudQuery 提供的導(dǎo)出數(shù)據(jù)上云解除了數(shù)據(jù)操作人員與端強耦合,也提高了企業(yè)內(nèi)部的數(shù)據(jù)可控性,導(dǎo)出文件僅會存儲在用戶的個人文件夾下,避免數(shù)據(jù)文件存儲在硬盤中被其他人員竊取、傳播導(dǎo)致數(shù)據(jù)泄露。同時, CloudQuery 支持的自定義參數(shù)功能可以幫助 DBA 靈活選擇導(dǎo)出數(shù)據(jù),例如 ignore=y ?full=y 等等。
④ 數(shù)據(jù)源特性支持
考慮到各種復(fù)雜場景的數(shù)據(jù)交互,我們在設(shè)計導(dǎo)入導(dǎo)出模塊時對各個數(shù)據(jù)源進行了針對性的特性支持,例如 mysql 的 mysqldump --single-transaction,在導(dǎo)出時將會話事務(wù)隔離級別改為RR隔離級別并開啟一個事務(wù),RR隔離級別下,導(dǎo)出數(shù)據(jù)都是開啟事務(wù)時的數(shù)據(jù)快照,保證了導(dǎo)出數(shù)據(jù)的一致性。
而在開發(fā)語言的選擇上,由于大部分導(dǎo)出動作需要與數(shù)據(jù)庫終端命令直接交互,所以我們拋棄了市面上主流使用的 Java 轉(zhuǎn)而采用 Go 語言進行代碼開發(fā),目的是將命令行工具 SaaS 化,接入各種數(shù)據(jù)庫工具,方便擴展。DTS 的每個工具都擁有自己獨立的描述文件,在后續(xù)的工具擴展道路上可以通過描述語言來定義新增的命令行工具。同樣前端交互頁面、后端工具、命令等等都可以通過描述文件實現(xiàn)。所有實時狀態(tài)輸出由 websocket 推送進行前端頁面交互。
還是以mysqldump 舉例:

如上圖所示,在新增工具支持時首先需要定義描述文件,當(dāng) DTS 服務(wù)啟動時會自動將文件映射到動態(tài)類中,類之間互相獨立,方便后續(xù)擴展。啟動成功后,前端在渲染頁面工具庫時會自動對動態(tài)類進行檢索,以服務(wù)端來進行動態(tài)頁面表單渲染,選擇指定任務(wù)后再根據(jù)用戶所選以及自定義參數(shù)轉(zhuǎn)換為操作命令。當(dāng)用戶請求提交至服務(wù)端執(zhí)行時,服務(wù)端會屏蔽工具之間差異性,通過參數(shù)不同進行區(qū)別處理并動態(tài)生成數(shù)據(jù)庫命令,隨后以異步方式提交至數(shù)據(jù)庫執(zhí)行,執(zhí)行過程中會進行實時日志信息以及執(zhí)行狀態(tài)收集,最終以 ws 形式進行結(jié)果反饋以及日志輸出,同時會配合持久層緩存方便用戶執(zhí)行后進行日志二次下載查看。