1. 程式人生 > >關於分散式的一些理解和認識

關於分散式的一些理解和認識

分散式系統並不是什麼新鮮詞,在上個世紀七八十年代就已經有各種分散式系統出現。只是在網際網路時代,分散式系統才大放異彩,尤其是Google更是把分散式系統運用到了極致。Google整個的軟體構架都是基於各種各樣的分散式系統,諸如Borg、MapReduce、BigTable等。正是這些分散式系統,使得Google可以處理高併發請求響應以及海量資料處理等。Apache旗下的Hadoop、Spark、Mesos等分散式系統,把大資料處理相關技術變得非常親民,讓更多企業客戶體會到了分散式系統的便利。

一、分散式系統的特點

分散式系統最大的特點是可擴充套件性,它能夠適應需求變化而擴充套件。企業級應用需求經常隨時間而不斷變化,這也對企業級應用平臺提出了很高的要求。企業級應用平臺必須要能適應需求的變化,即具有可擴充套件性。比如移動網際網路2C應用,隨著網際網路企業的業務規模不斷增大,業務變得越來越複雜,併發使用者請求越來越多,要處理的資料也越來越多,這個時候企業級應用平臺必須能夠適應這些變化,支援高併發訪問和海量資料處理。分散式系統有良好的可擴充套件性,可以通過增加伺服器數量來增強分散式系統整體的處理能力,以應對企業的業務增長帶來的計算需求。

分散式系統的核心理念是讓多臺伺服器協同工作,完成單臺伺服器無法處理的任務,尤其是高併發或者大資料量的任務。分布式系統由獨立的伺服器通過網路鬆散耦合組成的。每個伺服器都是一臺獨立的PC機,伺服器之間通過內部網路連線,內部網路速度一般比較快。因為分散式叢集裡的伺服器是通過內部網路鬆散耦合,各節點之間的通訊有一定的網路開銷,因此分散式系統在設計上儘可能減少節點間通訊。此外,因為網路傳輸瓶頸,單個節點的效能高低對分散式系統整體效能影響不大。比如,對分散式應用來說,採用不同程式語言開發帶來的單個應用服務的效能差異,跟網路開銷比起來都可以忽略不計。因此,分散式系統每個節點一般不採用高效能的伺服器,而是效能相對一般的普通PC伺服器。提升分散式系統的整體效能是要通過橫向擴充套件

(增加更多的伺服器),而不是縱向擴充套件(提升每個節點的伺服器效能)。


分散式系統最大的好處是實現企業應用服務層面的彈性擴充套件。應用服務層面的彈性擴充套件是相對計算資源層面的彈性擴充套件而言的。一般公有云服務(IaaS)廠商都會提供計算資源層面的彈性擴充套件,比如可以很方便地增加或刪除虛擬主機、提升或降低虛擬主機的效能配置等等。但是企業客戶真正需要的是應用服務層面的彈性擴充套件,即隨著業務量的漲落,後臺應用服務的例項能動態變化,這是IaaS廠商還做不到的。比如,某移動網際網路短視訊分享應用,在晚間11點到凌晨1點是訪問高峰,同時線上人數高達幾十萬,這時後臺應用服務要擴張到數千個例項才能應付這麼高併發的訪問請求;過了高峰時段,後臺應用服務可以收縮到幾十個例項。有了分散式系統,就可以很方便地排程應用服務例項,從幾十個到幾百個甚至上千個,真正實現應用服務的彈性擴充套件。

分散式系統最大的特點是廉價高效:由成本低廉的PC伺服器組成的叢集,在效能方面能夠達到或超越大型機的處理效能,在成本上遠低於大型機。這也是分散式系統最吸引人之處。成本低廉的PC伺服器在硬體可靠性方面比大型機相去甚遠,於是分散式系統由軟體來對硬體進行容錯,通過軟體來保證整體系統的高可靠性。

二、分散式系統設計理念

上面簡單介紹了分散式系統的基本情況,下面詳細闡述筆者理解的幾個分散式系統設計理念:

1. 分散式系統對伺服器硬體要求很低

這一點主要現在如下兩個方面:

  • 對伺服器硬體可靠性不做要求,允許伺服器硬體發生故障,硬體的故障由軟體來容錯。所以分散式系統的高可靠性是由軟體來保證。
  • 對伺服器的效能不做要求,不要求使用高頻CPU、大容量記憶體、高效能儲存等等。因為分散式系統的效能瓶頸在於節點間通訊帶來的網路開銷,單臺伺服器硬體效能再好,也要等待網路IO。

一般而言,網際網路公司的大型資料中心都是選用大量廉價的PC伺服器而不是用幾臺高效能伺服器搭建分散式叢集,以此來降低資料中心成本。比如,Google對於資料中心的成本控制做到了極致:所有伺服器一律不要機箱;主機板完全定製,只要最基本的元件,早期的定製主機板連電源開關和USB介面都不要;在主機板上加裝隔離帶把CPU單獨隔出來,讓冷風只吹CPU,不吹記憶體、硬碟等不需要降溫的元件,最大限度降低冷卻電力消耗。

2. 分散式系統強調橫向可擴充套件性

橫向可擴充套件性(Scale Out)是指通過增加伺服器數量來提升叢集整體效能。縱向可擴充套件性(Scale Up)是指提升每臺伺服器效能進而提升叢集整體效能。縱向可擴充套件性的上限非常明顯,單臺伺服器的效能不可能無限提升,而且跟伺服器效能相比,網路開銷才是分散式系統最大的瓶頸。橫向可擴充套件性的上限空間比較大,叢集總能很方便地增加伺服器。而且分散式系統會盡可能保證橫向擴充套件帶來叢集整體效能的(準)線性提升。比如有10臺伺服器組成的叢集,橫向擴充套件為100臺同樣伺服器的叢集,那麼整體分散式系統性能會提升為接近原來的10倍。

網際網路公司的資料中心,一般一個分散式系統橫向擴充套件的上限在萬臺伺服器左右。Google資料中心的基本單元,CELL,由兩萬臺左右伺服器組成,每個CELL由一套分散式管理系統,BORG,統一管理,每個資料中心都由多個CELL組成。

3. 分散式系統不允許單點失效(No Single Point Failure)

單點失效是指,某個應用服務只有一份例項執行在某一臺伺服器上,這臺伺服器一旦掛掉,那麼這個應用服務必然也受影響而掛掉,導致整個服務不可用。例如,某網站後臺如果只在某一臺伺服器上執行一份,那這臺伺服器一旦宕機,該網站服務必然受影響而不可用。再比如,如果所有資料都存在某一臺伺服器上,那一旦這臺伺服器壞了,所有資料都不可訪問。

因為分散式系統的伺服器都是廉價的PC伺服器,硬體不能保證100%可靠,所以分散式系統預設每臺伺服器隨時都可能發生故障掛掉。同時分散式系統必須要提供高可靠服務,不允許出現單點失效,因此分散式系統裡執行的每個應用服務都有多個執行例項跑在多個節點上,每個資料點都有多個備份存在不同的節點上。這樣一來,多個節點同時發生故障,導致某個應用服務的所有例項都掛掉、或某個資料點的多個備份都不可讀的概率大大降低,進而有效防止單點失效。

通常情況,不要讓伺服器滿負荷執行,伺服器長時間滿負荷執行的話,出故障的概率顯著升高。所以分散式系統採用一大堆中低效能的PC伺服器,儘可能把負載均攤到所有伺服器上,讓每臺伺服器的負載都不高,保證叢集整體穩定性。

4. 分散式系統儘可能減少節點間通訊開銷

如前所述,分散式系統的整體效能瓶頸在於內部網路開銷。目前網路傳輸的速度還趕不上CPU讀取記憶體或硬碟的速度,所以減少網路通訊開銷,讓CPU儘可能處理記憶體的資料或本地硬碟的資料,能顯著提高分散式系統的效能。典型的例子就是Hadoop MapReduce,把計算任務分配到要處理的資料所在的節點上執行,從而避免在網路上傳輸資料。

5. 分散式系統應用服務最好做成無狀態的

應用服務的狀態是指執行時程式因為處理服務請求而存在記憶體的資料。分散式應用服務最好是設計成無狀態。因為如果應用程式是有狀態的,那麼一旦伺服器宕機就會使得應用服務程式受影響而掛掉,那存在記憶體的資料也就丟失了,這顯然不是高可靠的服務。把應用服務設計成無狀態的,讓程式把需要儲存的資料都儲存在專門的儲存上,這樣應用服務程式可以任意重啟而不丟失資料,方便分散式系統在伺服器宕機後恢復應用服務。

比如,在設計網站後臺的時候,對於使用者登陸請求,可以把登陸使用者的session相關資訊儲存在Redis或Memcache等快取服務中,這樣每個網站的後臺例項不儲存使用者登入狀態,這樣即使重啟網站後臺程式也不丟失使用者的登入狀態資訊;如果把使用者的session相關資訊儲存在網站後臺程式的記憶體裡,那一旦受理使用者登入的網站後臺程式例項掛掉,必然有使用者的登入狀態資訊會丟失。

總而言之,分散式系統是大資料時代企業級應用的首選平臺,它有良好的可擴充套件性,尤其是橫向可擴充套件性(Scale Out),使得分散式系統非常靈活,能應對千變萬化的企業級需求,而且降低了企業客戶對伺服器硬體的要求,真正能做到應用服務層面的彈性擴充套件(auto-scaling)。