[摘要]如何構(gòu)建分布式數(shù)據(jù)庫 severless 服務(wù)?
最近在讀一些分布式數(shù)據(jù)庫 serverless 服務(wù)化的文章,從中總結(jié)出一些構(gòu)建此類服務(wù)面臨的痛點(diǎn)以及如何破局的要點(diǎn),算是一個讀書筆記。主要參考的文章有 cockroachdb severless 解讀[1], How we built a forever-free serverless SQL database[2]。
大致內(nèi)容提綱

為什么需要云原生數(shù)據(jù)庫
數(shù)據(jù)庫的 scale 能力決定了這個產(chǎn)品的上限,而一家公司能用多少人服務(wù)多少客戶的 scale 能力,決定了公司營收的上限。破局的方式就是數(shù)據(jù)庫上云,把數(shù)據(jù)庫的服務(wù)化,降低門檻。
為什么要 serverless 化
serverless 是一種賣服務(wù)的形式,一個集群就可以服務(wù)"無窮"個租戶,只要沒有實(shí)際的使用,并不會產(chǎn)生成本。多增加一個租戶,它的邊際成本是零。所以這個模式是 scalable 的。
而為了實(shí)現(xiàn) serverless 的目的,云原生數(shù)據(jù)庫的架構(gòu)大多是存儲和計算分離的。
多租戶的資源隔離問題
如果是多租戶共享計算層和存儲層,那復(fù)雜 SQL 就會將整個集群的資源耗盡,影響其他租戶;
如果是每個租戶獨(dú)享各自的計算層和存儲層,也就是回到了每個租戶一套集群的模式,成本非常高。
綜上因素,比較好的方式是獨(dú)享計算層,共享存儲層。上層的 SQL 是租戶之間物理隔離的,下面的 kv 存儲是由所有租戶去共享的。
共享存儲之后,如何區(qū)分租戶數(shù)據(jù)
共享存儲層后,可以在請求的 key 的編碼中添加 tenant-id,多租戶模式下,SQL 的表的數(shù)據(jù)映射成 kv 數(shù)據(jù),最終的編碼可以是 /tenant-id/table-id/index-id/key。
集群架構(gòu)

名詞解釋
Block storage: 多租戶共享的存儲
SQL Pod: 租戶獨(dú)享的 SQL 計算節(jié)點(diǎn)
Proxy Pod : 負(fù)責(zé)將租戶的請求路由到正確的 SQL 節(jié)點(diǎn)上
計算節(jié)點(diǎn)無狀態(tài),這意味著 SQL pod 可以隨用隨起,也就是說,當(dāng)某個 tenant 沒有流量時,完全可以把它的 SQL 節(jié)點(diǎn)停下關(guān)掉,需要的時候再動態(tài)拉起。
拓展閱讀[3]
以上。
參考資料
cockroachdb severless 解讀: https://www.zenlife.tk/cockroach-severless.md
[2]How we built a forever-free serverless SQL database: https://www.cockroachlabs.com/blog/how-we-built-cockroachdb-serverless/
[3]云原生數(shù)據(jù)庫架構(gòu)系列之 session manager: https://www.zenlife.tk/session-manager.md
