轉自:http://www.tuicool.com/articles/YZZVfu
1.摘要
前一陣微博風風火火的用大規模docker集羣扛過了春節峯值。最近跟不少人聊起接下來要做什麼,總是有一種能做的很多,但是能做的又很少的感覺。想了一下原因,感覺還是對docker、docker的生態系統、應用和集羣沒有劃清楚的界限,docker並不是很多問題的最終解決方案,只是解決方案中的一環而已。
2.容器化與輕量
一談起docker總是會在各種地方看到輕量這個詞,甚至會有一種通過docker啓動一個服務會節省很多資源的錯覺。
但是docker總歸不是一個資源優化技術,所謂“輕”也只是相對於傳統虛擬機而已。
相對於傳統的虛擬技術,docker提供的容器化方案優勢在於:
- 虛擬化額外的資源佔用更少了
- 部署、啓動和銷燬的時間更短了
- 部署、啓動和銷燬的工作量更少了
但相對於不使用容器化方案來說:
- 佔用的資源更多了(可以忽略)
- 啓動、銷燬的時間增加了(可以忽略)
- 部署的時間和工作量變少了
也就是說,相對於不使用容器化的方案,docker在效率方面主要的貢獻是可以在不增加性能消耗的情況下,降低部署服務的工作量,提高部署效率。
3.虛擬化與隔離
這裏先拋掉神乎其神的docker,考慮一下傳統的虛擬化技術。傳統的虛擬化技術在犧牲了性能之後換來了什麼?最大收益大概是更好的隔離性。
隔離了什麼?用到最多的有四類:
- cpu:不同虛擬機的計算資源不混用
- 內存:不同虛擬機的內存不共享
- 網絡:每個虛擬機有自己的網絡棧
- 文件系統:每個虛擬機獨享自己的文件系統
傳統的虛擬化消耗了一些系統資源,換來了對cpu、內存、網絡和文件系統的隔離。換句話說,一個服務不會影響另一個服務的資源。
於是自然的會想到,一個服務的依賴可以做成一套隨着服務一起發佈的文件系統,用時加載、停時棄置;也可以把需要不同資源的服務可以部署在一起以節約成本,等等,隔離給了虛擬化真正的價值。
4.微服務與彈性調度
接下來的問題是,怎麼更大限度的提高資源的利用率。
又是顯而易見的,要提高資源利用率,就得降低資源的浪費,而浪費來源於兩方面:服務自身和依賴環境對資源的浪費、服務沒有利用到的空閒資源。
一般來說,一個服務內聚越高,對資源的浪費就越少(全人類腦後插管連到母體大概是最省資源的吧……),但現實情況下資源被拆分成一臺臺計算機,服務也要跟着拆分。當服務的拆分不能保證和資源拆分相同的粒度時,空閒資源就產生了。
服務拆分的粒度越粗,與資源不匹配的矛盾會越激烈;拆分粒度越細,帶來的資源浪費也就越多。另一方面,服務內聚提高會帶來更高的更高的耦合度和風險,反之會帶來更高的部署和維護成本,等等。
所以服務拆到多細這件事本身沒有定論,docker能做到的只是降低其中一兩個砝碼的權重而已。
5.集羣管理與服務發現
在一個資源上啓動了服務之後,接下來的問題是:啓動了這個服務有什麼用?因爲在啓動服務之後,服務只是“可用”的,並沒有提高資源的利用率。
於是需要有一種機制,讓可用的服務變成被使用的服務,有很多方法可以實現,比如通過配置文件指定訪問的ip和端口,大部分場景下,手工配置的方式已經足夠了。
但是伴隨着系統越來越複雜,配置也越來越負責,漸漸的手工配置已經有些喫力了。
而伴隨着虛擬化和容器化,配置的修改也越來越頻繁和複雜,甚至已經超過了啓動服務本身的難度。單純啓動一個服務沒有意義,需要通過一個足夠可靠和高效的機制把“可用”的服務變成“被用”的服務,服務發現擔當了這個任務。
6.docker與生態系統
那麼,總結一下docker本身帶來了什麼:
- 更高效的服務部署、啓動方式。
- 對cpu、內存、網絡和文件系統的簡單隔離。
由於docker本身帶來了這兩點好處,通過docker和相關的生態系統,可以更簡單的實現:
- 系統監控和管理對象由“機器”改爲抽象的“資源”
- 基於對資源的抽象,提供更靈活的服務部署、調度機制
而docker能做也僅僅是調整天平中衆多砝碼中的幾個而已。更高效的集羣管理、更高的資源利用率是目的,docker的生態系統、服務發現和微服務等都是手段,與其糾結於我們要用docker做什麼,不如拆分成兩個問題:我們要做什麼,docker能幫我們做什麼。