1. 程式人生 > >雲架構師進階攻略(1)

雲架構師進階攻略(1)



此文已由作者劉超授權網易雲社群釋出。

歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。

 

一、架構的三個維度和六個層面

             201810301002077a731b1d-260e-49a2-b1fd-c4de52b224d5.jpg

1.1、三大架構

在網際網路時代,要做好一個合格的雲架構師,需要熟悉三大架構。

第一個是IT架構,其實就是計算,網路,儲存。這是雲架構師的基本功,也是最傳統的雲架構師應該首先掌握的部分,良好設計的IT架構,可以降低CAPEX和OPEX,減輕運維的負擔。資料中心,虛擬化,雲平臺,容器平臺都屬於IT架構的範疇。

 

第二個是應用架構,隨著應用從傳統應用向網際網路應用轉型,僅僅搞定資源層面的彈性還不夠,常常會出現建立了大批機器,仍然撐不住高併發流量。因而基於微服務的網際網路架構,越來越成為雲架構師所必需的技能。良好設計的應用架構,可以實現快速迭代和高併發。資料庫,快取,訊息佇列等PaaS,以及基於SpringCloud和Dubbo的微服務框架,都屬於應用架構的範疇。

 

第三個是資料架構,資料成為人工智慧時代的核心資產,在做網際網路化轉型的同時,往往進行的也是數字化轉型,並有戰略的進行資料收集,這就需要雲架構師同時又大資料思維。有意識的建設統一的資料平臺,並給予資料進行數字化運營。搜尋引擎,Hadoop,Spark,人工智慧都屬於資料架構的範疇。

 

1.2、六個層面

 201810301002256cf10ff2-1560-4ada-acb5-445b1a45ef92.jpg

上面的三個維度是從人的角度出發的,如果從系統的角度出發,架構分六個層次。

         

第一個層次是基礎設施層,在資料中心裡面,會有大量的機架,大量的伺服器,並通過交換機和路由器將伺服器連線起來,有的應用例如Oracle是需要部署在物理機上的。為了管理的方便,在物理機之上會部署虛擬化,例如Vmware,可以將對於物理機複雜的運維簡化為虛擬機器靈活的運維。虛擬化採取的運維方式多是由運維部門統一管理,當一個公司裡面部門非常多的時候,往往要引入良好的租戶管理,基於Quota和QoS的資源控制,基於VPC的網路規劃等,實現從運維集中管理到租戶自助使用模式的轉換,託生於公有云的OpenStack在這方面做的是比較好的。隨著應用架構越來越重要,對於標準化交付和彈性伸縮的需求越來越大,容器最為軟體交付的集裝箱,可以實現基於映象的跨環境遷移,Kubernetes是容器管理平臺的事實標準。

 

第二個層次是資料層,也即一個應用的中軍大營,如果是傳統應用,可能會使用Oracle,並使用大量的儲存過程,有大量的表聯合查詢,成本也往往比較高。但是對於高併發的網際網路應用,需要進行微服務的拆分,資料庫例項會比較多,使用開源的Mysql是常見的選擇,大量的儲存過程和聯合查詢往往會使得微服務無法拆分,效能會比較差,因而需要放到應用層去做複雜的業務邏輯,資料庫表和索引的設計非常重要。當併發量比較大的時候,需要實現橫向擴充套件,就需要基於分散式資料庫,也是需要基於單庫良好的表和索引設計。對於結構比較靈活的資料,可以使用MongoDB資料庫,橫向擴充套件能力比較好。對於大量的聯合查詢需求,可以使用ElasticSearch之類的搜尋引擎來做,速度快,更加靈活。

 

第三個層次是中介軟體層,因為資料庫層往往需要保證資料的不丟失以及一些事務,因而併發效能不可能非常大,所以我們經常說,資料庫是中軍大營,不能所有的請求都到這裡來,因而需要一層快取層,用來攔截大部分的熱點請求。Memcached適合做簡單的key-value儲存,記憶體使用率比較高,而且由於是多核處理,對於比較大的資料,效能較好。但是缺點也比較明顯,Memcached嚴格來講沒有叢集機制,橫向擴充套件完全靠客戶端來實現。另外Memcached無法持久化,一旦掛了資料就都丟失了,如果想實現高可用,也是需要客戶端進行雙寫才可以。Redis的資料結構比較豐富,提供持久化的功能,提供成熟的主備同步,故障切換的功能,從而保證了高可用性。另外微服務拆分以後,有時候處理一個訂單要經過非常多的服務,處理過程會比較慢,這個時候需要使用訊息佇列,讓服務之間的呼叫變成對於訊息的訂閱,實現非同步處理。RabbitMQ和Kafka是常用的訊息佇列,當事件比較重要的時候,會結合資料庫實現可靠訊息佇列。

 

第四個層次是基礎服務層,有的時候成為中颱層,將通用的能力抽象為服務對外提供原子化介面。這樣上層可以根據業務需求,通過靈活的組合這些原子化介面,靈活的應對業務需求的變化,實現能力的複用,以及資料的統一管理,例如使用者資料,支付資料,不會分散到各個應用中。另外基礎服務層稱為應用和資料庫和快取的一個分界線,不應該所有的應用都直接連資料庫,一旦出現分庫分表,資料庫遷移,快取選型改變等,影響面會非常大,幾乎無法執行。如果將這些底層的變更攔截在基礎服務層,上層僅僅使用基礎服務層的介面,這樣底層的變化會對上層透明,可以逐步演進。

 

第五個層次是業務服務層,或者組合服務層,大部分的業務邏輯都是在這個層面實現,業務邏輯比較面向使用者,因而會經常改變,所以需要組合基礎服務的介面進行實現。在這一層,會經常進行服務的拆分,實現開發獨立,上線獨立,擴容獨立,容災降級獨立。微服務的拆分不應該是一個運動,而應該是一個遇到耦合痛點的時候,不斷解決,不斷演進的一個過程。微服務拆分之後,有時候需要通過分散式事務,保證多個操作的原子性,也是在組合服務層來實現的。

 

第六個層次是使用者介面層,也即對終端客戶呈現出來的介面和APP,但是卻不僅僅是介面這麼簡單。這一層有時候稱為接入層。在這一層,動態資源和靜態資源應該分離,靜態資源應該在接入層做快取,使用CDN進行快取。也應該UI和API分離,介面應該通過組合API進行資料拼裝。API會通過統一的API閘道器進行統一的管理和治理,一方面後端組合服務層的拆分對APP是透明的,一方面當併發量比較大的時候,可以在這一層實現限流和降級。

 

為了支撐這六個層次,在上圖的左側是一些公共能力。

·      持續整合和持續釋出是保證微服務拆分過程中的快速迭代,以及變更後保證功能不變的,不引入新的Bug。

·      服務發現和服務治理是微服務之間互相的呼叫,以及呼叫過程中出現異常情況下的熔斷,限流,降級策略。

·      大資料和人工智慧是通過收集各個層面的資料,例如使用者訪問資料,使用者下單資料,客服詢問資料等,結合統一的中臺,對資料進行分析,實現智慧推薦。

·      監控與APM是基礎設施的監控和應用的監控,發現資源層面的問題以及應用呼叫的問題。

 

作為一個雲架構師還是很複雜的,千里之行,始於足下,讓我們慢慢來。

 

二、瞭解雲端計算的歷史演進與基本原理


在一頭扎進雲端計算的汪洋大海之前,我們應該先有一個全貌的瞭解,有人說了解一個知識的起點,就是了解他的歷史,也就是知道他是如何一步一步到今天的,這樣如此龐大的一個體系,其實是逐步加進來的,這樣的知識體系對我們來說,就不是一個冷冰冰的知識網,而是一個有血有肉的人,我們只要沿著演進的線索,一步一步摸清楚他的脾氣就可以了。

 

如何把雲端計算講的通俗易懂,我本人思考了半天,最終寫下了下面這篇文章。

 

終於有人把雲端計算、大資料和人工智慧講明白了!

 

在這裡,我把核心的要點在這裡寫一下:

 

第一:雲端計算的本質是實現從資源到架構的全面彈性。所謂的彈性就是時間靈活性和空間靈活性,也即想什麼時候要就什麼時候要,想要多少就要多少。

資源層面的彈性也即實現計算、網路、儲存資源的彈性。這個過程經歷了從物理機,到虛擬化,到雲端計算的一個演進過程。

             2018103010030453290dcb-ae84-4e52-a7d5-e8242b59c77b.jpg

架構層面的彈性也即實現通用應用和自有應用的彈性擴充套件。對於通用的應用,多整合為PaaS平臺。對於自己的應用,通過基於指令碼的Puppet, Chef, Ansible到基於容器映象的容器平臺CaaS。

             20181030100317593da840-116a-430f-bac8-946e51ce04e4.jpg

第二:大資料包含資料的收集,資料的傳輸,資料的儲存,資料的處理和分析,資料的檢索和挖掘等幾個過程。

             20181030100428507313e8-24bd-4b5d-8a88-85c6aa47d696.jpg

當資料量很小時,很少的幾臺機器就能解決。慢慢的,當資料量越來越大,最牛的伺服器都解決不了問題時,怎麼辦呢?這時就要聚合多臺機器的力量,大家齊心協力一起把這個事搞定,眾人拾柴火焰高。

 

第三:人工智慧經歷了基於專家系統的計劃經濟,基於統計的巨集觀調控,基於神經網路的微觀經濟學三個階段。

             20181030100444dbad86b6-d6c9-4769-8d68-0458376e4c5b.jpg

三、開源軟體是進階的利器

 

架構師除了要掌握大的架構和理論之外,指導落地也是必備的技能,所謂既要懂設計模式,也要懂程式碼。那從哪裡去學習這些良好的,有借鑑意義的,可以落地的架構實踐呢?

 

這個世界上還是有很多有情懷的大牛的,尤其是程式設計師裡面,他們喜歡做一件什麼事情呢?開源。很多軟體都是有閉源就有開源,源就是原始碼。當某個軟體做的好,所有人都愛用,這個軟體的程式碼呢,我封閉起來只有我公司知道,其他人不知道,如果其他人想用這個軟體,就要付我錢,這就叫閉源。但是世界上總有一些大牛看不慣錢都讓一家賺了去。大牛們覺得,這個技術你會我也會,你能開發出來,我也能,我開發出來就是不收錢,把程式碼拿出來分享給大家,全世界誰用都可以,所有的人都可以享受到好處,這個叫做開源。

 

非常建議大家瞭解,深入研究,甚至參與貢獻開源軟體,因為收益匪淺。

 

第一:通過開源軟體,我們可以瞭解大牛們的架構原則,設計模式。

 

其實咱們平時的工作中,是很難碰到大牛的,他可能是你渴望而不可及的公司的員工,甚至在國外,你要想進這種公司,不刷個幾年題目,面試個N輪是進不去的。即便進去了,他可能是公司的高層,每天很忙,不怎麼見得到他,就算當面討教,時間也不會很長,很難深入交流。也有的大牛會選擇自主創業,或者是自由職業者,神龍見首不見尾,到了大公司都見不到。

 

但是感謝網際網路和開源社群,將大牛們拉到了我們身邊,你可以訂閱郵件組,可以加入討論群,可以看到大牛們的設計,看到很多人的評論,提問,還有大牛的回答,可以看到大牛的設計也不是一蹴而就完美的,看到逐漸演進的過程,等等。這些都是能夠幫助我們快速提升水平的地方,有的時候,拿到一篇設計,都要查資料看半天,一開始都可能好多的術語都看不懂,沒關係肯下他,當你看blueprints越來越順暢的時候,你就進步了。

 

第二:通過開源軟體,我們可以學習到程式碼級的落地實踐。

 

有時候我們能看到很多大牛寫的書和文章,也能看到很多理論的書籍,但是存在一個問題是,理論都懂,但是還是做不好架構。這是因為沒有看到程式碼,所有的理論都是空中樓閣,當你到了具體的程式碼設計層面,那些學會的設計模式,無法轉化為你自己的實踐。

 

好在開源軟體的程式碼都是公開的,凝結了大牛的心血,也能夠看到大牛在具體落地時候的取捨,一切那麼真實,看得見,摸得著。通過程式碼進行學習,配合理論知識,更容易獲得第一手的經驗,並且在自己做設計和寫程式碼的時候,馬上能夠對映到可以參考的場景,讓我們在做自己的系統的時候,少走彎路。

 

第三:通過開源軟體,我們可以加入社群,和其他技術人員在同一背景下共同進步

 

大牛我們往往不容易接觸到,正面討論技術問題的時間更是難能可貴,但是沒有關係,開源軟體構建了一個社群,大家可以在一起討論,你是怎麼理解的,別人是怎麼理解的,越討論越交流,越明晰,有時候和比你經驗稍微豐富一點的技術人員交流,可能比直接和大牛對話更加有直接作用。大牛的話可能讓你消化半天,依然不知所云,大牛可能覺得很多普通人覺得的難點是顯而易見的,不屑去解釋。但是社群裡面的技術人員,可能和你一樣慢慢進步過來的,知道哪些點是當年自己困惑的,如果踩過這一個個的坑,他們一點撥,你就會豁然開朗。

 

而且每個人遇到的具體情況不同,從事的行業不同,客戶的需求不同,因而軟體設計的時候考慮的因素不同,大牛是牛,但是不一定能夠遇到和你一樣的場景,但是社群裡面,有你的同行業的,背景相近的技術人員,你們可以討論出符合你們特定場景的解決方案。

 

第四:通過開源軟體,我們作為個人,比較容易找到工作

 

我們面試的時候,常常遇到的問題是,怎麼能夠把在原來工作中自己的貢獻,理解,設計,技術能力。其實我發現很多程式設計師不能很好的做的這一點,所以造成很多人面試很吃虧。原因之一是背景資訊不對稱,例如原來面臨的業務上很難的問題,面試官由於不理解背景,而且短時間解釋不清楚,而輕視候選人的水平,我也遇到過很多面試官才聽了幾分鐘,就會說,這不挺簡單的,你這樣這樣不就行了,然後徹底否定你們一個團隊忙了三年的事情。原因之二是很多有能力的程式設計師不會表達,導致真正寫程式碼的說不明白,可能原來在公司裡面一個績效非常好,一個績效非常差,但是到了面試官那裡就拉平了。原因之三是新的公司不能確定你在上家公司做的工作,到這一家都能用的,例如你做的工作有30%是和具體業務場景相關的,70%是通用技術,可能下家公司只會為你的通用技術部分買單。

 

開源軟體的好處就是,參與的人所掌握的技能都是通的,而且大家在同一個上下文裡面對話,面試官和候選人之間的資訊差比較少。掌握某個開源軟體有多難,不用候選人自己說,大家心裡都有數。

 

對於很多技術能力強,但是表達能力較弱的極少數人員來講,talk is cheap, show me the code,程式碼呈上去,就能夠表現出實力來了,而且面試官也不需要根據短短的半個小時瞭解一個人,可以做很多背景調查。

 

另外由於掌握的技術的通用的,你到下一家公司,馬上就能夠上手,幾乎不需要預熱時間,對於雙方都有好處。

 

第五:通過開源軟體,我們作為招聘方,比較容易招到相應人員。

 

如果在創業公司待過的朋友會了解到創業公司招人很難,人員流失很快,而且創業公司往往對於開發進度要求很快,因為大家都在搶時間。因而開源軟體對於招聘方來講,也是好訊息。首先創業公司沒辦法像大公司一樣,弄這麼多的技術大牛,自己完全落地一套自己的體系,使用開源軟體快速搭建一套平臺先上線是最好的選擇。其次使用開源軟體,會使得招聘相對容易,市場上火的開源軟體會有大批的從業者,參與各種論壇和社群,比較容易挖到人。最後,開源軟體的使用使得新人來了之後沒有預熱時間,來了就上手,保證開發速度。

 

那如何快速上手一款開源軟體呢?我寫了一篇文章

 

如何快速上手一款開源軟體

 

在這篇文章中,我總結了九個步驟。

 

·      一、手動安裝起來,一定要手動

·      二、使用一下,推薦XXX in Action系列

·      三、讀文件,讀所有的官方文件,記不住,看不懂也要讀下來

·      四、瞭解核心的原理和演算法,推薦XXX the definitive guide系列

·      五、看一本原始碼分析的書,會讓你的原始碼閱讀之旅事半功倍

·      六、開始閱讀核心邏輯原始碼

·      七、編譯並Debug原始碼

·      八、開發一個外掛,或者對元件做少量的修改

·      九、大量的運維實踐經驗和麵向真實場景的定製開發

 

所以做一個雲架構師,一定不能脫離程式碼,反而要不斷的擁抱開源軟體。

 

四、瞭解Linux基礎知識

 

作為一個雲架構師,首要的一點,就是要熟悉Linux的基礎知識,基本原理了。

說到作業系統,一般有三個維度,一個是桌面作業系統,一個是移動作業系統,一個是伺服器作業系統。

 

Stack Overflow Developer Survey 2018有這樣一個統計,對於開發人員來說,桌面作業系統的排名是Windows,MacOS,Linux,所以大部分人平時的辦公系統都是windows。

             20181030100510d817b381-d2d3-4a20-8d46-6ea984378cdf.jpg

當然因為辦公的原因,平時使用windows的比較多,所以在學校裡,很多同學接觸到的作業系統基本上都是Windows,但是一旦從事計算機行業,就一定要跨過Linux這道坎。

 

根據今年W3Techs的統計,對於伺服器端,Unix-Like OS佔到的比例為近70%。所謂Unix-Like OS 包括下圖的Linux,BSD等一系列。

             201810301005210b432bab-87b5-4452-8eb3-521b9c2dae24.jpg

             2018103010053100db409d-15d9-4abd-abf9-3bf5952fee42.jpg

從這個統計可以看出,隨著雲端計算的發展,軟體SaaS化,服務化,甚至微服務化,大部分的計算都是在服務端做的,因而要成為雲架構師,就必須懂Linux。

 

隨著移動網際網路的發展,客戶端基本上以Android和iOS為主,下圖是Gartner的統計。Android是基於Linux核心的。因而客戶端也進入了Linux陣營,很多智慧終端,智慧裝置等開發職位,都需要懂Linux的人員。

             2018103010055783cca8de-e4e2-4123-a70d-c4e03687f5d1.jpg

學習Linux主要包含兩部分,一個是怎麼用,一個是怎麼程式設計,背後原理是什麼。

 

對於怎麼用,上手的話,推薦《鳥哥的Linux私房菜》,按著這個手冊,就能夠學會基本的Linux的使用,如果再深入一點,推薦《Linux系統管理技術手冊》,磚頭厚的一本書,是Linux運維手邊必備。

 

對於怎麼程式設計,上手的話,推薦《UNIX環境高階程式設計》,有程式碼,有介紹,有原理,如果對核心的原理感興趣,推薦《深入理解LINUX核心》。

 

Linux的架構如下圖

             20181030100609c07eda53-f36a-45a6-ae1b-b55351c8b9a3.jpg

我們知道,一臺物理機上有很多的硬體,最重要的是CPU,記憶體,硬碟,網路,但是一個物理機上要跑很多的程式,這些資源應該給誰用呢?當然是大家輪著用,誰也別獨佔,誰也別餓死。為了完成這件事情,作業系統的核心就起到了大管家的作用,將硬體資源分配給不同的使用者程式使用,並且在適當的時間將資源拿回來,再分配給其他的使用者程序,這個過程稱為排程。

 

作業系統的功能之一是系統呼叫

 

當用戶程式想請求資源的時候,需要呼叫作業系統的系統呼叫介面,這是核心和使用者態程式的分界線,就像你要打車,要通過打車軟體的介面,下發打車指令一樣,這樣打車軟體才會給你排程一輛車。

 

作業系統的功能之二是程序管理

 201810301006202c3d9044-72bc-4b49-9308-c70afdf101da.jpg

當一個使用者程序執行的時候,核心為他分配的資源,總要有一個數據結構儲存,哪些資源分配給了這個程序。分配給這個程序的資源往往包括開啟的檔案,記憶體空間等。

             

作業系統的功能之三是記憶體管理

 

每個程序有獨立的記憶體空間,記憶體空間是程序用來存放資料的,就像一間一間的倉庫。為了程序使用方便,每個程序記憶體空間,在程序的角度來看都是獨立的,也即都是從0號倉庫,1號倉庫,一直到N號倉庫,都是獨享的。但是從作業系統核心的角度來看,當然不可能獨享,而是大家共享,M號倉庫只有一個,你用他就不能用,這就需要一個倉庫排程系統,將使用者程序的倉庫號和實際使用的倉庫號對應起來,例如程序1的10號倉庫,對應到真實的倉庫是110號,程序2的20號倉庫,對應到真實的倉庫是120號。

 

作業系統功能之四是檔案系統

 

對於Linux來講,很多東西都是檔案,例如程序號回對應一個檔案,建立一個網路連線也對應一個檔案。檔案系統多種多樣,為了能夠統一適配,有一個虛擬檔案系統的中間層VFS。

 

作業系統功能之五是裝置管理

 

裝置分兩種,一種是塊裝置,一種是字元裝置,例如硬碟就是塊裝置,可以格式化為檔案系統,再如滑鼠和鍵盤的輸入輸出是字元裝置。

 

作業系統功能之六是網路管理

 20181030100643bf8a5d32-07c7-4b97-91d0-7d9188e81bdb.jpg

其實對於Linux來講,網路也是基於裝置和檔案系統的,但是由於網路有自己的協議棧,要遵循TCP/IP協議棧標準。

 

             

對於Linux的基礎知識方面,我寫了幾篇文章如下。

 

圖說Linux程序

圖說Linux程序之二

圖說Linux程序之三

圖解Linux檔案系統

圖解Linux系統呼叫

Linux的虛擬檔案系統VFS

圖解Linux的Socket

 

五、瞭解資料中心和網路基礎知識

 

雲平臺當然會部署在資料中心裡面,由於資料中心裡面的硬體裝置也是非常專業的,因而很多地方機房部門和雲端計算部門是兩個部門,但是作為一個雲架構師,需要和機房部門進行溝通,因而需要一定的資料中心知識,在資料中心裡面,最難搞定的是網路,因而這裡面網路知識是重中之重。

 

下面這個圖是一個典型的資料中心圖。

             201810301007087284c43a-4627-4828-9c92-c54e5a401dc0.jpg

最外層是Internet Edge,也叫Edge Router,也叫Border Router,它提供資料中心與Internet的連線。

 

第一層core network,包含很多的core switches

 

·      Available Zone同Edge router之間通訊

·      Available Zone之間的通訊提供

·      提供高可用性連線HA

·      提供Intrusion Prevention Services

·      提供Distributed Denial of Service Attack Analysis and Mitigation

·      提供Tier 1 Load Balancer

 

第二層也即每個AZ的最上層,我們稱為Aggregation layer。

第三層是access layer,就是一個個機架的伺服器,用接入交換機連線在一起。

這是一個典型的三層網路結構,也即接入層、匯聚層、核心層三層。

對於資料中心,我寫了幾篇文章

 

資料中心長啥樣?

高可用性的幾個級別

當客戶在說要安全的時候,客戶在想什麼?

 

除了資料中心以外,哪怕是做應用架構,對於網路的瞭解也是必須的。

雲架構說到底是分散式架構,既然是分散式,就是去中心化的,因而就需要系統之間通過網路進行互通,因而網路是作為大規模系統架構繞不過去的一個坎。

對於網路的基本原理,推薦書籍《計算機網路-嚴偉與潘愛民譯》,《計算機網路:自頂向下方法》。

對於TCP/IP協議棧的瞭解,推薦書籍《TCP/IP詳解》,《The TCP/IP Guide》

對於網路程式設計,推薦書籍《UNIX網路程式設計》

如果你想了解網路協議棧的實現,推薦書籍《深入理解LINUX網路內幕》

這裡還自我推薦一下本人寫的極客時間專欄《趣談網路協議》。

極客時間《趣談網路協議》:小說一樣的網路協議入門課

 

其中有個綜合場景,串起來所有的網路協議。

用雙十一的故事串起碎片的網路協議(下)

用雙十一的故事串起碎片的網路協議(中)

用雙十一的故事串起碎片的網路協議(上)

             201810301007365f5ac67c-efc2-471d-a945-5c13a87bdc34.jpg

六、基於KVM瞭解計算虛擬化

當物理機搭建完畢之後,接下來就是基於物理機上面搭建虛擬機器了。

 

沒有了解虛擬機器的同學,可以在自己的膝上型電腦上用VirtualBox或者Vmware建立虛擬機器,你會發現,很容易就能在物理機的作業系統之內再安裝多個作業系統,通過這種方式,你可以很方便的在windows辦公系統之內安裝一個Linux系統。從而保持LInux系統的持續學習。

 20181030100748d9402cf3-29e2-4f59-9e77-cd9041a5f327.jpg

             

前面講linux作業系統的時候,說到作業系統,就是整個系統的管家。應用程式要申請資源,都需要通過作業系統的系統呼叫介面,向作業系統核心申請將CPU,記憶體,網路,硬碟等資源分配給他。

 

這時候你會發現,虛擬機器也是物理機上的一個普通程序,當虛擬機器內部的應用程式申請資源的時候,需要向虛擬機器的作業系統請求。然而虛擬機器的作業系統自己本身也沒有許可權操作資源,因而又需要像物理機的作業系統申請資源。這中間要多一次翻譯的工作,完成這件事情的稱為虛擬化軟體。例如上面說的VirtualBox和Vmware都是虛擬化軟體。

 

但是多一層翻譯,就多一層效能損耗,如果虛擬機器裡面的每一個操作都要翻譯,都不能直接操作硬體,效能就會差很多,簡直沒辦法用,於是就出現了上圖中的硬體輔助虛擬化,也即通過硬體的特殊配置,例如VT-x和VT-d等,讓虛擬機器裡面的作業系統知道,他不是一個原生的作業系統了,是一個虛擬機器的作業系統,不能按照原來的模式操作資源了,而是通過特殊的驅動以硬體輔助的方式抄近道操作物理資源。

 

剛才說的是桌面虛擬化,也就是在你的膝上型電腦上,在資料中心裡面,也可以使用Vmware進行虛擬化,但是價格比較貴,如果規模比較大,會採取開源的虛擬化軟體qemu-kvm。

             

對於qemu-kvm來說,和上面的原理是一樣的,其中qemu的emu是emulator的意思,也即模擬器,就是翻譯的意思。KVM是一個可以使用CPU的硬體輔助虛擬化的方式,而網路和儲存的,需要通過特殊的virtio的方式,提供高效能的裝置虛擬化功能。

要了解虛擬化的基本原理,推薦書籍《系統虛擬化——原理與實現》

要了解KVM,推薦兩本書籍《KVM Virtualization Cookbook》和《Mastering KVM Virtualization》。

另外KVM和qemu的官方文件也是必須要看的,還有Redhat的官網很多文章非常值得學習。

對於虛擬化方面,我寫了以下的文章。

我是虛擬機器核心我困惑?!

Qemu,KVM,Virsh傻傻的分不清

裸用KVM建立虛擬機器,體驗virtualbox為你做的10件事情

KVM虛擬機器映象那點兒事,qcow2六大功能,內部快照和外部快照有啥區別?

KVM半虛擬化裝置virtio及效能調優最佳實踐

我的虛擬機器掛了!怎麼把映象裡面的資料找回來?

不僅Docker有映象,KVM也有多種方式操作映象

 

七、基於Openvswitch瞭解網路虛擬化

 

當虛擬機器創建出來了,最主要的訴求就是要能上網,他能訪問到網上的資源,如果虛擬機器裡面部署一個網站,也希望別人能夠訪問到他。

這一方面依賴於qemu-KVM的網路虛擬化,將網路包從虛擬機器裡面傳播到虛擬機器外面,這需要物理機核心轉換一把,形成虛擬機器內部的網絡卡和虛擬機器外部的虛擬網絡卡。

  20181030100821a3b9bf0c-0ade-4ee2-ad8b-348a744d2fab.jpg

另外一方面就是虛擬機器的網路如何能夠連線到物理網路裡面。物理網路常常稱為underlay network,虛擬網路常常稱為overlay network,從物理網路到虛擬網路稱為網路虛擬化,能非常好的完成這件事情的是一個叫Openvswitch的虛擬交換機軟體。

             2018103010103991f27b55-40f4-43d3-85fe-42de633b2300.jpg

Openvswitch會有一個核心驅動,監聽物理網絡卡,可以將物理網絡卡上收到的包拿進來。虛擬機器創建出來的外部的虛擬網絡卡也可以新增到Openvswitch上,而Openvswitch可以設定各種的網路包處理策略,將網路包在虛擬機器和物理機之間進行傳遞,從而實現了網路虛擬化。

       201810301011015414de8f-62c9-4ce9-a406-fa0bfa8c60f1.jpg      

對於Openvswitch,我主要是通過官方文件進行研究,寫下了這個系列。

 

Openvswitch的入門篇

通俗說Openvswitch

 

Openvswitch的操作篇

玩轉Openvwitch第一站:Manager和SSL

玩轉Openvwitch第二站:Bridge和Controller

玩轉Openvwitch第四站:Bridge和Mirror

玩轉Openvwitch第五站:Port和VLAN

玩轉Openvwitch第六站:Port和Bond

玩轉Openvwitch第七站:Port和QoS

玩轉Openvswitch第八站:Interface和Tunnel (下)

玩轉Openvswitch第八站:Interface和Tunnel (上)

玩轉Openvswitch第十站:Flow Table

玩轉Openvswitch之綜合篇

 

Openvswitch的程式碼分析篇

Openvswitch總體架構與程式碼結構

從Openvswitch程式碼看網路包的旅程



相關閱讀:雲架構師進階攻略(2)

雲架構師進階攻略(3)

 


網易雲端計算基礎服務深度整合了 IaaS、PaaS 及容器技術,提供彈性計算、DevOps 工具鏈及微服務基礎設施等服務,幫助企業解決 IT、架構及運維等問題,使企業更聚焦於業務,是新一代的雲端計算平臺,點選可免費試用


相關文章:
【推薦】 中秋福利 | 10本技術圖書(程式語言、資料分析等)免費送
【推薦】 聊聊WS-Federation