譯者 | 李睿
審校 | 梁策 孫淑娟
如今,“云原生”這一概念已多用來(lái)表示應(yīng)用邏輯和基礎(chǔ)設(shè)施(包括數(shù)據(jù)庫(kù))的最佳實(shí)踐集合。然而,早在云計(jì)算或云原生概念出現(xiàn)幾十年前,許多支持應(yīng)用程序運(yùn)行的數(shù)據(jù)庫(kù)就已存在,只是這些傳統(tǒng)解決方案的數(shù)據(jù)引力限制了應(yīng)用程序和工作負(fù)載的移動(dòng)能力。隨著企業(yè)將業(yè)務(wù)遷移到云端,數(shù)據(jù)存儲(chǔ)方法該怎樣發(fā)展?需不需要云原生數(shù)據(jù)庫(kù)?云原生數(shù)據(jù)庫(kù)又意味著什么?以下我們來(lái)一一解答。
什么是云原生?
要定義“云原生”,需要先來(lái)明白什么是“原生”(Native)。對(duì)于個(gè)人而言,原生二字可能會(huì)讓你聯(lián)想到母語(yǔ)、本國(guó)或本地之類的概念,亦或是自然界里野生動(dòng)物的原生棲息地,包括各個(gè)物種如何適應(yīng)所處環(huán)境等。因此,我們也從這里出發(fā)來(lái)理解云原生的含義。
以下是云原生計(jì)算基金會(huì)(CNCF)對(duì)該術(shù)語(yǔ)的定義: “云原生技術(shù)使企業(yè)能夠在公共云、私有云和混合云等現(xiàn)代動(dòng)態(tài)環(huán)境中構(gòu)建和運(yùn)行可擴(kuò)展的應(yīng)用程序,容器、服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施以及聲明性API都是典型例子。這些技術(shù)使松散耦合的系統(tǒng)具有彈性、可管理性和可觀察性,輔以強(qiáng)大的自動(dòng)化,工程師可以最少的工作量進(jìn)行高頻預(yù)測(cè)性更改。”
這一定義范圍相當(dāng)寬泛,但來(lái)定義云原生數(shù)據(jù)庫(kù)還是有些吃力,就如CNCF景觀圖數(shù)據(jù)庫(kù)部分所示:
數(shù)據(jù)庫(kù)只是龐大的云計(jì)算領(lǐng)域中的一小部分
仔細(xì)觀察就會(huì)發(fā)現(xiàn),這里包含各種各樣的產(chǎn)品:如傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)和NoSQL數(shù)據(jù)庫(kù),它們支持各種不同的數(shù)據(jù)模型,包括鍵/值、文檔和圖形。此外還包括現(xiàn)有數(shù)據(jù)庫(kù)之上的分層聚類、查詢或模式管理技術(shù)。這還不包括CNCF領(lǐng)域的其他有關(guān)類別,例如用于數(shù)據(jù)移動(dòng)的流式傳輸和消息傳遞,或用于持久性的云原生存儲(chǔ)。
這些數(shù)據(jù)庫(kù)中哪些是云原生呢?除了專為云設(shè)計(jì)的數(shù)據(jù)庫(kù),是否也包括那些可以適應(yīng)云中工作的數(shù)據(jù)庫(kù)?在比爾·懷爾德 (Bill Wilder) 2012年出版的《云架構(gòu)模式》(Cloud Architecture Patterns)一書(shū)中,他提出了一個(gè)有趣觀點(diǎn),把“云原生”定義為:“任何經(jīng)過(guò)架構(gòu)而能充分利用云平臺(tái)的應(yīng)用程序”。
根據(jù)這個(gè)定義,云原生數(shù)據(jù)庫(kù)就是那些經(jīng)過(guò)架構(gòu),能充分利用底層云基礎(chǔ)設(shè)施的數(shù)據(jù)庫(kù)。但是,這樣定義也會(huì)有爭(zhēng)議。
為什么要關(guān)心數(shù)據(jù)庫(kù)是否是云原生?
或者換個(gè)方式來(lái)問(wèn),云原生數(shù)據(jù)庫(kù)有什么優(yōu)勢(shì)?其中,推動(dòng)云計(jì)算普及的兩個(gè)主要因素包括:成本和上市時(shí)間。
- 成本——即用即付的能力對(duì)于提高云采用率至關(guān)重要(但不意味著云計(jì)算價(jià)格低廉或成本管理簡(jiǎn)單)。
- 上市時(shí)間——快速啟動(dòng)基礎(chǔ)設(shè)施以進(jìn)行原型設(shè)計(jì)、開(kāi)發(fā)、測(cè)試和交付新應(yīng)用程序和功能的能力(但不意味著云開(kāi)發(fā)和運(yùn)營(yíng)容易)。
就像堆棧選擇中的其他因素一樣,這些目標(biāo)也適用于數(shù)據(jù)庫(kù)選擇。
云原生數(shù)據(jù)庫(kù)的特征是什么?
現(xiàn)在,我們可以重新審視CNCF的定義,以有助于成本和上市時(shí)間目標(biāo)實(shí)現(xiàn)來(lái)歸納出云原生數(shù)據(jù)庫(kù)的特征:
- 可擴(kuò)展性——系統(tǒng)必須能夠動(dòng)態(tài)增加容量,以吸收額外的工作負(fù)載。
- 彈性——必須能夠縮減規(guī)模,以便用戶只為所需資源付費(fèi)。
- 恢復(fù)能力——系統(tǒng)抵受故障,必須保障不丟失數(shù)據(jù)。
- 可觀察性——能夠跟蹤活動(dòng),以及運(yùn)行狀況檢查和處理故障轉(zhuǎn)移。
- 自動(dòng)化——將操作任務(wù)落實(shí)為可重復(fù)邏輯,以降低出錯(cuò)可能。這一特性最難實(shí)現(xiàn),但對(duì)于實(shí)現(xiàn)大規(guī)模高交付速度至關(guān)重要。
云原生數(shù)據(jù)庫(kù)旨在落實(shí)這些要求,這讓它們與那些可以通過(guò)一些調(diào)整部署到云中的數(shù)據(jù)庫(kù)——“云就緒”數(shù)據(jù)庫(kù)區(qū)分開(kāi)來(lái)。
什么最能代表云原生數(shù)據(jù)庫(kù)?
本文以Apache Cassandra?為例來(lái)審視云原生數(shù)據(jù)庫(kù)的定義。雖然Cassandra在開(kāi)發(fā)時(shí)“云原生”一詞尚未普及,但由于受到了公共云基礎(chǔ)設(shè)施的啟發(fā)(例如亞馬遜AWS的Dynamo論文和谷歌公司的BigTable),它在架構(gòu)影響上有許多相似之處。因?yàn)檫@層關(guān)系,Cassandra體現(xiàn)了以下原則:
- Cassandra通過(guò)添加節(jié)點(diǎn)展示了橫向可擴(kuò)展性,并且可以彈性縮減,以在高峰負(fù)載期之外釋放資源。
- 在默認(rèn)情況下,Cassandra是一個(gè)AP系統(tǒng),也就是說(shuō),它如CAP定理中所述的那樣優(yōu)先考慮可用性和分區(qū)容錯(cuò)性,而不是一致性。Cassandra的內(nèi)置復(fù)制、無(wú)共享架構(gòu)和自我修復(fù)功能有助于保證彈性。
- Cassandra節(jié)點(diǎn)公開(kāi)日志記錄、指標(biāo)和查詢跟蹤,從而實(shí)現(xiàn)可觀察性。
- 自動(dòng)化是Cassandra最具挑戰(zhàn)性的方面,這也是數(shù)據(jù)庫(kù)常碰到的一個(gè)問(wèn)題。
雖然Cassandra集群自動(dòng)化的初始部署比較簡(jiǎn)單,但其他任務(wù)(例如擴(kuò)展或升級(jí))可能非常耗時(shí)且難以自動(dòng)化。畢竟,即使是對(duì)單節(jié)點(diǎn)數(shù)據(jù)庫(kù)操作也很有挑戰(zhàn),許多數(shù)據(jù)庫(kù)管理員也都認(rèn)同這點(diǎn)。幸運(yùn)的是,K8ssandra項(xiàng)目為在Kubernetes上部署Cassandra提供了最佳實(shí)踐,其中包括在交付運(yùn)營(yíng)(“Day 2”)后的自動(dòng)化操作方面取得了重大進(jìn)展。
云原生數(shù)據(jù)庫(kù)是否必須在Kubernetes上運(yùn)行?
有關(guān)Kubernetes,當(dāng)人們談?wù)撛浦械臄?shù)據(jù)庫(kù)時(shí),實(shí)際上是在說(shuō)需要某種存儲(chǔ)的有狀態(tài)工作負(fù)載。但在云計(jì)算世界中,有狀態(tài)是個(gè)麻煩事。數(shù)據(jù)引力相當(dāng)棘手——由于法規(guī)和法律的限制,數(shù)據(jù)可能難以移動(dòng),而且成本可能會(huì)變得非常高昂。
由于最初不是為有狀態(tài)工作負(fù)載而設(shè)計(jì),在開(kāi)始使用Kubernetes部署容器化應(yīng)用程序時(shí),其面臨的挑戰(zhàn)有增無(wú)減。目前出現(xiàn)了推動(dòng)部署數(shù)據(jù)庫(kù)在Kubernetes上運(yùn)行的新趨勢(shì),以在單一平臺(tái)上運(yùn)行整個(gè)堆棧來(lái)最大限度地提升開(kāi)發(fā)和運(yùn)營(yíng)效率。Kubernetes對(duì)云原生數(shù)據(jù)庫(kù)有哪些額外要求呢?
(1)容器化
首先,數(shù)據(jù)庫(kù)必須在容器中運(yùn)行。這聽(tīng)起來(lái)顯而易見(jiàn),但也需要做些工作。存儲(chǔ)必須外部化,內(nèi)存和其他計(jì)算資源必須適當(dāng)調(diào)整,應(yīng)用程序日志和指標(biāo)必須可用于基礎(chǔ)設(shè)施,以進(jìn)行監(jiān)控和日志聚合。
(2)存儲(chǔ)
接下來(lái),需要將數(shù)據(jù)庫(kù)的存儲(chǔ)需求映射到Kubernetes架構(gòu)。每個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)最起碼要提出一個(gè)持久卷聲明,Kubernetes可以使用它來(lái)分配具有適當(dāng)容量和輸入/輸出(I/O)特征的存儲(chǔ)卷。數(shù)據(jù)庫(kù)通常使用Kubernetes狀態(tài)集進(jìn)行部署,這有助于管理存儲(chǔ)卷到pod的映射,并保持一致、可預(yù)測(cè)的身份。
(3)自動(dòng)化操作
最后,需要工具來(lái)管理和自動(dòng)化數(shù)據(jù)庫(kù)操作,這當(dāng)中包括安裝和維護(hù)。通常這由Kubernetes操作員模式實(shí)現(xiàn)。操作員模式本身是一個(gè)控制回路,它觀察Kubernetes資源的狀態(tài),并采取措施以助其實(shí)現(xiàn)。這樣的話,它們就類似于Kubernetes的內(nèi)置控制器,但關(guān)鍵區(qū)別在于它們了解特定域的狀態(tài),從而幫助Kubernetes做出更好決策。
例如,K8ssandra項(xiàng)目使用cass-operator,它定義了一個(gè)名為“Cassandra Datacenter”的Kubernetes自定義資源(CRD),由它來(lái)描述Cassandra集群每個(gè)頂級(jí)故障域的期望狀態(tài)。這比處理有狀態(tài)集或單個(gè)pod的抽象水平更高。
Kubernetes數(shù)據(jù)庫(kù)操作員通常有助于解答以下問(wèn)題:
- 故障轉(zhuǎn)移期間會(huì)發(fā)生什么?(pod、磁盤、網(wǎng)絡(luò))
- 向外擴(kuò)展時(shí)會(huì)發(fā)生什么?(pod重新安排)
- 如何執(zhí)行備份?
- 如何有效檢測(cè)和預(yù)防故障?
- 軟件如何升級(jí)?(滾動(dòng)重啟)
結(jié)論
云原生數(shù)據(jù)庫(kù)是按可擴(kuò)展性、彈性、韌性、可觀察性和自動(dòng)化等云原生原則設(shè)計(jì)的數(shù)據(jù)庫(kù)。就如Cassandra所示,自動(dòng)化通常是最終關(guān)卡,但在Kubernetes中運(yùn)行數(shù)據(jù)庫(kù)可以有效助力企業(yè)朝著這一目標(biāo)邁進(jìn)。
原文標(biāo)題:The Search for a Cloud-Native Databaseby,作者:Pieter Humphrey