我們通常都會(huì)在設(shè)想什么是一個(gè)Cloud Native Appliction,這也是我們?yōu)槭裁床煌5厝y(cè)試、學(xué)習(xí)各種云服務(wù),學(xué)習(xí)、使用docker的原因。本文介紹的云原生應(yīng)用的出發(fā)點(diǎn),可能和我們的有著異曲同工的地方,可能在某些方面說(shuō)的還是比較抽象,但是通過(guò)圖片,我們還是可以清晰明白在非云應(yīng)用往云生應(yīng)用的發(fā)展框架是什么,會(huì)帶來(lái)什么樣的好處等等,以及如何處理好不同域間容量、數(shù)據(jù)、狀態(tài)的關(guān)系。
最近有試著描述“現(xiàn)代應(yīng)用程序”或“現(xiàn)代工作負(fù)載”。
Twelve-Factor App就是一個(gè)很好的嘗試。
這是一個(gè)很好的方法來(lái)描述這樣的工作量但我認(rèn)為這些概念需要降低一個(gè)數(shù)量級(jí)使普通人正常理解他們。
這就是我想要在這個(gè)博文上做的。我們將省略一些重要的細(xì)節(jié)通過(guò)這樣做但沒(méi)關(guān)系。
讓我直接點(diǎn):在(我的意思是非常)高水平云本機(jī)應(yīng)用程序是一個(gè)應(yīng)用程序,該應(yīng)用程序有一個(gè)明確的“基礎(chǔ)設(shè)施”和“數(shù)據(jù)”之間的分離。至少在我看來(lái),設(shè)計(jì)一個(gè)云本機(jī)應(yīng)用程序沒(méi)有畫(huà)這個(gè)明確的分離。
我用數(shù)據(jù)作為一個(gè)非常松散的術(shù)語(yǔ)。你可能正在考慮一個(gè)“基于數(shù)據(jù)”(哪個(gè)都行)但這真的應(yīng)該包括“配置”。
另一種方法來(lái)描述這種分離可能是“容量”和“狀態(tài)”。不僅僅是這樣。
讓我們立刻開(kāi)始用一幅畫(huà)來(lái)描述這一概念:
請(qǐng)注意這兩個(gè)域的特征。
基礎(chǔ)設(shè)施容量沒(méi)有你需要或想要保護(hù)的自己的狀態(tài)(至少在本地存儲(chǔ)中)。
這是完全無(wú)狀態(tài),你可以通過(guò)自動(dòng)化輕松地(反復(fù))創(chuàng)建它,因此,它不需要有彈性。
另一方面承載了你的持久性的域(在每一個(gè)可能的形狀和形式)具有完全不同的特征,因?yàn)樗枰煽康摹⒏呖捎眯浴⒛陀煤瓦@一切。
此時(shí),您可能想知道這是如何不同與傳統(tǒng)模式相比在3層web應(yīng)用程序。在我看來(lái),云本機(jī)應(yīng)用程序在隔離傳統(tǒng)“應(yīng)用層”與傳統(tǒng)的“數(shù)據(jù)層”將envelope推到極端。
基礎(chǔ)設(shè)施容量域
這就是虛擬機(jī)(又名實(shí)例)實(shí)時(shí)托管原生云應(yīng)用的代碼。他們完全是無(wú)狀態(tài)的,他們是一群vm所有相同配置(基于角色)和整個(gè)生命周期的自動(dòng)化。在這樣一個(gè)環(huán)境中傳統(tǒng)IT概念通常關(guān)聯(lián)到虛擬機(jī)甚至沒(méi)有任何意義。下面是一些例子。
不安裝這些服務(wù)器(傳統(tǒng)方法),因?yàn)樗鼈兪怯勺詣?dòng)生成腳本由外部事件或政策觸發(fā)(如基于用戶(hù)需求自動(dòng)定量前端層)
不操作這些服務(wù)器,原因同上。
不記錄這些服務(wù)器做什么和如何提供它們,因?yàn)榇a生成文檔。
不備份這些服務(wù)器,因?yàn)樗麄儧](méi)有狀態(tài)。如果你失去了服務(wù)器,你重新實(shí)例這些服務(wù)器,從頭開(kāi)始。
你沒(méi)有這些服務(wù)器從一個(gè)地方遷移到另一個(gè),因?yàn)橥瑯拥脑颉D阒匦聦?shí)例這些服務(wù)器,從頭開(kāi)始。
你不用云平臺(tái)級(jí)別提供高可用性來(lái)保護(hù)這些服務(wù)器。沒(méi)有任何保護(hù),如果他們失敗了,你重新實(shí)例服務(wù)器。
你不需要為這些服務(wù)規(guī)劃基礎(chǔ)設(shè)施的大小,你只需為任何給定的時(shí)間點(diǎn)上的消費(fèi)。
你配置基礎(chǔ)設(shè)施的本質(zhì)與運(yùn)行代碼中的一部分一樣。你聽(tīng)說(shuō)過(guò)“基礎(chǔ)設(shè)施及代碼”的概念嗎?這就是了。
現(xiàn)今,相當(dāng)常見(jiàn)的看到實(shí)現(xiàn)這類(lèi)模式被用于實(shí)現(xiàn)配置工具組合,然后切換到配置管理工具。
這個(gè)想法是為了提供虛擬機(jī),讓配置工具給客人創(chuàng)建適當(dāng)?shù)膫€(gè)性和角色。
AWS Cloudformations,HashiCorp Terraform,VMware Application Director,RightScale CMP這些都是專(zhuān)注于可編程初始化實(shí)例的幾個(gè)例子。
Puppet, Chef, Ansible (等等) 是配置管理工具,專(zhuān)注于通過(guò)自動(dòng)化確保實(shí)例融合,給定一致的配置和狀態(tài)。
截至2014年底,這幾乎是目前的狀況(和最佳實(shí)踐)。
然而幾個(gè)新趨勢(shì)和模式在上升。他們可能最終收斂匯聚,在某種程度上,你可以看作為一種趨勢(shì)。
第一個(gè)被稱(chēng)為不變的工作負(fù)載。目前為止,我們已經(jīng)討論了被稱(chēng)為可變負(fù)載,這意味著他們的配置可以改變加班一樣配置管理工具配置和重新配置他們需要讓他們收斂到一個(gè)理想的最終狀態(tài)。換句話(huà)說(shuō)云本機(jī)應(yīng)用程序當(dāng)前的最佳實(shí)踐建議提供一個(gè)基礎(chǔ)模板和在操作系統(tǒng)核心模板,確保核心模板使用特定的配置。不變工作量的哲學(xué)表明,實(shí)例相對(duì)應(yīng)的應(yīng)該是不變的,如果你需要重新配置一個(gè)實(shí)例(如更新應(yīng)用程序代碼),你應(yīng)該摧毀這個(gè)實(shí)例并重新立即部署它最新的配置到模板中。
第二個(gè)趨勢(shì)是朝著簡(jiǎn)化整個(gè)堆棧包括這些工作負(fù)載。目前常見(jiàn)的做法是使用虛擬機(jī)作為一個(gè)占位符,用于運(yùn)行時(shí)(例如AWS EC2實(shí)例或VMware虛擬機(jī))。這些天有一所新學(xué)校的想法說(shuō)虛擬機(jī)太大,太臃腫和云本機(jī)應(yīng)用程序太重,容器是一個(gè)更好的方式來(lái)打包和部署云本機(jī)應(yīng)用程序。我相信你聽(tīng)說(shuō)過(guò)Docker和相關(guān)的動(dòng)量(或者說(shuō)是科技泡沫?)。這也很符合另一個(gè)趨勢(shì)(微服務(wù)),這一個(gè)博文不夠說(shuō)了。
有趣的是,許多人也認(rèn)為這種容器化趨勢(shì)只是某個(gè)東西更大(呃,或者說(shuō)更小?)的過(guò)渡。
援引:Invent 2014 AWS介紹了一項(xiàng)新服務(wù),被稱(chēng)為L(zhǎng)ambda云本機(jī)應(yīng)用程序。這個(gè)可以允許開(kāi)發(fā)人員編寫(xiě)代碼并把代碼作為數(shù)據(jù)的一部分。當(dāng)數(shù)據(jù)發(fā)生變化時(shí),事件觸發(fā)代碼運(yùn)行。沒(méi)有虛擬機(jī),沒(méi)有選擇的容器,代碼只是突然地運(yùn)行起來(lái)。換句話(huà)說(shuō),基礎(chǔ)設(shè)施沒(méi)有簡(jiǎn)化,它只是消失了。
下圖描述了圖形化這一概念:
你可以想象這些概念將會(huì)話(huà)通向PaaS-ish模型。
數(shù)據(jù)和狀態(tài)域
現(xiàn)在將自己傳送到另一個(gè)維度。
轉(zhuǎn)換思維。
持久性和彈性問(wèn)題。很多很多問(wèn)題。
有幾件事,屬于這個(gè)域。
最重要的一個(gè)就是在哪持有用戶(hù)數(shù)據(jù)。想想傳統(tǒng)的(關(guān)系型)數(shù)據(jù)庫(kù)但也可能是一個(gè)存儲(chǔ)庫(kù)的非結(jié)構(gòu)化數(shù)據(jù)(例如對(duì)象存儲(chǔ)、NoSQL)。往往這些服務(wù)是由云提供商提供管理服務(wù)。并沒(méi)有什么會(huì)阻止其他人寫(xiě)云本機(jī)應(yīng)用程序部署和管理他們自己的數(shù)據(jù)庫(kù)(關(guān)系型或非關(guān)系型),通常是利用諸如AWS RDS或AWS DynamoDB等管理服務(wù)。
這方法(有價(jià)值可選)的優(yōu)點(diǎn)是,你有你的持久性和可靠性保證而不是花時(shí)間讓自己發(fā)生。
最后,一個(gè)云提供商用一個(gè)完全自動(dòng)化的方式管理成百不一定上千的實(shí)例比一個(gè)人兼DBA特別是一個(gè)開(kāi)發(fā)人員,要好很多。
這些云托管服務(wù)的特點(diǎn)是,他們(通常)和水平呈線(xiàn)性比例關(guān)系。
以對(duì)象存儲(chǔ)為例,您可以在主宰無(wú)限(或觀念上的)的數(shù)據(jù)量。
想想諸如AWS DynamoDB等服務(wù),你只需要訂閱這個(gè)服務(wù)形成SLAs,云提供商將根據(jù)SLA管理所需的容量(后臺(tái))。
傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)(盡管管理,如AWS RDS)通常不提供這種感覺(jué)無(wú)限的可伸縮性,因?yàn)樗麄兂3O蛲鈹U(kuò)展(但不超出)和基于云實(shí)例支持管理數(shù)據(jù)庫(kù)大小才有的實(shí)際限制。
取決于你的選擇將會(huì)有一個(gè)變量的基礎(chǔ)設(shè)施和核心操作過(guò)程的可視性,但所有這些解決方案減輕很多負(fù)擔(dān)的持久性域的可伸縮、高可用性和彈性。
第二組持久性,屬于這個(gè)域的描述是基礎(chǔ)設(shè)施,隨著應(yīng)用程序棧,需要部署、推廣和運(yùn)營(yíng)。我把它叫做基礎(chǔ)結(jié)構(gòu)狀態(tài)。
這樣描述:
核心基礎(chǔ)設(shè)施應(yīng)該像什么樣的(又名“基礎(chǔ)設(shè)施及代碼”)
實(shí)例化應(yīng)用程序的存儲(chǔ)庫(kù)
應(yīng)用程序配置。
題外話(huà): Twelve-Factor App聲明中描述將應(yīng)用程序代碼從應(yīng)用程序配置中分離是一個(gè)最佳實(shí)踐。通過(guò)這樣做你可以實(shí)例化不同的環(huán)境(開(kāi)發(fā)、測(cè)試、分期、生產(chǎn))通過(guò)簡(jiǎn)單地指向一個(gè)不同的應(yīng)用程序配置。模塊化(各級(jí))規(guī)則在云本機(jī)應(yīng)用程序。
這種持久性的第二組數(shù)據(jù)和狀態(tài)域可以以不同的方式實(shí)現(xiàn)。這可能是一個(gè)(或多個(gè)):
一組AWS Cloudformations模板描述如何建模你的基礎(chǔ)設(shè)施容量
Puppet, Chef, Ansible, Saltstack或是Terraform,聲稱(chēng)讓你的虛擬機(jī)在運(yùn)行時(shí)通過(guò)給定的配置集中起來(lái)
服務(wù)如GitHub托管應(yīng)用程序的“代碼”
注意基礎(chǔ)設(shè)施狀態(tài)只是概念上的用戶(hù)數(shù)據(jù),它們共享相同的需求(一致、可靠、耐用等)。然而這些服務(wù)可以在物理上分開(kāi)。
雖然最近用一個(gè)云提供商一起把所有這些環(huán)境(基礎(chǔ)設(shè)施容量域和數(shù)據(jù)和狀態(tài)域)放在一起是相當(dāng)普遍的,大家也可以認(rèn)為他們是松散耦合的環(huán)境(如基礎(chǔ)設(shè)施容量由兩個(gè)云提供商,業(yè)務(wù)數(shù)據(jù)托管在第三個(gè)云提供商和基礎(chǔ)設(shè)施狀態(tài)托管在其他地方)。
讓我們一起把它們組裝起來(lái)
如果你試圖把所有上述成更詳細(xì)的圖片,云本機(jī)應(yīng)用程序?qū)⒖雌饋?lái)像是這樣。
在根據(jù)上述每個(gè)基礎(chǔ)設(shè)施狀態(tài)邏輯的描述實(shí)例化(和運(yùn)營(yíng))每個(gè)基礎(chǔ)設(shè)施,在運(yùn)行時(shí),應(yīng)用程序部署在開(kāi)始消費(fèi)和交互用戶(hù)數(shù)據(jù)(如數(shù)據(jù)庫(kù)、對(duì)象存儲(chǔ)等)。
這張照片缺少的(在許多其他事物)是可伸縮性這兩個(gè)域的性質(zhì)。這是另一個(gè)云平臺(tái)的核心原則,在這篇文章中我不不涉及過(guò)多。這兩種環(huán)境中可以根據(jù)外部觸發(fā)自然增長(zhǎng)和收縮(如越來(lái)越多的應(yīng)用程序用戶(hù)或越來(lái)越多組數(shù)據(jù)管理)。
因此應(yīng)用程序所有者將根據(jù)實(shí)際的,正在被應(yīng)用程序使用的,資源支付相關(guān)費(fèi)用。
你今天站在哪里?
我們已經(jīng)描述了一個(gè)云本機(jī)應(yīng)用程序的外觀。
但是,你處于什么位置?
很有可能,除非你是Netflix風(fēng)格組織,你不在我所說(shuō)的范圍內(nèi)。
很有可能你的工作負(fù)載可能看起來(lái)或多或少是這樣的:
你還記得 Pets and Cattle的故事嗎?
我不再重復(fù)了。你可以閱讀一下那個(gè)博客。
還要注意為何你沒(méi)有形成基礎(chǔ)設(shè)施容量和數(shù)據(jù)之間的關(guān)系。更不用說(shuō)基礎(chǔ)設(shè)施的狀態(tài)了。
95%的組織(完全編造的數(shù)字,但我覺(jué)得差不了多遠(yuǎn))本質(zhì)上是處理一群寵物,通過(guò)名字召喚,都有自己的獨(dú)特的個(gè)性和狀態(tài)(在本地保存),當(dāng)他們死的時(shí)候你會(huì)哭的很兇。
傳統(tǒng)的(即不是云原生的)應(yīng)用程序時(shí),您需要安裝,操作,文檔,備份,遷移和保護(hù)您的工作負(fù)載。這與你在云本機(jī)應(yīng)用程序上做的完全相反。
除此之外,沒(méi)有特定的分離容量和狀態(tài)。所有工作負(fù)載的狀態(tài)保存在本地磁盤(pán)上的每個(gè)實(shí)例。
在最好的情況下,狀態(tài)一直備份到一個(gè)Word或Excel文檔。如果(或者當(dāng)?)工作負(fù)載的接近滿(mǎn)負(fù)荷,操作員通常會(huì)手動(dòng)地通過(guò)一個(gè)簡(jiǎn)單的模板根據(jù)Word / Excel“使用說(shuō)明書(shū)”重裝一次。
其中的一些工作負(fù)載也以數(shù)據(jù)庫(kù)或文件的形式托管用戶(hù)數(shù)據(jù)。他們需要額外的照顧,這很復(fù)雜,甚至以后的可靠性和可伸縮性。
一個(gè)很好的試金石:看看您正在運(yùn)行的舊的應(yīng)用程序或云本機(jī)應(yīng)用程序是不是如下。
在周一早上11點(diǎn)邀請(qǐng)我到你的數(shù)據(jù)中心,關(guān)閉并摧毀20%的生產(chǎn)實(shí)例。
如果您的應(yīng)用程序部署自我修復(fù)本身沒(méi)有任何需要你的部分,如果有最小的不中斷你的終端用戶(hù)體驗(yàn),那么你正在運(yùn)行一個(gè)合適的云本機(jī)應(yīng)用程序。
相反,如果你是像“噢,我的天你做了什么?我有一個(gè)星期的工作現(xiàn)在在我的面前!”這樣的,所有你的手機(jī)瘋狂地響了,那么歡迎來(lái)到還有剩下的95%的人的現(xiàn)實(shí)世界。
記住,自動(dòng)化和自愈是云本機(jī)應(yīng)用程序的一個(gè)重要宗旨。我記得會(huì)見(jiàn)過(guò)一個(gè)客戶(hù),一個(gè)應(yīng)用程序(計(jì)算容量和數(shù)據(jù))分布在數(shù)據(jù)中心的架構(gòu)只為了保留一個(gè)完整的站點(diǎn)不中斷。他們告訴我,不幸的是,如果一個(gè)數(shù)據(jù)節(jié)點(diǎn)壞了,它將花費(fèi)數(shù)周,也許不是數(shù)月手動(dòng)重建環(huán)境。如果你問(wèn)我,那這不是云。
結(jié)論
還有許多其他云本機(jī)應(yīng)用程序的特點(diǎn),這里我不贅述了。如果你是一個(gè)高級(jí)的開(kāi)發(fā)人員加入到這個(gè)行列中,你最好立刻先把Twelve-Factor App 的說(shuō)明讀一遍。
在這篇文章中我想笨一點(diǎn)方式讓這些概念被更多的人明白(特別是沒(méi)有云或開(kāi)發(fā)人員背景的聽(tīng)眾)。
總而言之,我認(rèn)為強(qiáng)分離容量和狀態(tài)是其中一個(gè)強(qiáng)大的云咒語(yǔ),把大多數(shù)優(yōu)勢(shì)(和改變?)與傳統(tǒng)IT相比較。
這種分離是一個(gè)在任何級(jí)別的一個(gè)真正的云的基礎(chǔ)設(shè)施都是的核心原則。在這篇文章中,我利用一個(gè)大圖提到了全部的復(fù)雜的云本機(jī)應(yīng)用程序。
然而,即使你把云環(huán)境的最小的原子單元(即一個(gè)實(shí)例),分離容量和狀態(tài)仍然是核心。看看亞馬遜是如何描述由一個(gè)EC2實(shí)例與一對(duì)EBS磁盤(pán)(即持久的磁盤(pán))組成的一個(gè)基本的工作負(fù)載:
在一個(gè)小得多的規(guī)模它傳達(dá)了這篇文章我試圖傳達(dá)的同樣的信息(圖形化)。云中的各級(jí)模塊化是核心。
題外話(huà):具有諷刺意味的是,EC2默認(rèn)為臨時(shí)的磁盤(pán),那么云本機(jī)應(yīng)用程序模式(在實(shí)例級(jí)不需要狀態(tài)存儲(chǔ))。然而,為了更好地服務(wù)傳統(tǒng)非云本機(jī)應(yīng)用程序,亞馬遜引入一個(gè)EBS(單一實(shí)例級(jí)別持久性)的概念。一個(gè)可以稱(chēng)為在持久的磁盤(pán)anti-cloud模式的實(shí)例。我將因?yàn)檫@點(diǎn)拋棄它。
最后,正如你可能已經(jīng)猜到了,在這篇文章中你所讀到的關(guān)于云本機(jī)應(yīng)用程序會(huì)引入其他流行語(yǔ)如:敏捷,DevOps,持續(xù)性開(kāi)發(fā)、持續(xù)性部署和更多更多。
事實(shí)上,沒(méi)有一個(gè)正確設(shè)計(jì)云本機(jī)應(yīng)用程序沒(méi)有辦法,做到這些的。
Massimo。