多云轉(zhuǎn)晴:Databend 的天空計(jì)算之路
作者:尚卓燃(PsiACE)
澳門科技大學(xué)在讀碩士,Databend 研發(fā)工程師實(shí)習(xí)生
Apache OpenDAL(Incubating) Committer
https://github.com/psiace/
內(nèi)容提要:本文將會介紹天空計(jì)算的背景,以及 Databend 是如何從數(shù)據(jù)存儲、數(shù)據(jù)管理、數(shù)據(jù)共享等視角考慮跨云數(shù)據(jù)存儲與訪問的。
背景
云計(jì)算時代的開端可以追溯到 2006 年,當(dāng)時 AWS 開始提供 S3 和 EC2 服務(wù)。2013 年,云原生概念剛剛被提出,甚至還沒有一個完整的愿景。時間來到 2015 年 CNCF 成立,接下來的五年中,這一概念變得越來越流行,并且成為技術(shù)人繞不開的話題。
根據(jù) CNCF 對云原生的定義:云原生技術(shù)使組織能夠在公共、私有和混合云這類現(xiàn)代、動態(tài)的環(huán)境中構(gòu)建和運(yùn)行可擴(kuò)展的應(yīng)用程序。典型示例包括:容器、服務(wù)網(wǎng)格、微服務(wù)、不變基礎(chǔ)設(shè)施和聲明式 API 。

然而,無論是公有云還是私有云、無論是云計(jì)算還是云服務(wù),在天空中都已經(jīng)存在太多不同類型的“云”。每個“云”都擁有自己獨(dú)特的 API 和生態(tài)系統(tǒng),并且彼此之間缺乏互操作性,能夠兼容的地方也是寥寥無幾。云已經(jīng)成為事實(shí)上的孤島。這個孤島不僅僅是指公有云和私有云之間的隔閡,還包括了不同公有云之間、不同私有云之間、以及公有云和私有云之間的隔閡。這種孤島現(xiàn)象不僅給用戶帶來了很多麻煩,也限制了云計(jì)算的發(fā)展。
2021 年 RISELab 發(fā)表了題為 The Sky Above The Clouds 的論文,討論關(guān)于天空計(jì)算的未來。天空計(jì)算將云原生的思想進(jìn)一步擴(kuò)展,從而囊括公有云、私有云和邊緣設(shè)備。其目標(biāo)是實(shí)現(xiàn)一種統(tǒng)一的 API 和生態(tài)體系,使得不同云之間可以無縫地協(xié)作和交互。這樣一來,用戶就可以在不同的云之間自由地遷移應(yīng)用程序和數(shù)據(jù),而不必?fù)?dān)心兼容性和遷移成本的問題。同時,天空計(jì)算還可以提供更高效、更安全、更可靠的計(jì)算服務(wù),從而滿足用戶對于云計(jì)算的不斷增長的需求??傮w上講,天空計(jì)算致力于允許應(yīng)用跨多個云廠商運(yùn)行,實(shí)現(xiàn)多云之間的互操作性。

The Databend Way
跨云的關(guān)鍵
Databend 能夠滿足用戶在不同的云之間自由地訪問數(shù)據(jù)并進(jìn)行查詢,而不必?fù)?dān)心兼容性和遷移成本的問題。同時,Databend 還可以提供更高效、更安全、更可靠的計(jì)算服務(wù),從而滿足用戶對于云計(jì)算的不斷增長的需求。從這個角度來看,Databend 已經(jīng)初步形成了一套天空計(jì)算的解決方案。那么,對 Databend 而言,跨云的關(guān)鍵到底落在哪里呢?

Databend 采用存算分離的架構(gòu),并完全面向云對象存儲進(jìn)行設(shè)計(jì)決策。得益于存儲與計(jì)算分離、存儲與狀態(tài)分離,Databend 可以實(shí)現(xiàn)對資源的精細(xì)化控制,輕松部署與擴(kuò)展 Query 和 Meta 節(jié)點(diǎn) ,并支持多種不同的計(jì)算場景和存儲場景,而無需考慮跨云數(shù)據(jù)管理與移動的問題。
Query 節(jié)點(diǎn)和 Meta 節(jié)點(diǎn)本身都是輕量化的服務(wù),并且對于部署環(huán)境沒有嚴(yán)格的依賴。但數(shù)據(jù)的存儲和訪問管理就不一樣,我們需要考慮不同云服務(wù)之間的 API 兼容性、以及如何與云服務(wù)本身的安全機(jī)制交互從而提供更安全的訪問控制機(jī)制。對于 Databend 而言,跨云,或者說實(shí)現(xiàn)天空計(jì)算的關(guān)鍵,就落在數(shù)據(jù)的管理與訪問之上。

為了解決這一問題,Databend 抽象出一套統(tǒng)一的數(shù)據(jù)訪問層(OpenDAL,現(xiàn)在是 Apache 軟件基金會旗下的孵化項(xiàng)目),從而屏蔽了不同云服務(wù)之間的 API 兼容性問題。在接下來的部分,我們將會從不同的視角來觀察 Databend 的無痛數(shù)據(jù)訪問體驗(yàn),體驗(yàn)真正完全云原生的天空計(jì)算的魅力。
數(shù)據(jù)存儲
Databend 存儲后端的細(xì)節(jié)隱藏在簡單的配置之下,通過修改配置文件就可以輕松地在十?dāng)?shù)種存儲服務(wù)之間切換。例如,如果你想使用 AWS S3,只需要指定類型為 s3
即可,Databend 會自動嘗試使用 IAM 來進(jìn)行認(rèn)證。如果你想使用其他與 S3 兼容的對象存儲服務(wù),也可以通過 endpoint_url
等設(shè)置來調(diào)整。
[storage]
type = "s3"
[storage.s3]
bucket = "databend"
當(dāng)然,僅支持 S3 兼容的對象存儲服務(wù)還不夠。Databend 通過 OpenDAL 實(shí)現(xiàn)了 Google Cloud Storage、Azure Blob、Aliyun OSS、Huawei OBS 和 HDFS 等服務(wù)的原生存儲后端支持。 這意味著 Databend 可以充分利用各種供應(yīng)商提供的 API,為用戶帶來更優(yōu)秀的體驗(yàn)。例如,Aliyun OSS 的原生支持使得 Databend 可以通過 Aliyun RAM 對用戶進(jìn)行認(rèn)證和授權(quán),無需設(shè)置靜態(tài)密鑰,從而大大提高安全性并降低運(yùn)維負(fù)擔(dān)。

此外,原生支持還可以避免出現(xiàn)非預(yù)期行為,并與服務(wù)供應(yīng)商提供更緊密的集成。雖然各大廠商都提供了 S3 兼容 API,但它們之間存在微妙差異,在出現(xiàn)非預(yù)期行為時可能會導(dǎo)致服務(wù)性能下降或讀寫數(shù)據(jù)功能異常。Google Cloud Storage 提供了 S3 兼容的 XML API,但卻沒有支持批量刪除對象的功能。這導(dǎo)致用戶在調(diào)用該接口時遇到意外錯誤。而 Google Cloud Storage 的原生支持使 Databend 不必?fù)?dān)心 GCS 對 S3 的兼容實(shí)現(xiàn)問題對用戶業(yè)務(wù)造成影響。
總之,Databend 通過為各個服務(wù)實(shí)現(xiàn)原生支持來為用戶提供高效可靠的數(shù)據(jù)分析服務(wù)。
數(shù)據(jù)管理
前面講過了存儲后端的跨云支持,現(xiàn)在讓我們將目光聚焦到數(shù)據(jù)的管理。更具體來說,數(shù)據(jù)在 Databend 工作流中的流入與流出。
COPY INTO,數(shù)據(jù)載入
要講數(shù)據(jù)管理,就不得不討論數(shù)據(jù)從哪里來。過去可能還需要考慮是否需要遷移存儲服務(wù),但現(xiàn)在,你可以從數(shù)十種 Databend 支持或兼容的存儲服務(wù)中加載數(shù)據(jù),一切都顯得那么自然。
COPY INTO
語句是窺探 Databend 跨云能力的一個窗口,下面的示例展示了如何從 Azure Blob 加載數(shù)據(jù)到 Databend 之中。
COPY INTO mytable
? ?FROM 'azblob://mybucket/data.csv'
? ?CONNECTION = (
? ? ? ?ENDPOINT_URL = 'https://<account_name>.blob.core.windows.net'
? ? ? ?ACCOUNT_NAME = '<account_name>'
? ? ? ?ACCOUNT_KEY = '<account_key>'
? ?)
? ?FILE_FORMAT = (type = CSV);
當(dāng)然,不止是 Azure Blob ,Databend 支持的其他云對象存儲服務(wù)、IPFS 以及可以經(jīng)由 HTTPS 訪問的文件都可以作為 External location ,通過 COPY INTO
語句加載進(jìn)來。
Databend 的
COPY INTO
語句還支持進(jìn)行基本的轉(zhuǎn)換服務(wù),可以減輕 ETL 工作的負(fù)擔(dān)。
Stage ,數(shù)據(jù)暫存區(qū)
剛剛提到 External location ,事實(shí)上,要加載到 Databend 中的數(shù)據(jù)文件還可以在 Stage 中暫存。Databend 同樣支持 Internal stage 和 Named external stage 。
數(shù)據(jù)文件可以經(jīng)由 PUT_INTO_STAGE API
上傳到 Internal Stage,由 Databend 交付當(dāng)前配置的存儲后端進(jìn)行統(tǒng)一管理。而 Named external stage 則可以用于掛載其他 Databend 支持的多種存儲服務(wù)之中的 bucket 。
下面的例子展示了如何在 Databend 中創(chuàng)建一個名為 whdfs 的 Stage ,通過 WebHDFS 協(xié)議將 HDFS 中 data-files 目錄下的數(shù)據(jù)文件導(dǎo)入 Databend 。
bendsql> CREATE STAGE IF NOT EXISTS whdfs URL='webhdfs://127.0.0.1:9870/data-files/' CONNECTION=(HTTPS='false');
Query OK, 0 rows affected (0.01 sec)
bendsql> COPY INTO books FROM @whdfs FILES=('books.csv') file_format=(type=CSV field_delimiter=',' ?record_delimiter='\n' skip_header=0);
Query OK, 2 rows affected (1.83 sec)
如果你并不想直接導(dǎo)入數(shù)據(jù),也可以嘗試
SELECT FROM STAGE
,快速分析位于暫存區(qū)中的數(shù)據(jù)文件。
Catalog,數(shù)據(jù)掛載
放在對象存儲中的數(shù)據(jù)加載得到了解決,還有一個值得思考的問題是,如果數(shù)據(jù)原本由其他數(shù)據(jù)分析系統(tǒng)所管理,該怎么辦?
Databend 提供多源數(shù)據(jù)目錄(Multiple Catalog)的支持,允許掛載 Hive 、Iceberg 等外部數(shù)據(jù)目錄。
下面的示例展示如何利用配置文件掛載 Hive 數(shù)據(jù)目錄。
[catalogs.hive]
type = "hive"
# hive metastore address, such as 127.0.0.1:9083
address = "<hive-metastore-address>"
除了掛載,查詢也是小菜一碟 select * from hive.$db.$table limit 10;
。
當(dāng)然,這一切也可以通過 CREATE CATALOG
語句輕松搞定,下面的例子展示了如何掛載 Iceberg 數(shù)據(jù)目錄。
CREATE CATALOG iceberg_ctl
?TYPE=ICEBERG
?CONNECTION=(
? ?URL="s3://my_bucket/path/to/db"
? ?AWS_KEY_ID="<access-key>"
? ?AWS_SECRET_KEY="<secret_key>"
? ?SESSION_TOKEN="<session_token>"
?);
Multiple Catalog 相關(guān)的能力還在積極開發(fā)迭代中,感興趣的話可以保持關(guān)注。
再探 COPY INTO,數(shù)據(jù)導(dǎo)出
數(shù)據(jù)導(dǎo)出是數(shù)據(jù)管理中的另外一個重要話題,簡單來講,就是轉(zhuǎn)儲查詢結(jié)果以供進(jìn)一步的分析和處理。
這一能力同樣由 COPY INTO
語法提供支持,當(dāng)然,同樣支持?jǐn)?shù)十種存儲服務(wù)和多種文件輸出格式。下面的示例展示了如何將查詢結(jié)果以 CSV 格式文件的形式導(dǎo)出到指定 Stage 中。
-- Unload the data from a query into a CSV file on the stage
COPY INTO @s2 FROM (SELECT name, age, id FROM test_table LIMIT 100) FILE_FORMAT = (TYPE = CSV);
這一語法同樣支持導(dǎo)出到 External location ,真正做到數(shù)據(jù)的自由流動。
Databend 還支持
PRESIGN
,用來為 Stage 中的文件生成預(yù)簽名的 URL ,用戶可以通過 Web 瀏覽器或 API 請求自由訪問該文件。
數(shù)據(jù)共享
剛才提到的 Databend 數(shù)據(jù)管理環(huán)節(jié)跨云主要是指 Databend 與外部服務(wù)之間的交互。此外,Databend 實(shí)例之間也可以經(jīng)由多種云存儲服務(wù)來支持?jǐn)?shù)據(jù)共享。
為了更好地滿足多云環(huán)境下的數(shù)據(jù)庫查詢需求,Databend 設(shè)計(jì)并實(shí)現(xiàn)了一套 RESTful API 來支持?jǐn)?shù)據(jù)共享。

通過在配置文件中添加 share_endpoint_address
相關(guān)配置,用戶可以利用預(yù)先部署好的 open-sharing
服務(wù),經(jīng)由熟悉的云存儲服務(wù)共享 Databend 管理的數(shù)據(jù)庫或表。
CREATE SHARE myshare;
GRANT USAGE ON DATABASE db1 TO SHARE myshare;
GRANT SELECT ON TABLE db1.table1 TO SHARE myshare;
ALTER SHARE myshare ADD TENANTS = vendor;
此時,表 db1.table1
將對接受方租戶 vendor
可見,并能夠進(jìn)行必要的查詢。
CREATE DATABASE db2 FROM SHARE myshare;
SELECT * FROM db2.table1;
跨云的未來
上面的幾個視角,只是展示 Databend 在天空計(jì)算道路上的一個小小側(cè)影。
數(shù)據(jù)合規(guī)、隱私保護(hù)等內(nèi)容同樣是我們所關(guān)心的重要議題。
Databend 的愿景是成為未來跨云分析的基石,讓數(shù)據(jù)分析變得更加簡單、快速、便捷和智能。
總結(jié)
本文介紹了天空計(jì)算的概念和背景,以及 Databend 的跨云數(shù)據(jù)存儲和訪問。
天空計(jì)算是一種將公有云、私有云和邊緣設(shè)備統(tǒng)一起來的方法,目標(biāo)是提供一種無縫的 API 和生態(tài)體系,使得用戶可以在不同的云之間自由地遷移應(yīng)用程序和數(shù)據(jù)。
Databend 是一個開源的、完全面向云架構(gòu)的新式數(shù)倉,它采用存算分離的架構(gòu),并抽象出一套統(tǒng)一的數(shù)據(jù)訪問層(OpenDAL),從而屏蔽了不同云服務(wù)之間的 API 兼容性問題。Databend 可以滿足用戶在不同的云之間自由地訪問數(shù)據(jù)并進(jìn)行查詢,而不必?fù)?dān)心兼容性和遷移成本的問題。同時,Databend 還可以提供更高效、更安全、更可靠的計(jì)算服務(wù),從而滿足用戶對于云計(jì)算的不斷增長的需求。
歡迎部署 Databend 或者訪問 Databend Cloud ,即刻探索天空計(jì)算的無盡魅力。
關(guān)于?Databend
Databend 是一款開源、彈性、低成本,基于對象存儲也可以做實(shí)時分析的新式數(shù)倉。期待您的關(guān)注,一起探索云原生數(shù)倉解決方案,打造新一代開源 Data Cloud。
???????Databend Cloud:https://databend.cn
???Databend 文檔:https://databend.rs/
???Wechat:Databend
??GitHub:https://github.com/datafuselabs/databend