【技術架構】分佈式系統的特點以及設計理念

本文轉載於王璞 http://www.infoq.com/cn/articles/features-and-design-concept-of-distributed-system論文

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

一、分佈式系統的特點

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

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

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

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

二、分佈式系統設計理念

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

  1. 分佈式系統對服務器硬件要求很低

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

對服務器硬件可靠性不做要求,允許服務器硬件發生故障,硬件的故障由軟件來容錯。所以分佈式系統的高可靠性是由軟件來保證。
對服務器的性能不做要求,不要求使用高頻CPU、大容量內存、高性能存儲等等。因爲分佈式系統的性能瓶頸在於節點間通訊帶來的網絡開銷,單臺服務器硬件性能再好,也要等待網絡IO。
一般而言,互聯網公司的大型數據中心都是選用大量廉價的PC服務器而不是用幾臺高性能服務器搭建分佈式集羣,以此來降低數據中心成本。比如,Google對於數據中心的成本控制做到了極致:所有服務器一律不要機箱;主板完全定製,只要最基本的組件,早期的定製主板連電源開關和USB接口都不要;在主板上加裝隔離帶把CPU單獨隔出來,讓冷風只吹CPU,不吹內存、硬盤等不需要降溫的組件,最大限度降低冷卻電力消耗。

  1. 分佈式系統強調橫向可擴展性

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

互聯網公司的數據中心,一般一個分佈式系統橫向擴展的上限在萬臺服務器左右。Google數據中心的基本單元,CELL,由兩萬臺左右服務器組成,每個CELL由一套分佈式管理系統,BORG,統一管理,每個數據中心都由多個CELL組成。

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

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

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

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

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

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

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

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

比如,在設計網站後臺的時候,對於用戶登陸請求,可以把登陸用戶的session相關信息保存在Redis或Memcache等緩存服務中,這樣每個網站的後臺實例不保存用戶登錄狀態,這樣即使重啓網站後臺程序也不丟失用戶的登錄狀態信息;如果把用戶的session相關信息保存在網站後臺程序的內存裏,那一旦受理用戶登錄的網站後臺程序實例掛掉,必然有用戶的登錄狀態信息會丟失。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章