?譯者 | 盧鑫旺
審校 | 孫淑娟
在設(shè)計云原生數(shù)據(jù)系統(tǒng)時,并沒有特定的托管基礎(chǔ)設(shè)施、編程語言或者設(shè)計模式。構(gòu)建云原生系統(tǒng)有多種多樣的方式。讓我們來看一看云原生架構(gòu)應該牢記的設(shè)計原則,以及一個優(yōu)秀的云原生平臺具備哪些特征。
一、云原生架構(gòu)
云原生架構(gòu)本質(zhì)上是使用云構(gòu)建應用程序的設(shè)計模式。雖然沒有具體的方法來實現(xiàn)這種架構(gòu)或預定義的云原生設(shè)計,但最常見的方法是將應用程序分解為幾個微服務,讓每個微服務處理不同類型的功能。然后,每個微服務都由一個小團隊維護,通常作為容器部署。

讓我們來進一步看看云原生架構(gòu)。
二、擁抱微服務
云原生設(shè)計和開發(fā)依賴于松耦合的架構(gòu),應用程序的不同部分獨立開發(fā),獨立操作,獨立部署,通常使用微服務實現(xiàn)。
可以肯定地說,微服務是云原生系統(tǒng)的基礎(chǔ)。通過使用容器,可以將運行時環(huán)境及其庫、二進制文件和依賴項壓縮為有邏輯且易于管理的單元,從而從中受益。因此,應用程序服務可以根據(jù)需要存儲、復制、傳輸和使用。

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

1.成本效益
完全托管管理的云服務和內(nèi)部部署/自我管理的服務的成本確實存在很大差異。然而,前者的彈性和大多數(shù)云平臺遵循的按使用付費模式,使得可以在沒有任何資源(成本以及)浪費的情況下運行適當?shù)囊?guī)模。
這也意味著你無需擔心為未使用的資源支付額外費用,甚至無需處理容量規(guī)劃。此外,由于云平臺的多租戶,服務提供商可以以比自管理服務低得多的成本為其服務定價。
2.為你所用的付費
如上所述,大多數(shù)云平臺都遵循按使用量付費模式,這意味著你只需為所使用的資源付費,而不必為所提供的資源付費。這些資源既可以是高級的(如API請求),也可以是底層的(如內(nèi)存或CPU使用)。因此,與本地數(shù)據(jù)的情況不同,你不需要為可能根本不使用的許可核心付費。
2.彈性和和擴展性
一個好的云原生平臺還包括可以通過簡單的API調(diào)用或點擊來擴大或縮小服務規(guī)模。如果平臺能夠根據(jù)定義的策略自動擴展服務,那就更好了。此外,由于預管理容量規(guī)劃和彈性擴展,只有在最極端的情況下才會暴露可擴展性限制。
4.可用性
高效的云原生平臺還由其高可用性定義,并設(shè)計用于處理大多數(shù)故障。例如,大多數(shù)平臺提供至少99.95%的服務水平協(xié)議,這意味著一年最多只會有4.5小時的停機時間。不過,在現(xiàn)實中,你可以要求更高的可用性。
5.多租戶
多租戶有兩個好處?—?可管理性和規(guī)模經(jīng)濟性?—?大多數(shù)云原生服務都從中受益。首先,你可以使用S3這樣的服務為客戶提供最佳的用戶體驗,S3將服務作為查詢或請求而不是CPU提供。所有租戶都被隔離得很好,以至于用戶不知道同一個物理系統(tǒng)也為其他租戶服務。
是的,在某些情況下,用戶必須購買專用計算資源,如內(nèi)存和CPU(AWS Aurora就是這樣)。然而,底層基礎(chǔ)設(shè)施(如存儲和網(wǎng)絡(luò))仍然是共享的。
6.性能優(yōu)化
最后,為了能夠服務不同類型的客戶工作負載,你的系統(tǒng)應該在多個維度上可擴展。應在整個基礎(chǔ)架構(gòu)(包括硬件、操作系統(tǒng)和應用程序)中調(diào)整和優(yōu)化約束條件。此外,在管理系統(tǒng)的情況下,應該有一個緊密的生產(chǎn)反饋機制。系統(tǒng)還應能夠分析和學習不同的可擴展性和性能相關(guān)事件,并推出改進以優(yōu)化性能。
原文鏈接:https://dzone.com/articles/design-considerations-for-cloud-native-data-system
譯者介紹:
盧鑫旺,51CTO社區(qū)編輯,編程語言愛好者,對數(shù)據(jù)庫,架構(gòu),云原生有濃厚興趣。?
































