Databend Cloud 平臺(tái)的 Serverless 架構(gòu)實(shí)踐
作者:李亞舟
Databend Cloud 負(fù)責(zé)人
https://github.com/flaneur2020
Databend 是一個(gè)開(kāi)源的、完全面向云架構(gòu)的新式數(shù)倉(cāng),它將廉價(jià)的云存儲(chǔ)作為主要存儲(chǔ),并提供快捷高效的分析性能,已幫助很多客戶實(shí)現(xiàn)了數(shù)倉(cāng)、行為日志等場(chǎng)景的降本增效并廣受好評(píng)。
當(dāng)然,Databend 也提供了云服務(wù)!Databend Cloud 能夠幫助您托管 Databend 實(shí)例,并提供 Serverless 的部署模式,按計(jì)算時(shí)長(zhǎng)而非固定的硬件資源進(jìn)行計(jì)費(fèi)。Serverless 部署不僅可以降低成本,還可以提高系統(tǒng)的彈性和可靠性。通過(guò)使用 Databend Cloud,您可以輕松構(gòu)建低成本、高性能的數(shù)據(jù)倉(cāng)庫(kù),并專(zhuān)注于分析而非基礎(chǔ)架構(gòu)的維護(hù)。
Databend Cloud 與 Databend 項(xiàng)目幾乎在同一時(shí)間啟動(dòng)開(kāi)發(fā),在建設(shè) Databend Cloud 期間,會(huì)同時(shí)產(chǎn)生一些對(duì)可擴(kuò)展性、高可用性等基礎(chǔ)設(shè)施需求,也正與 Databend 以云為中心的定位相契合。兩者持續(xù)的打磨,使得 Databend Cloud 更加易用的同時(shí),也使得 Databend 社區(qū)版更易于部署、管理和訪問(wèn)。
如何更高效、更安全、更低成本地利用云上資源,逐漸成為行業(yè)的一項(xiàng)共同關(guān)注。本文將介紹 Databend Cloud 架構(gòu)的設(shè)計(jì)與取舍,以及各個(gè)組件的工作機(jī)制。希望本文能夠幫助您更好地發(fā)揮云的優(yōu)勢(shì),使云上數(shù)倉(cāng)更廉價(jià)、更高效、更安全且更易用。
設(shè)計(jì)思路
如下設(shè)計(jì)思路貫穿 Databend Cloud 開(kāi)發(fā)過(guò)程的始終:
按需付費(fèi),并最小化用戶在計(jì)算、存儲(chǔ)與流量等資源方面的開(kāi)銷(xiāo)
Serverless 架構(gòu),基于 Kubernetes 和 IaC 自動(dòng)化一切,總是最新版
默認(rèn)安全,按 SOC2 標(biāo)準(zhǔn)設(shè)計(jì)零信任架構(gòu),租戶之間強(qiáng)隔離,默認(rèn)加密
融入數(shù)據(jù)生態(tài),并為大數(shù)據(jù)生態(tài)加入更多云原生與 Rust 要素
上述設(shè)計(jì)思路互為彼此:為了最小化用戶的資源開(kāi)銷(xiāo),我們會(huì)通過(guò) Serverless 架構(gòu),及時(shí)地釋放未使用的資源不再產(chǎn)生任何費(fèi)用;借助 Kubernetes 和 IaC,我們實(shí)現(xiàn)了標(biāo)準(zhǔn)化的基礎(chǔ)設(shè)施,使標(biāo)準(zhǔn)化的安全機(jī)制內(nèi)建于不同的云廠商與區(qū)域;此外,外部數(shù)據(jù)系統(tǒng)可以便捷地與 Databend Cloud 互通,而無(wú)需關(guān)心基礎(chǔ)設(shè)施的細(xì)節(jié)。
接下來(lái),我們會(huì)詳細(xì)介紹 Databend Cloud 的總體架構(gòu)與各組件的工作機(jī)制。
架構(gòu)概覽
下圖為 Databend Cloud 在一個(gè)區(qū)域中的架構(gòu)概覽:

大體而言,Databend Cloud 在架構(gòu)上,采用了控制面與數(shù)據(jù)面分離的多租戶存儲(chǔ)層 + Serverless 計(jì)算層的設(shè)計(jì):
將對(duì)象存儲(chǔ)作為主要存儲(chǔ),并按租戶進(jìn)行存儲(chǔ)隔離
基于 Kubernetes 管理計(jì)算資源,將 Operator 作為控制面的中心,每個(gè)區(qū)域暴露一個(gè)內(nèi)網(wǎng)的 Manage Grpc 服務(wù)用于跨云管理
通過(guò)多租戶的元數(shù)據(jù)中心來(lái)存儲(chǔ)表結(jié)構(gòu)、身份認(rèn)證等元信息
通過(guò)自研的 Query Gateway 作為數(shù)據(jù)面的入口
統(tǒng)一的跨區(qū) Cloud Console 作為管理界面的入口,用于管理賬號(hào)與組織信息、收集用量信息等
對(duì)象存儲(chǔ)作為主要存儲(chǔ)
Databend 將對(duì)象存儲(chǔ)作為主要的存儲(chǔ),因此第一天起就是存儲(chǔ)與計(jì)算完全分離的架構(gòu)。這一點(diǎn)大大簡(jiǎn)化了 Cloud 產(chǎn)品的開(kāi)發(fā)難度:只需要管理、調(diào)度無(wú)狀態(tài)的計(jì)算節(jié)點(diǎn)即可,不需要實(shí)現(xiàn)復(fù)雜的節(jié)點(diǎn)狀態(tài)遷移、主從切換等機(jī)制。
不過(guò)對(duì)象存儲(chǔ)在帶來(lái)成本優(yōu)勢(shì)的同時(shí),也為我們的查詢(xún)引擎帶來(lái)了新的挑戰(zhàn):
對(duì)象存儲(chǔ)的訪問(wèn)時(shí)間延不穩(wěn)定
云廠商可能會(huì)在對(duì)象存儲(chǔ)的訪問(wèn)上施加限額
因此我們?cè)诹魉€調(diào)度上針對(duì)對(duì)象存儲(chǔ)的性質(zhì)做了很多優(yōu)化:
大規(guī)模地并行掃描對(duì)象文件,使 IO 帶寬跑滿
動(dòng)態(tài)的流水線調(diào)度框架,動(dòng)態(tài)適應(yīng)不同延時(shí)的請(qǐng)求
針對(duì)云存儲(chǔ)的限額等報(bào)錯(cuò),動(dòng)態(tài)地退避重試,確保查詢(xún)成功
增加本地 SSD Cache 以加速熱數(shù)據(jù)訪問(wèn)
基于 Kubernetes 管理計(jì)算資源
我們將計(jì)算層放置于云廠商的 Kubernetes 中進(jìn)行管理。通過(guò) Kubernetes,我們能夠抹平不同云廠商之間的差異,使用同一套 API 來(lái)協(xié)調(diào)計(jì)算資源的伸縮。Kubernetes 社區(qū)中通行的 Operator 開(kāi)發(fā)模式,允許我們靈活地?cái)U(kuò)展控制邏輯。除了計(jì)算資源的調(diào)度,還有用量統(tǒng)計(jì)、自動(dòng)伸縮等操作,也均由 Operator 來(lái)協(xié)調(diào)完成。
Operator 正是控制面的核心。它主要定義了 Tenant 和 Warehouse 兩種 CRD,分別管理租戶和 Warehouse 的生命周期。在 Databend Cloud 上創(chuàng)建的 Warehouse,均會(huì)對(duì)應(yīng)一個(gè) Warehouse CRD,隨后 Operator 會(huì)為 Warehouse 創(chuàng)建一個(gè) StatefulSet 以啟動(dòng) Databend 集群。
Databend Query 本身是無(wú)狀態(tài)的,那么為什么選擇 StatefulSet 而非 Deployment?首先 StatefulSet 中的 Pod 能夠擁有一個(gè)固定編號(hào),我們會(huì)選擇 0 號(hào) Pod 作為協(xié)調(diào)者,使請(qǐng)求固定地訪問(wèn)同一個(gè)協(xié)調(diào)者進(jìn)行 Plan 與協(xié)調(diào)執(zhí)行;其次,我們也為 Databend 集群綁定了了一個(gè) SSD Cache,用于加速訪問(wèn)。
此外,為了提高整體的資源利用率,我們使用了 Karpenter 作為 Scaler,它能夠在集群的物理資源不足時(shí),動(dòng)態(tài)向云廠商申請(qǐng)更多物理資源并自動(dòng)加入集群,并在用量較低時(shí)自動(dòng)釋放物理資源,這使得 Kubernetes 集群形成了一個(gè)彈性的資源池,能夠動(dòng)態(tài)適應(yīng)我們對(duì)物理資源需求的變化。
多租戶的元信息中心
Databend 會(huì)盡可能多地緩存從 Metasrv 中得到的元信息,因此對(duì) Metasrv 的訪問(wèn)壓力往往并不高。因此我們選擇將 Metasrv 部署為多租戶的共享集群,通過(guò) Key 前綴來(lái)區(qū)分不同租戶的元數(shù)據(jù)。

在 Databend Cloud 中,Metasrv 不只用于保存表結(jié)構(gòu)、用戶認(rèn)證信息等元數(shù)據(jù),也為 Databend Cloud 中的表寫(xiě)入提供了事務(wù)性支持。對(duì)象存儲(chǔ)往往沒(méi)有提供強(qiáng)一致性的寫(xiě)入語(yǔ)義,我們通過(guò)基于 Raft 的 metasrv 集群補(bǔ)齊了這一短板:在 Databend 中表的每次寫(xiě)入操作均會(huì)生成新的 Snapshot 文件,在 Metasrv 中寫(xiě)入成功對(duì)應(yīng)表的 Snapshot Key,才標(biāo)志著這次寫(xiě)入是成功的,Metasrv 正是 Databend 實(shí)現(xiàn) ACID 的基礎(chǔ)。
Metasrv 作為 Databend Cloud 基礎(chǔ)設(shè)施中唯一的有狀態(tài)組件,其可靠性至關(guān)重要,我們?yōu)樗O(shè)置了自動(dòng)的備份機(jī)制,并持續(xù)地對(duì)它進(jìn)行可靠性演練。從 Metasrv 中孵化的 openraft 框架是 Metasrv 保障正確性的堅(jiān)實(shí)基礎(chǔ),它目前已是 rust 生態(tài)圈中最受好評(píng)的 Raft 框架,目前已為微軟、火幣等企業(yè)應(yīng)用于生產(chǎn)。
數(shù)據(jù)面
數(shù)據(jù)面代表 Databend Cloud 中從數(shù)據(jù)導(dǎo)入、執(zhí)行計(jì)算到展現(xiàn)的路徑,它會(huì)按公網(wǎng)的 Query Gateway 作為訪問(wèn)入口,將來(lái)自外部的 HTTPS 請(qǐng)求轉(zhuǎn)發(fā)給 Kubernetes 中的 Databend 實(shí)例執(zhí)行計(jì)算,并最終將結(jié)果返還給使用方。
我們的 Query 協(xié)議選擇了基于 HTTP 協(xié)議作為通信傳輸層。在云原生環(huán)境中,包括 Query Gateway 在內(nèi)的一切組件都隨時(shí)可能重啟,原因可能是版本發(fā)布,也可能是機(jī)器維護(hù)。這時(shí)相比于四層的 MySQL、Postgres 等協(xié)議,無(wú)狀態(tài)的 HTTP 協(xié)議會(huì)有很大的優(yōu)勢(shì):不需要對(duì)連接進(jìn)行?;?,只要應(yīng)用程序滿足 Kubernetes 對(duì)退出信號(hào)的做到正確的平滑退出,就能夠在版本發(fā)布與機(jī)器維護(hù)期間不中斷任何用戶的請(qǐng)求。

不過(guò)我們?cè)趯⒆杂械?Query 協(xié)議與大數(shù)據(jù)生態(tài)集成時(shí)遇到了一些困難:我們需要實(shí)現(xiàn)不同語(yǔ)言的 SDK、也需要針對(duì)諸多不同的系統(tǒng)做一對(duì)一的對(duì)接,這對(duì)于一個(gè)新產(chǎn)品而言是一項(xiàng)不小的工作量。目前我們已提供了 Go、Java、Python、Rust 四種語(yǔ)言的 SDK,也提供了 Metabase、Grafana、Quick BI、Deepnote、Airbyte、Kafka、DataX、Flink CDC 等數(shù)據(jù)系統(tǒng)的對(duì)接。我們也開(kāi)始嘗試實(shí)現(xiàn)基于 Flight SQL 的協(xié)議,借助 Arrow 社區(qū)的 SQL 協(xié)議標(biāo)準(zhǔn),使 Databend Cloud 更易于與其他系統(tǒng)集成,與更大的生態(tài)相融合。
自動(dòng)休眠與自動(dòng)喚醒
為了減少計(jì)算資源的開(kāi)銷(xiāo),我們會(huì)定期采集活躍的 Warehouse 的指標(biāo),如果超過(guò) Suspend 時(shí)間,則使 Warehouse 進(jìn)入休眠狀態(tài),從而釋放計(jì)算資源,不再產(chǎn)生費(fèi)用。我們默認(rèn)為 Warehouse 設(shè)置 5 分鐘的自動(dòng)休眠時(shí)長(zhǎng),你可以根據(jù)自己的需求,將休眠時(shí)長(zhǎng)縮短到最低 1 分鐘。

Operator 中的 SuspendController 會(huì)持續(xù)地檢查活躍的 Warehouse 的 Pod,通過(guò) /v1/status 接口獲取 Databend 實(shí)例的運(yùn)行狀態(tài),若一個(gè) Warehouse 的所有 Pod 均沒(méi)有活躍查詢(xún)、且上次活躍的時(shí)間超過(guò) Suspend 時(shí)長(zhǎng),則刪除該 Warehouse 的 StatefulSet 釋放計(jì)算資源。
當(dāng)請(qǐng)求抵達(dá) Query Gateway 時(shí),如果對(duì)應(yīng)的 Warehouse 未啟動(dòng),它會(huì)通知 Operator 嘗試喚醒該 Warehouse,在 StatefulSet 就緒后再繼續(xù)發(fā)送 Query,受益于 Databend 實(shí)例快速的啟動(dòng)速度(1s 左右),一般只需幾秒等待即可執(zhí)行查詢(xún)。通過(guò)這一自動(dòng)喚醒機(jī)制,用戶不再需要關(guān)心 Warehouse 的狀態(tài),每個(gè) Warehouse 都是一個(gè) Serverless 服務(wù)。
在這里我們并沒(méi)有選擇 knative 等 Serverless 框架,因?yàn)槲覀兿M麑⒃摽刂屏鞒套龅阶銐蚝?jiǎn)單,通過(guò)更少的依賴(lài)與 CRD 定義完成工作,從而降低維護(hù)成本,并能夠更靈活地調(diào)整 Serverless 策略。
多云與多區(qū)域支持
前面提到 Databend Cloud 的架構(gòu)主要分為數(shù)據(jù)面和控制面兩條鏈路,在多云與多區(qū)域部署上,Cloud Console 可以將每個(gè)區(qū)域視為暴露控制面入口的黑盒:

Databend Cloud 中支持的所有的區(qū)域均通過(guò) Pulumi 進(jìn)行 IaC 管理。通過(guò) IaC 來(lái)管理所有的云上基礎(chǔ)資源,使得我們?cè)诓煌瑓^(qū)域的基礎(chǔ)設(shè)施環(huán)境完全標(biāo)準(zhǔn)、一致,允許我們構(gòu)造與生產(chǎn)一致的測(cè)試環(huán)境,也允許我們快速地開(kāi)啟新區(qū)。
每增加一個(gè)區(qū)域,Cloud Console 均通過(guò)內(nèi)網(wǎng)的 Manage Grpc 進(jìn)行連接。當(dāng)新用戶注冊(cè)時(shí),會(huì)通過(guò) SetupTenant 調(diào)用來(lái)初始化租戶,這時(shí)它會(huì)為當(dāng)前租戶初始化一個(gè) IAM Role,并綁定對(duì)象存儲(chǔ)的 Prefix 訪問(wèn)權(quán)限。對(duì)于不同的云廠商,SetupTenant 的行為會(huì)有所不同,我們?cè)谶@里為不同云廠商適配了不同的初始化邏輯。
除了控制面流量,額外的一條通信來(lái)自用量信息的同步。每個(gè)區(qū)域內(nèi)的 Operator 會(huì)在收集到 Warehouse 的用量、存儲(chǔ)用量的信息后,異步地將用量信息推送給 Cloud Console。Cloud Console 會(huì)將用量信息收集集中存儲(chǔ)于自己的數(shù)據(jù)庫(kù)中,經(jīng)聚合后生成用量統(tǒng)計(jì)數(shù)據(jù),并在每月生成賬單。
數(shù)據(jù)安全
數(shù)據(jù)安全是 Cloud Warehouse 平臺(tái)的重中之重,在建設(shè) Databend Cloud 期間,我們希望應(yīng)用 State of Art 的安全實(shí)踐,最大限度地保障用戶的數(shù)據(jù)安全。
我們希望租戶間有嚴(yán)格的數(shù)據(jù)訪問(wèn)隔離性,同時(shí),我們也希望盡可能少地使用長(zhǎng)生命周期的 AccessKey/SecretKey 來(lái)訪問(wèn)云上資源,因?yàn)殚L(zhǎng)生命周期的 Key 一旦泄露,就會(huì)產(chǎn)生極大的安全隱患。幸運(yùn)的是,云廠商大多提供了基于 Kubernetes 的 Bound Service Account Token 的身份認(rèn)證機(jī)制,很好地幫助我們解決了這一問(wèn)題。它可以為服務(wù)提供一個(gè)自動(dòng)輪換的 Token(比如半小時(shí)自動(dòng)失效),并通過(guò)云廠商的 STS 服務(wù)與 IAM Role 建立身份關(guān)聯(lián),繼而通過(guò) IAM 規(guī)則限制該服務(wù)的訪問(wèn)權(quán)限,實(shí)現(xiàn)精細(xì)的訪問(wèn)控制。

Databend Cloud 平臺(tái)會(huì)在 SetupTenant 時(shí)為租戶賦予單獨(dú)的 IAM Role,并通過(guò) IAM 規(guī)則限制每位租戶只能訪問(wèn)特定前綴下的文件。因?yàn)闆](méi)有長(zhǎng)生命周期的 Key 存在,訪問(wèn) S3 等云上資源時(shí)也變得更加安全可信。
在 Databend Cloud 上存儲(chǔ)的所有數(shù)據(jù)均默認(rèn)開(kāi)啟加密。除此之外,你也可以在 Databend Cloud 上通過(guò) Assume Role 的機(jī)制,掛載自己 AWS 賬號(hào)中的 S3 Bucket 允許 Databend Cloud 進(jìn)行分析。
RBAC
在 Databend 中,可以為每位用戶綁定多個(gè)角色,角色之間可以有依賴(lài)關(guān)系,不過(guò)同一時(shí)間中只有一個(gè)活躍的 Role。Databend Cloud 中目前內(nèi)置了 AccountAdmin 和 Public 兩種特殊的 Role,分別作為管理員和普通用戶使用,它們的特殊之處在于,AccountAdmin 是所有 Role 的父 Role,而 Public Role 屬于所有 Role 的子 Role,其層級(jí)關(guān)系大約如下:

通過(guò)為不同職責(zé)的用戶分配不同的角色和權(quán)限,能夠保證只有取得授權(quán)的人員才能訪問(wèn)敏感數(shù)據(jù)。RBAC 機(jī)制正是數(shù)據(jù)安全的一項(xiàng)重要保障。
更多服務(wù)
除了使 Databend 作為基礎(chǔ)設(shè)施更加易用與安全,我們也希望通過(guò)云服務(wù)提供更多的可能性。Cloud Data Warehouse 中的高級(jí)功能往往由更多的微服務(wù)組成,微服務(wù)架構(gòu)允許我們持續(xù)迭代地增強(qiáng) Data Cloud 服務(wù)能力,這也正是云數(shù)倉(cāng)與傳統(tǒng)數(shù)倉(cāng)的最大不同。我們會(huì)持續(xù)地在 Databend Cloud 中開(kāi)發(fā)更多的微服務(wù),為 Data Cloud 架構(gòu)添磚加瓦。比如:
自動(dòng)數(shù)據(jù)導(dǎo)入流水線(Pipe):允許自動(dòng)從對(duì)象存儲(chǔ)同步數(shù)據(jù)到 Databend Cloud 的表中,能夠自動(dòng)發(fā)現(xiàn)新的文件并發(fā)起導(dǎo)入,也能通過(guò) API 通知接口更實(shí)時(shí)地通知新文件,目前暫只支持 AWS,正在開(kāi)發(fā)與其他云廠商的對(duì)接;
自動(dòng)冷熱分離:允許將對(duì)象存儲(chǔ)中的數(shù)據(jù)自動(dòng)降級(jí)到更廉價(jià)的 Tier 上,進(jìn)一步降低存儲(chǔ)成本。
自動(dòng) Compact 與自動(dòng)優(yōu)化:根據(jù)使用的元信息,自動(dòng)地發(fā)起優(yōu)化,免費(fèi)提高你的查詢(xún)性能;
Data Masking:允許設(shè)定規(guī)則,針對(duì)特定 Role 去屏蔽特定的行與列,保障你的數(shù)據(jù)隱私;
Data Market:通過(guò) Sharing 機(jī)制,自動(dòng)地訂閱其他租戶共享的數(shù)據(jù),形成數(shù)據(jù)集市;
總結(jié)
到這里您已對(duì) Databend Cloud 的設(shè)計(jì)與架構(gòu)有所了解,歡迎訪問(wèn) https://app.databend.cn 申請(qǐng)注冊(cè)體驗(yàn)!Databend Cloud 致力于提供廉價(jià)、高效、易用且安全的 Cloud Data Warehouse 解決方案。如果您有大量數(shù)據(jù),希望能用更低的成本滿足自己的分析訴求,歡迎加入社區(qū)與我們聯(lián)系!
關(guān)于?Databend
Databend 是一款開(kāi)源、彈性、低成本,基于對(duì)象存儲(chǔ)也可以做實(shí)時(shí)分析的新式數(shù)倉(cāng)。期待您的關(guān)注,一起探索云原生數(shù)倉(cāng)解決方案,打造新一代開(kāi)源 Data Cloud。
?????? Databend Cloud:https://databend.cn
?? Databend 文檔:https://databend.rs/
?? Wechat:Databend
? GitHub:https://github.com/datafuselabs/databend