?譯者 | 盧鑫旺
審校 | 孫淑娟
在設(shè)計(jì)云原生數(shù)據(jù)系統(tǒng)時(shí),并沒(méi)有特定的托管基礎(chǔ)設(shè)施、編程語(yǔ)言或者設(shè)計(jì)模式。構(gòu)建云原生系統(tǒng)有多種多樣的方式。讓我們來(lái)看一看云原生架構(gòu)應(yīng)該牢記的設(shè)計(jì)原則,以及一個(gè)優(yōu)秀的云原生平臺(tái)具備哪些特征。
一、云原生架構(gòu)
云原生架構(gòu)本質(zhì)上是使用云構(gòu)建應(yīng)用程序的設(shè)計(jì)模式。雖然沒(méi)有具體的方法來(lái)實(shí)現(xiàn)這種架構(gòu)或預(yù)定義的云原生設(shè)計(jì),但最常見(jiàn)的方法是將應(yīng)用程序分解為幾個(gè)微服務(wù),讓每個(gè)微服務(wù)處理不同類(lèi)型的功能。然后,每個(gè)微服務(wù)都由一個(gè)小團(tuán)隊(duì)維護(hù),通常作為容器部署。
讓我們來(lái)進(jìn)一步看看云原生架構(gòu)。
二、擁抱微服務(wù)
云原生設(shè)計(jì)和開(kāi)發(fā)依賴于松耦合的架構(gòu),應(yīng)用程序的不同部分獨(dú)立開(kāi)發(fā),獨(dú)立操作,獨(dú)立部署,通常使用微服務(wù)實(shí)現(xiàn)。
可以肯定地說(shuō),微服務(wù)是云原生系統(tǒng)的基礎(chǔ)。通過(guò)使用容器,可以將運(yùn)行時(shí)環(huán)境及其庫(kù)、二進(jìn)制文件和依賴項(xiàng)壓縮為有邏輯且易于管理的單元,從而從中受益。因此,應(yīng)用程序服務(wù)可以根據(jù)需要存儲(chǔ)、復(fù)制、傳輸和使用。
與單體程序不同,微服務(wù)由一個(gè)個(gè)小而獨(dú)立的服務(wù)組成
微服務(wù)(或者說(shuō)松耦合架構(gòu))對(duì)云計(jì)算非常重要。原因有幾個(gè),例如它提升了服務(wù)的簡(jiǎn)單性、可擴(kuò)展性和彈性。讓我們來(lái)進(jìn)一步看看這是如何實(shí)現(xiàn)的。
使用這種架構(gòu),你可以將復(fù)雜的應(yīng)用程序分解為獨(dú)立的小的模塊,使應(yīng)用程序的開(kāi)發(fā)周期變得簡(jiǎn)單且易于管理。分離應(yīng)用程序配置和基本代碼也使開(kāi)發(fā)和維護(hù)應(yīng)用程序更加容易。同樣,保持核心應(yīng)用程序與支持服務(wù)的分離允許代碼庫(kù)按照自己的速度發(fā)展和擴(kuò)展。
此外,伸縮一個(gè)應(yīng)用程序的各個(gè)部分比伸縮整個(gè)整體應(yīng)用程序更容易(也更快)。同樣,更新應(yīng)用程序更容易,因?yàn)槟阒恍枰滦枰牡牟糠郑ɑ蛭⒎?wù)),而不是再次部署整個(gè)應(yīng)用程序的新更新版本。
擁抱微服務(wù)也增加了彈性,使應(yīng)用程序更加可靠。例如,如果微服務(wù)架構(gòu)中的一個(gè)組件發(fā)生故障,整個(gè)應(yīng)用程序不會(huì)崩潰。它還促進(jìn)了IaC(代碼即基礎(chǔ)設(shè)施),這反過(guò)來(lái)為自動(dòng)化部署鋪平了道路(我們稍后將介紹)。最后,微服務(wù)架構(gòu)涉及通過(guò)API使用無(wú)狀態(tài)進(jìn)程和組件,將每個(gè)微服務(wù)與其他服務(wù)隔離,從而提高安全性和效率。
為了確保應(yīng)用程序遵循松耦合的體系結(jié)構(gòu),必須避免在不同部分之間形成緊耦合的依賴關(guān)系。例如,兩個(gè)微服務(wù)不應(yīng)該依賴于同一個(gè)數(shù)據(jù)庫(kù)。如果他們這樣做了,你將無(wú)法獨(dú)立更新和操作它們。
三、代碼即一切
雖然使用微服務(wù)從現(xiàn)代應(yīng)用程序中受益很重要,但采用自動(dòng)化實(shí)踐也很重要。這旨在優(yōu)化應(yīng)用程序開(kāi)發(fā)過(guò)程,使開(kāi)發(fā)人員和用戶都受益。為此,最終目標(biāo)是實(shí)現(xiàn)EaC?—?代碼即一切。因此,將EaC視為IaC的領(lǐng)先一步,這里說(shuō)的IaC包括應(yīng)用程序代碼庫(kù)、基礎(chǔ)設(shè)施和平臺(tái)。
這種方法在硬件和軟件方面都有許多好處。例如,它有助于在各個(gè)級(jí)別實(shí)施版本控制,并改善部門(mén)間的協(xié)作。它還促進(jìn)了不同組件的模塊化,并通過(guò)及時(shí)更新幫助防止漏洞來(lái)增強(qiáng)安全性。
云原生數(shù)據(jù)系統(tǒng)的一個(gè)關(guān)鍵方面是使用CI/CD工具在不同級(jí)別實(shí)現(xiàn)自動(dòng)化的能力。通過(guò)采用DevOps和敏捷原則,你可以得到一些好處,例如更低的運(yùn)營(yíng)成本、更好的安全性、更靈活、可擴(kuò)展性和快速的開(kāi)發(fā)周期。
安全尤其重要。手動(dòng)處理通常會(huì)導(dǎo)致對(duì)云原生平臺(tái)的攻擊,但通過(guò)自動(dòng)化實(shí)現(xiàn)最佳安全實(shí)踐可以提高安全性。此外,CI/CD中的SecDevOps允許你在SDLC的早期階段執(zhí)行安全測(cè)試,以便可以在開(kāi)發(fā)階段早期處理漏洞。
四、API優(yōu)先的思考方式
開(kāi)發(fā)人員通常專注于代碼優(yōu)先的開(kāi)發(fā)方式,而不是API優(yōu)先,但問(wèn)題是這種方法不是開(kāi)發(fā)現(xiàn)代應(yīng)用程序的最佳方法。對(duì)于云原生數(shù)據(jù)系統(tǒng),我們應(yīng)該鼓勵(lì)開(kāi)發(fā)人員采用API優(yōu)先的思考和開(kāi)發(fā)方式,并在此基礎(chǔ)上構(gòu)建軟件。這樣做有助于在為現(xiàn)代分布式應(yīng)用奠定基礎(chǔ)時(shí)節(jié)省大量時(shí)間和精力。
正如我們前面提到的,云原生數(shù)據(jù)系統(tǒng)應(yīng)該遵循微服務(wù)架構(gòu),其中應(yīng)用程序的服務(wù)是分開(kāi)的,每個(gè)服務(wù)都作為一個(gè)自主應(yīng)用程序執(zhí)行。因此,微服務(wù)依賴于API來(lái)相互通信和交互。
請(qǐng)記住微服務(wù)架構(gòu)和現(xiàn)代應(yīng)用程序的流行,API的重要性是顯而易見(jiàn)的。此外,API優(yōu)先的原則也讓開(kāi)發(fā)人員獲得了微服務(wù)模式的所有好處。遵循API優(yōu)先方法的應(yīng)用程序可以被視為緊密聯(lián)系的服務(wù)的生態(tài)系統(tǒng),其中來(lái)自應(yīng)用程序的調(diào)用和用戶界面的調(diào)用,它們被視為API消費(fèi)者。
這種方法有許多優(yōu)點(diǎn)。例如,它使系統(tǒng)具有高度的可擴(kuò)展性,并減少了失敗幾率。它還降低了開(kāi)發(fā)成本,改善了開(kāi)發(fā)體驗(yàn),并通過(guò)加快開(kāi)發(fā)過(guò)程加快了上市速度。除了通過(guò)API促進(jìn)用戶和應(yīng)用程序之間的通信之外,它還促進(jìn)了內(nèi)部流程的自動(dòng)化和通信。
五、云原生設(shè)計(jì)原則
云原生應(yīng)用通常遵循12要素應(yīng)用框架中定義的原則,并圍繞安全性、彈性(和可用性)、彈性和性能(包括可擴(kuò)展性)構(gòu)建。讓我們進(jìn)一步了解這些云原生設(shè)計(jì)原則。
1.可擴(kuò)展性
可伸縮性背后的理念是,可以為應(yīng)用程序和相關(guān)服務(wù)添加額外的容量,以應(yīng)對(duì)需求和負(fù)載的增加。特別是,在設(shè)計(jì)可擴(kuò)展性時(shí),應(yīng)考慮每個(gè)應(yīng)用程序?qū)?、如何擴(kuò)展以及如何避免瓶頸。
在這種情況下,需要考慮三個(gè)關(guān)鍵領(lǐng)域:容量、負(fù)載和數(shù)據(jù)。
關(guān)于容量,請(qǐng)考慮是否需要擴(kuò)展各個(gè)層,以及是否可以在不影響應(yīng)用程序可用性的情況下進(jìn)行擴(kuò)展。你還需要考慮擴(kuò)展服務(wù)的速度,以及是否可以在不影響運(yùn)營(yíng)的情況下在業(yè)務(wù)服務(wù)外的時(shí)間縮減應(yīng)用程序的部署規(guī)模。
當(dāng)涉及到數(shù)據(jù)時(shí),請(qǐng)考慮是否可以擴(kuò)展,同時(shí)要記住服務(wù)的限制,如事務(wù)吞吐量和數(shù)據(jù)庫(kù)大小。然后,找出如何在保持平臺(tái)約束的同時(shí)對(duì)數(shù)據(jù)進(jìn)行分區(qū)以進(jìn)一步提高可伸縮性。同樣,你需要弄清楚如何高效地使用平臺(tái)資源。
在負(fù)載方面,你需要確定如何改進(jìn)設(shè)計(jì)以避免瓶頸,以及如何在流量高峰時(shí)使用異步操作來(lái)幫助負(fù)載平衡。你還需要探索如何使用所選平臺(tái)的不同速率均衡和負(fù)載平衡功能。
確保可擴(kuò)展性的一種方法是創(chuàng)建自動(dòng)化流程,以便在需要時(shí)擴(kuò)展、修復(fù)和部署系統(tǒng)。您可以設(shè)置系統(tǒng)以生成有意義的日志(以及事件),然后將其用作不同自動(dòng)化活動(dòng)的掛鉤。生成的系統(tǒng)應(yīng)該能夠自動(dòng)調(diào)配基礎(chǔ)設(shè)施,如機(jī)器實(shí)例,構(gòu)建、測(cè)試和部署CI/CD管道中的不同階段,并處理動(dòng)態(tài)可擴(kuò)展性和運(yùn)行狀況監(jiān)視和備份。
許多人認(rèn)為云原生系統(tǒng)應(yīng)該是無(wú)狀態(tài)的,但這在現(xiàn)實(shí)應(yīng)用中很難實(shí)現(xiàn)。由于在分布式應(yīng)用程序中很難管理狀態(tài),所以最好盡可能使用無(wú)狀態(tài)組件。這是因?yàn)闊o(wú)狀態(tài)組件使負(fù)載平衡、擴(kuò)展、修復(fù)和回滾更加容易。
2.可用性
可用性是指如果底層操作系統(tǒng)、硬件、網(wǎng)絡(luò)依賴性或應(yīng)用程序本身出現(xiàn)了故障,系統(tǒng)仍能對(duì)消費(fèi)者可用的能力。重要原則包括性能、正常運(yùn)行時(shí)間、災(zāi)難恢復(fù)和備份。
當(dāng)涉及到性能時(shí),你需要定義可接受的性能級(jí)別、如何衡量它們,以及當(dāng)性能低于可接受級(jí)別時(shí)應(yīng)觸發(fā)的操作或事件。你還需要確定應(yīng)用程序中最可能導(dǎo)致問(wèn)題的部分,以及以隊(duì)列為中心的設(shè)計(jì)或自動(dòng)縮放是否有助于解決問(wèn)題。此外,你需要弄清楚使云原生系統(tǒng)的某些部分異步是否有助于提高性能。
正常運(yùn)行時(shí)間保證也很重要。特別是,你需要定義產(chǎn)品應(yīng)滿足的SLA,以及你選擇的云服務(wù)是否可能滿足這些SLA。同時(shí),在災(zāi)難恢復(fù)方面,你需要確定在發(fā)生故障時(shí)如何重建云原生系統(tǒng),以及在這種情況下可以承受多少數(shù)據(jù)損失。最后,還需要確定在發(fā)生故障時(shí)如何處理備份、運(yùn)行中隊(duì)列和消息,并確定要將鏡像存儲(chǔ)在何處以及是否有備份。
最后,在復(fù)制方面,你需要確定系統(tǒng)中存在高故障風(fēng)險(xiǎn)的部分以及受故障影響最大的部分。此外,確定是否需要數(shù)據(jù)副本以及如何防止不可靠數(shù)據(jù)的副本帶來(lái)的影響。
3.安全性
云原生數(shù)據(jù)系統(tǒng)中的安全性是一個(gè)非常廣泛的話題,涉及很多方面。首先,但也最重要的是,你需要了解以下內(nèi)容:
保存數(shù)據(jù)的所在地的當(dāng)?shù)胤ü茌爡^(qū)和法律,包括保存度量和故障切換數(shù)據(jù)的國(guó)家/地區(qū)
如果是混合云應(yīng)用程序,如何保護(hù)云和企業(yè)網(wǎng)絡(luò)之間的鏈接
是否能夠滿足聯(lián)邦安全的要求
如何控制對(duì)云提供商管理門(mén)戶的訪問(wèn)、處理密碼更改以及限制對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。
如何處理云供應(yīng)商和操作系統(tǒng)安全更新和修補(bǔ)程序
4.可管理性
可管理性是指了解系統(tǒng)性能和運(yùn)行狀況以及管理操作的能力。關(guān)于云,我們必須考慮兩個(gè)原則?—?部署和監(jiān)測(cè)。
當(dāng)涉及到部署時(shí),需要問(wèn)自己一些問(wèn)題。例如,考慮如何實(shí)現(xiàn)部署的自動(dòng)化,以及如何在不中斷實(shí)時(shí)系統(tǒng)的情況下修補(bǔ)或重新部署。此外,考慮如何檢查部署是否成功,以及在部署失敗時(shí)如何回滾。同樣,部署還包括確定需要的環(huán)境數(shù)量以及它們需要多少存儲(chǔ)和可用性。
同時(shí),對(duì)于監(jiān)控方面,你需要計(jì)劃如何監(jiān)控應(yīng)用程序(打算使用現(xiàn)成的服務(wù)還是從頭開(kāi)始開(kāi)發(fā)?)以及將監(jiān)控?cái)?shù)據(jù)物理存儲(chǔ)在何處。你還需要確定監(jiān)控計(jì)劃將產(chǎn)生的數(shù)據(jù)量,以及如何訪問(wèn)度量日志。類(lèi)似地,問(wèn)問(wèn)自己是否能夠承受丟失一些日志數(shù)據(jù),以及是否需要在運(yùn)行時(shí)更改監(jiān)控級(jí)別。
5.可行性
最后,可行性包括在時(shí)間和預(yù)算限制的情況下維護(hù)和交付系統(tǒng)。這一原則需要考慮的一些事項(xiàng)是:
- 是否可以滿足SLA?例如,是否有云提供商可以保證需要向客戶提供的正常運(yùn)行時(shí)間?
- 是否擁有構(gòu)建云應(yīng)用程序所需的內(nèi)部經(jīng)驗(yàn)和技能,或者需要將其交給第三方?
- 要在收益和成本之間權(quán)衡,維持云提供商復(fù)雜定價(jià)的同時(shí)能接受的花費(fèi)
六、一個(gè)優(yōu)秀的云原生數(shù)據(jù)平臺(tái)具備的特征
你已經(jīng)知道了在創(chuàng)建云原生平臺(tái)時(shí)應(yīng)該考慮的原則和架構(gòu)考慮因素。現(xiàn)在讓我們來(lái)看看一個(gè)好的平臺(tái)應(yīng)該提供哪些更多的功能。
1.成本效益
完全托管管理的云服務(wù)和內(nèi)部部署/自我管理的服務(wù)的成本確實(shí)存在很大差異。然而,前者的彈性和大多數(shù)云平臺(tái)遵循的按使用付費(fèi)模式,使得可以在沒(méi)有任何資源(成本以及)浪費(fèi)的情況下運(yùn)行適當(dāng)?shù)囊?guī)模。
這也意味著你無(wú)需擔(dān)心為未使用的資源支付額外費(fèi)用,甚至無(wú)需處理容量規(guī)劃。此外,由于云平臺(tái)的多租戶,服務(wù)提供商可以以比自管理服務(wù)低得多的成本為其服務(wù)定價(jià)。
2.為你所用的付費(fèi)
如上所述,大多數(shù)云平臺(tái)都遵循按使用量付費(fèi)模式,這意味著你只需為所使用的資源付費(fèi),而不必為所提供的資源付費(fèi)。這些資源既可以是高級(jí)的(如API請(qǐng)求),也可以是底層的(如內(nèi)存或CPU使用)。因此,與本地?cái)?shù)據(jù)的情況不同,你不需要為可能根本不使用的許可核心付費(fèi)。
2.彈性和和擴(kuò)展性
一個(gè)好的云原生平臺(tái)還包括可以通過(guò)簡(jiǎn)單的API調(diào)用或點(diǎn)擊來(lái)擴(kuò)大或縮小服務(wù)規(guī)模。如果平臺(tái)能夠根據(jù)定義的策略自動(dòng)擴(kuò)展服務(wù),那就更好了。此外,由于預(yù)管理容量規(guī)劃和彈性擴(kuò)展,只有在最極端的情況下才會(huì)暴露可擴(kuò)展性限制。
4.可用性
高效的云原生平臺(tái)還由其高可用性定義,并設(shè)計(jì)用于處理大多數(shù)故障。例如,大多數(shù)平臺(tái)提供至少99.95%的服務(wù)水平協(xié)議,這意味著一年最多只會(huì)有4.5小時(shí)的停機(jī)時(shí)間。不過(guò),在現(xiàn)實(shí)中,你可以要求更高的可用性。
5.多租戶
多租戶有兩個(gè)好處?—?可管理性和規(guī)模經(jīng)濟(jì)性?—?大多數(shù)云原生服務(wù)都從中受益。首先,你可以使用S3這樣的服務(wù)為客戶提供最佳的用戶體驗(yàn),S3將服務(wù)作為查詢或請(qǐng)求而不是CPU提供。所有租戶都被隔離得很好,以至于用戶不知道同一個(gè)物理系統(tǒng)也為其他租戶服務(wù)。
是的,在某些情況下,用戶必須購(gòu)買(mǎi)專用計(jì)算資源,如內(nèi)存和CPU(AWS Aurora就是這樣)。然而,底層基礎(chǔ)設(shè)施(如存儲(chǔ)和網(wǎng)絡(luò))仍然是共享的。
6.性能優(yōu)化
最后,為了能夠服務(wù)不同類(lèi)型的客戶工作負(fù)載,你的系統(tǒng)應(yīng)該在多個(gè)維度上可擴(kuò)展。應(yīng)在整個(gè)基礎(chǔ)架構(gòu)(包括硬件、操作系統(tǒng)和應(yīng)用程序)中調(diào)整和優(yōu)化約束條件。此外,在管理系統(tǒng)的情況下,應(yīng)該有一個(gè)緊密的生產(chǎn)反饋機(jī)制。系統(tǒng)還應(yīng)能夠分析和學(xué)習(xí)不同的可擴(kuò)展性和性能相關(guān)事件,并推出改進(jìn)以優(yōu)化性能。
原文鏈接:https://dzone.com/articles/design-considerations-for-cloud-native-data-system
譯者介紹:
盧鑫旺,51CTO社區(qū)編輯,編程語(yǔ)言愛(ài)好者,對(duì)數(shù)據(jù)庫(kù),架構(gòu),云原生有濃厚興趣。?