云原生數(shù)據(jù)系統(tǒng)的設(shè)計考慮
當(dāng)涉及設(shè)計云原生數(shù)據(jù)系統(tǒng)時,并沒有特定的托管基礎(chǔ)設(shè)施、編程語言或設(shè)計模式是您應(yīng)該使用的。云原生系統(tǒng)有各種不同的規(guī)模和形式。然而,確實存在大多數(shù)遵循相同云原生設(shè)計原則的系統(tǒng)。讓我們來看一下云原生架構(gòu)、您應(yīng)該記住的設(shè)計原則以及構(gòu)成一個良好的云原生平臺的特點。
云原生架構(gòu)云原生架構(gòu)本質(zhì)上是為云端構(gòu)建的應(yīng)用程序的設(shè)計模式。雖然沒有特定的實現(xiàn)方式或預(yù)定義的云原生設(shè)計,但最常見的方法是將應(yīng)用程序拆分成多個微服務(wù),讓每個微服務(wù)處理不同的功能。每個微服務(wù)由一個小團隊維護,并通常部署為容器。
擁抱微服務(wù)云原生設(shè)計和開發(fā)依賴于松散耦合的架構(gòu),在該架構(gòu)中,應(yīng)用程序的不同部分是獨立開發(fā)、操作和部署的。通常通過使用微服務(wù)來實現(xiàn)這一點。
微服務(wù)可以說是云原生系統(tǒng)的基礎(chǔ),通過使用容器,您可以將運行時環(huán)境及其庫、二進制文件和依賴關(guān)系壓縮為一個邏輯和易于管理的單元,從而獲得實際好處。因此,應(yīng)用服務(wù)可以根據(jù)需要存儲、復(fù)制、傳輸和使用。
與單體應(yīng)用程序不同,微服務(wù)由小的獨立服務(wù)組成。
使用微服務(wù)(或松散耦合的架構(gòu))對于云計算來說是重要的,原因有很多。例如,它促進了簡化、可擴展性和彈性。讓我們更詳細地看一下為什么會這樣。
通過這種架構(gòu),您可以將復(fù)雜的應(yīng)用程序分解為較小的獨立部分,使應(yīng)用程序開發(fā)周期簡單并易于管理。更不用說,將應(yīng)用程序配置和基礎(chǔ)代碼分離也使應(yīng)用程序的開發(fā)和維護更加容易。同樣,將核心應(yīng)用程序與后端服務(wù)分離允許代碼庫以自己的步調(diào)演變和擴展。
而且,相較于整個單體應(yīng)用程序,擴展或縮減一個應(yīng)用程序的個別部分更容易(也更快)。同樣,由于只需更新需要更改的部分(或微服務(wù)),而不是再次部署新的更新版本的整個應(yīng)用程序,所以更新應(yīng)用程序更加容易。
擁抱微服務(wù)還增加了韌性,使應(yīng)用程序更可靠。如果微服務(wù)架構(gòu)中的一個組件失敗,整個應(yīng)用程序不會崩潰。它還促進了基礎(chǔ)設(shè)施即代碼(Infrastructure as Code),從而為自動化部署鋪平了道路。最后,微服務(wù)架構(gòu)通過API使用無狀態(tài)進程和組件,將每個微服務(wù)與其他服務(wù)隔離開來,從而實現(xiàn)更好的安全性和效率。
要確保您的應(yīng)用程序遵循松散耦合的架構(gòu),您需要避免在不同部分之間形成緊密耦合的依賴關(guān)系。例如,兩個微服務(wù)不應(yīng)該依賴于同一個數(shù)據(jù)庫。如果它們這樣做,您將無法獨立地更新和操作它們。
一切都作為代碼雖然使用微服務(wù)從現(xiàn)代應(yīng)用程序中獲益很重要,但采用自動化實踐也同樣重要。它的目的是優(yōu)化應(yīng)用程序開發(fā)流程,使開發(fā)人員和用戶都能受益。為此,最終目標(biāo)是實現(xiàn)EaC - 一切作為代碼。將EaC視為IaC的進一步步驟,其中包括應(yīng)用程序代碼庫、基礎(chǔ)架構(gòu)和平臺。
這種方法有很多優(yōu)點。例如,它使系統(tǒng)高度可擴展,降低了故障的可能性。它還能減少開發(fā)成本,改善開發(fā)體驗,并通過加快開發(fā)流程提高上市速度。此外,除了通過API促進用戶與應(yīng)用程序之間的通信,它還促進了內(nèi)部流程的自動化和通信。
云原生設(shè)計原則云原生應(yīng)用通常遵循12要素應(yīng)用框架中定義的原則,并圍繞安全性、彈性(和可用性)、彈性和性能(包括可擴展性)構(gòu)建。讓我們更詳細地看一下這些云原生設(shè)計原則。
可擴展性可擴展性的理念是為了能夠增加應(yīng)用程序和相關(guān)服務(wù)的額外容量,以處理需求和負載的增加。尤其是在設(shè)計可擴展性時,應(yīng)考慮每個應(yīng)用程序?qū)?、如何進行擴展以及如何避免瓶頸的問題。
在這種背景下,有三個關(guān)鍵方面需要考慮:容量、負載和數(shù)據(jù)。
在容量方面,需要考慮是否需要擴展各個層,并且在不影響應(yīng)用程序可用性的情況下是否可以進行擴展。還需要考慮服務(wù)的快速擴展速度,并且在非工作時間是否可以縮小應(yīng)用程序的規(guī)模而不影響運營。
在數(shù)據(jù)方面,需要考慮您是否可以進行擴展,并記住服務(wù)的約束條件,比如事務(wù)吞吐量和數(shù)據(jù)庫大小。找出如何對數(shù)據(jù)進行分區(qū)以進一步提高可擴展性,同時在平臺限制內(nèi)實現(xiàn)。同樣,您需要找出如何有效和高效地使用平臺資源。
在負載方面,您需要確定如何改進設(shè)計以避免瓶頸,并確定如何在高峰時段使用異步操作來幫助負載平衡。還需要探索如何使用所選平臺提供的不同速率平衡和負載均衡功能。
確??蓴U展性的一種方法是創(chuàng)建可隨時進行擴展、修復(fù)和部署的自動化流程。您可以設(shè)置系統(tǒng)以生成有意義的日志(從而產(chǎn)生事件),然后將其用作執(zhí)行不同自動化活動的鉤子。生成的系統(tǒng)應(yīng)能夠自動配置基礎(chǔ)設(shè)施,如機器實例,構(gòu)建、測試和部署CI/CD管道中的不同階段,并處理動態(tài)擴展、健康監(jiān)控和備份。
許多人認為云原生系統(tǒng)應(yīng)該是無狀態(tài)的,但實際應(yīng)用中很難實現(xiàn)。但是,由于在分布式應(yīng)用程序中管理狀態(tài)很困難,因此最好在盡可能多的情況下使用無狀態(tài)組件。這是因為無狀態(tài)組件使加載、平衡、擴展、修復(fù)和回滾更加容易。
可用性可用性指的是在底層操作系統(tǒng)、硬件、網(wǎng)絡(luò)依賴或應(yīng)用程序本身的故障情況下,系統(tǒng)仍能對用戶有用的能力。重要的原則包括性能、可用時間、災(zāi)難恢復(fù)和復(fù)制。
在性能方面,您需要定義可接受的性能水平,如何衡量它們以及當(dāng)性能低于可接受水平時觸發(fā)的操作或事件。還需要確定最可能引起問題的應(yīng)用程序部分,以及隊列中心化設(shè)計或自動縮放是否有助于解決這些問題。此外,您還需要確定使云原生系統(tǒng)的某些部分異步化是否有助于提高性能。
可用性保證也是需要考慮的重要因素。特別是需要定義產(chǎn)品應(yīng)滿足的服務(wù)級別協(xié)議(SLAs),以及您選擇的云服務(wù)是否能夠達到這些協(xié)議。同時,在災(zāi)難恢復(fù)方面,需要確定在系統(tǒng)故障的情況下如何重新構(gòu)建基于云的系統(tǒng),以及在這種情況下您能承受多少數(shù)據(jù)丟失。您還需要確定在系統(tǒng)故障的情況下如何處理備份、傳輸隊列和消息,并確定虛擬機鏡像存儲的位置以及是否有備份。
最后,在復(fù)制方面,您需要確定系統(tǒng)中存在哪些高風(fēng)險故障部分,以及哪些部分會受到故障的最大影響。此外,確定是否需要數(shù)據(jù)復(fù)制,以及如何防止復(fù)制損壞的數(shù)據(jù)。
安全性云原生數(shù)據(jù)系統(tǒng)的安全性是一個相當(dāng)廣泛的話題,涉及許多內(nèi)容。但最重要的是,您需要弄清楚以下幾點:
數(shù)據(jù)所在地的法律管轄權(quán)和法律規(guī)定,包括指標(biāo)和故障轉(zhuǎn)移數(shù)據(jù)存儲的國家。如果您使用混合云應(yīng)用程序,您如何保護云與企業(yè)網(wǎng)絡(luò)之間的鏈接。是否存在應(yīng)滿足聯(lián)合安全性的任何要求。如何控制對云提供商管理門戶的訪問,處理密碼更改并限制對數(shù)據(jù)庫的訪問。如何處理供應(yīng)商和操作系統(tǒng)的安全更新和補丁??晒芾硇钥晒芾硇允侵咐斫庀到y(tǒng)性能和健康狀況以及管理運維的能力。在云方面,我們需要考慮兩個原則-部署和監(jiān)控。
在部署方面,您需要考慮幾個問題。例如,考慮如何自動化部署以及如何在不影響實時系統(tǒng)的情況下進行修補或重新部署。還要考慮如何檢查部署是否成功,并在部署失敗時如何回滾。類似地,部署還涉及確定所需的環(huán)境數(shù)量以及它們所需的存儲空間和可用性。
與此同時,在監(jiān)控方面,您需要計劃如何監(jiān)控應(yīng)用程序(是否使用現(xiàn)成的服務(wù)還是自行開發(fā)?)以及在物理上存儲監(jiān)控數(shù)據(jù)的位置。您還需要確定監(jiān)控計劃將產(chǎn)生多少數(shù)據(jù)以及如何訪問指標(biāo)日志。同樣,詢問自己是否可以承受一些日志數(shù)據(jù)的丟失,并在運行時是否需要更改監(jiān)控級別。
可行性最后,可行性包括在時間和預(yù)算限制下維護和交付系統(tǒng)的能力。對于這一原則,您需要考慮以下幾點:
是否可能滿足服務(wù)級別協(xié)議?例如,是否有云提供商保證您需要向客戶提供的可用性?您是否擁有內(nèi)部構(gòu)建云應(yīng)用程序所需的必要經(jīng)驗和技能,或者是否需要將其交給第三方?您可以接受什么樣的權(quán)衡,并在復(fù)雜的云提供商定價中可以花多少資金用于運營成本?良好的云原生數(shù)據(jù)平臺特征現(xiàn)在,您已經(jīng)了解了制作云原生平臺時應(yīng)牢記的原則和架構(gòu)考慮因素?,F(xiàn)在讓我們看看一個優(yōu)秀平臺應(yīng)該提供的一些更多功能。設(shè)計良好的云原生平臺的優(yōu)勢。
良好設(shè)計的云原生平臺的優(yōu)勢(來源)
成本效益毫無疑問,完全托管的云服務(wù)與自行管理的本地服務(wù)之間存在很大差異。然而,前者的彈性和大多數(shù)云平臺的按需付費模式使得可以以最低的資源(同時也是成本)浪費來運行適當(dāng)規(guī)模的系統(tǒng)。
這意味著您不需要擔(dān)心為未使用的資源支付額外費用,甚至不需要進行容量規(guī)劃。此外,由于云平臺的多租戶性質(zhì),服務(wù)提供商可以以比自行管理服務(wù)更低的成本定價他們的服務(wù)。
按使用量付費如上所述,大多數(shù)云平臺采用按使用量付費模式,這意味著您只需為實際使用的資源付費,而不是根據(jù)預(yù)配置的資源來支付費用。這些資源既可以是高級別的(如API請求和響應(yīng)),也可以是低級別的(如內(nèi)存或CPU使用率)。因此,與本地數(shù)據(jù)相比,您無需為可能根本不使用的許可核心支付費用。
彈性和可擴展性良好的云原生平臺還包括可以通過簡單的API調(diào)用或單擊進行自動縮放的服務(wù)。如果平臺可以根據(jù)定義的策略自動縮放服務(wù),那將更好。由于預(yù)先管理的容量規(guī)劃和彈性縮放,只有在極端情況下才會暴露可擴展性限制。
可用性高效的云原生平臺也具有高可用性,并設(shè)計為處理大多數(shù)故障。大多數(shù)平臺提供至少99.95%的服務(wù)級別協(xié)議,這意味著一年中的停機時間不超過4.5小時,但實際上,您可以期望更高的可用性。
多租戶多租戶有兩個好處-可管理性和規(guī)模經(jīng)濟-大多數(shù)云原生服務(wù)從中受益。您可以通過像S3這樣的服務(wù)提供最佳用戶體驗,它以查詢或請求的方式提供服務(wù),而所有租戶都經(jīng)過良好的隔離,用戶不知道其他租戶也使用同一物理系統(tǒng)。
是的,在某些情況下,用戶確實需要購買專用的計算資源,如內(nèi)存和CPU(AWS Aurora就是這種情況),但底層基礎(chǔ)設(shè)施,如存儲和網(wǎng)絡(luò),仍然共享。
性能優(yōu)化最后,為了能夠處理不同類型的客戶工作負載,您的系統(tǒng)應(yīng)該在多個維度上具有可擴展性。約束條件應(yīng)在整個基礎(chǔ)架構(gòu)中得到對齊和優(yōu)化,包括硬件、操作系統(tǒng)和應(yīng)用程序。此外,在托管系統(tǒng)的情況下,應(yīng)該有與生產(chǎn)環(huán)境之間的緊密反饋機制。系統(tǒng)還應(yīng)具備分析和從不同的可擴展性和性能相關(guān)事件中學(xué)習(xí)的能力,并推出改進措施以優(yōu)化性能。