叢集趣談:孫悟空分身術
本文首發於我的公眾號 CloudDeveloper(ID: cloud_dev) ,專注於乾貨分享,號內有大量書籍和視訊資源,後臺回覆 「1024」 即可領取,歡迎大家關注,二維碼文末可以掃。
在孫悟空的七十二變中,我覺得最厲害的是分身能力,這也是他百試不得其爽的終極大招,每每都能打得妖怪摸不著北。
叢集,學名叫 Cluster,可以翻譯為簇、聚類、叢集等多種意思,不同的翻譯,在技術世界裡所表示的意思都不盡相同,但都有一個共同的指向,即群體。叢集就是由一組計算機所組成的實體,通常作為一個整體向用戶提供資源和服務。
叢集的研究和發展離不開人們對高效能運算的追求,像我們熟悉的向量機、對稱多處理機、工作站、超級計算機等等都是對高效能運算追求下的產物。
這些系統要麼是提高 CPU 的主頻和匯流排頻寬來提高系統性能,要麼是增加 CPU 個數和記憶體容量來提高效能,但這些手段對效能的提高都是有限的。有人做過實驗,當 CPU 個數超過某一閾值時,系統的效能反而會變差。其主要的瓶頸就在於 CPU 訪問記憶體的頻寬並不能隨著 CPU 個數的增加而有效增加。
相反,集群系統的效能可擴充套件能力是線性增長的。我們可以簡單通過增加機器數來增加叢集的運算能力,相比購買高效能的大型計算機,同等運算能力下,我們可以獲得更高的價效比。同時,系統的可靠性也得到了增強。
歷史
早在七十年代計算機廠商和研究機構就開始了對集群系統的研究和開發,首先創造性發明叢集的是 Seymour Cray(西摩·克雷)—— 超級計算機之父。
Seymour 是一位美國工程師,在 1960 年代,CDC 公司開始涉足高效能運算領域,彼時還是大型機的天下,這些大型機設計非常複雜,生產週期漫長,價格還非常昂貴。於是,當時在 CDC 公司擔任總設計師的 Seymour 就決心建造出一臺他心目中的高效能運算機。
Seymour 出於工程師的直覺,很快想到並行是提高計算機效能的有效方式。他使用廉價的方式來獲得跟大型機一樣的運算能力。他將多個普通的處理器連線起來,使它們能夠協同工作,這就是高效能運算機的原型。
後來,IBM、HP 等公司學習了 Seymour 的這套架構,高效能運算機開始迅速推廣,逐步取代原有的大型機。高效能運算機為當時的登月計劃等大型科研專案作出了非常重要的貢獻。
然後進入八十年代,在摩爾定律的指導下,CPU 頻率不斷提高,晶片不斷降價,個人計算機強勢崛起。蘋果、微軟等公司藉助這股東風成為個人計算機時代的王者。隨之而來的就是高效能運算機市場遭到了吞噬,被迫只能退守公司伺服器市場。
但很快,隨著網際網路的普及,高效能運算機又迎來新的一波熱潮。網際網路上使用者量龐大,普通 PC 難以應付如此眾多的網路請求,必須要依賴由高效能運算機組成的伺服器叢集。在 2000 年左右的網路泡沫時期,成就了很多像 Sun 這樣的伺服器生產商。
如今,IT 行業向雲端計算衝擊,諸如 Google、Apple、Amazon 等很巨頭紛紛建立起了自己的資料中心。叢集的規模在不斷擴大,為海量的資料提高基礎設施提供了支撐。根據不同的應用場景,叢集也演變出多種形態,比如高效能叢集、高可用叢集、負載均衡叢集等等。
叢集元素
叢集不是簡單的硬體堆疊,而是硬體和軟體的結合。從軟體上說,叢集至少需要:
- 構建於 TCP/IP 協議上的通訊軟體,用於叢集中節點之間的通訊。
- 一套中心管理軟體,用於統一管理叢集中節點的資源、任務和容錯等等。
這兩點比較好理解,叢集的規模往往是比較龐大的,對於管理員來說,需要隨時能夠知曉叢集中各節點的業務正常與否,出問題了應該怎麼保證業務能夠不中斷,遇到流量高峰和低谷的時候,又該怎麼響應,這些操作如果純靠人工來完成那必將很慘烈。依靠軟體和網路來完成自動化的管理方式,可以將管理員解放出來。當然,以上說的兩點是比較寬泛的,使用者可以根據自身需求來部署不同的叢集元素。
一個比較經典的叢集模型當屬 Beowulf 叢集,它通過一個節點統一將來自網路的請求分配給各個節點進行計算處理。
叢集與分散式
叢集與分散式像一對孿生兄弟,傻傻分不清楚。在我看來,它們之間沒有特別明確的分界線,叢集離不開分散式,分散式也需要叢集。如果一定要做個區分,可以套用一個比喻來描述兩者的區別:
一家餐廳剛開業,由於成本限制招了一個廚師,慢慢地,餐廳生意越做越好,一個廚師已經很難應付過來,於是又招了一個,這兩個廚師水平相當,都能做同樣的事,兩個廚師之間的關係就是叢集。兩廚師除了炒菜,還要負責洗菜、配菜等等的活,工作負荷已經嚴重超標,為了讓廚師能專心炒菜,把菜做到極致,餐廳又招了配菜師來輔助廚師,廚師和配菜師之間的關係就是分散式。
這個例子比較形象,在網站開發中也有類似的關係,兩個全棧工程師之間就是叢集的關係,前端工程師和後端工程師之間就屬於分散式的關係。
所以,一定要有區分的話就是:叢集是一個業務部署在多個伺服器上,而分散式是一個業務拆分成多個子業務部署在不同的伺服器上。但在實際部署中,為了高效能,需要分散式部署,為了高可用,需要叢集部署,這兩者都是業務所必須的指標。所以,叢集和分散式之間的關係是相互補充的。
虛擬化
隨著虛擬化技術的發展,一臺伺服器可以虛擬出多個虛擬機器,對外提供業務,這種方式大大提高了資源的利用率,叢集的部署也逐步從物理機過渡到虛擬機器,靈活性大大提高。但同時也帶來了更多新的研究課題。虛擬化計算、虛擬化儲存、虛擬化網路、虛擬化安全等等這些課題共同推動著雲端計算產業邁出一個又一個的臺階。
資料中心
資料中心是集中存放和執行伺服器的地方,是規模最大的叢集。隨著雲端計算和大資料概念的風起雲湧,Google、Amazon 等這些明星公司幕後的資料中心也開始走入大眾的視野。資料中心要求有優秀的架構設計、電路設計、空間設計等等,還要有機制能夠應對各種各樣的意外,否則一點小小的失誤,公司的股價恐怕就要跳水。
地理位置的選擇也是資料中心考慮的一個指標,隨著綠色資料中心概念的興起,越來越多人關注資料中心所帶來的能源問題和環境問題,選擇一個遠離市區,並且能利用天然水源和氣溫的地方,將會為資料中心的建設節約大量的成本。Google 等大公司的資料中心就有意放在高緯度、高海拔的地區,以及有湖泊、河流流經地區,以享受天然的空調和冷卻水。
參考
[1] 分散式與叢集的區別是什麼?
[2] 資料中心網路架構演講
[3] Linux 高效能運算叢集
[4]高效能運算機傳奇
我的公眾號 CloudDeveloper(ID: cloud_dev) ,號內有大量書籍和視訊資源,後臺回覆 「1024」 即可領取,分享的內容包括但不限於雲端計算虛擬化、容器、OpenStack、K8S、霧計算、網路、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++程式設計技術等內容,歡迎大家關注。