《前Google工程師談分布式系統的特點以及設計理念》要點:
本文介紹了前Google工程師談分布式系統的特點以及設計理念,希望對您有用。如果有疑問,可以聯系我們。
分布式系統并不是什么新鮮詞,在上個世紀七八十年代就已經有各種分布式系統出現.只是在互聯網時代,分布式系統才大放異彩,尤其是Google更是把分布式系統運用到了極致.
Google整個的軟件構架都是基于各種各樣的分布式系統,諸如Borg、MapReduce、BigTable等.正是這些分布式系統,使得Google可以處理高并發請求響應以及海量數據處理等.Apache旗下的Hadoop、Spark、Mesos等分布式系統,把大數據處理相關技術變得非常親民,讓更多企業客戶體會到了分布式系統的便利.
分布式系統最大的特點是可擴展性,它能夠適應需求變化而擴展.企業級應用需求經常隨時間而不斷變化,這也對企業級應用平臺提出了很高的要求.企業級應用平臺必須要能適應需求的變化,即具有可擴展性.
比如移動互聯網2C應用,隨著互聯網企業的業務規模不斷增大,業務變得越來越復雜,并發用戶請求越來越多,要處理的數據也越來越多,這個時候企業級應用平臺必須能夠適應這些變化,支持高并發訪問和海量數據處理.分布式系統有良好的可擴展性,可以通過增加服務器數量來增強分布式系統整體的處理能力,以應對企業的業務增長帶來的計算需求.
分布式系統的核心理念是讓多臺服務器協同工作,完成單臺服務器無法處理的任務,尤其是高并發或者大數據量的任務.分布式系統由獨立的服務器通過網絡松散耦合組成的.每個服務器都是一臺獨立的PC機,服務器之間通過內部網絡連接,內部網絡速度一般比較快.因為分布式集群里的服務器是通過內部網絡松散耦合,各節點之間的通訊有一定的網絡開銷,因此分布式系統在設計上盡可能減少節點間通訊.
此外,因為網絡傳輸瓶頸,單個節點的性能高低對分布式系統整體性能影響不大.比如,對分布式應用來說,采用不同編程語言開發帶來的單個應用服務的性能差異,跟網絡開銷比起來都可以忽略不計.因此,分布式系統每個節點一般不采用高性能的服務器,而是性能相對一般的普通PC服務器.提升分布式系統的整體性能是要通過橫向擴展(增加更多的服務器),而不是縱向擴展(提升每個節點的服務器性能).
分布式系統最大的特點是廉價高效:由成本低廉的PC服務器組成的集群,在性能方面能夠達到或超越大型機的處理性能,在成本上遠低于大型機.這也是分布式系統最吸引人之處.成本低廉的PC服務器在硬件可靠性方面比大型機相去甚遠,于是分布式系統由軟件來對硬件進行容錯,通過軟件來保證整體系統的高可靠性.
分布式系統最大的好處是實現企業應用服務層面的彈性擴展.應用服務層面的彈性擴展是相對計算資源層面的彈性擴展而言的.一般公有云服務(IaaS)廠商都會提供計算資源層面的彈性擴展,比如可以很方便地增加或刪除虛擬主機、提升或降低虛擬主機的性能配置等等.但是企業客戶真正需要的是應用服務層面的彈性擴展,即隨著業務量的漲落,后臺應用服務的實例能動態變化,這是IaaS廠商還做不到的.
比如,某移動互聯網短視頻分享應用,在晚間11點到凌晨1點是訪問高峰,同時在線人數高達幾十萬,這時后臺應用服務要擴張到數千個實例才能應付這么高并發的訪問請求;過了高峰時段,后臺應用服務可以收縮到幾十個實例.有了分布式系統,就可以很方便地調度應用服務實例,從幾十個到幾百個甚至上千個,真正實現應用服務的彈性擴展.
上面簡單介紹了分布式系統的基本情況,下面詳細闡述筆者理解的幾個分布式系統設計理念:
對服務器硬件可靠性不做要求,允許服務器硬件發生故障,硬件的故障由軟件來容錯.所以分布式系統的高可靠性是由軟件來保證.
對服務器的性能不做要求,不要求使用高頻CPU、大容量內存、高性能存儲等等.因為分布式系統的性能瓶頸在于節點間通訊帶來的網絡開銷,單臺服務器硬件性能再好,也要等待網絡IO.
一般而言,互聯網公司的大型數據中心都是選用大量廉價的PC服務器而不是用幾臺高性能服務器搭建分布式集群,以此來降低數據中心成本.比如,Google對于數據中心的成本控制做到了極致:所有服務器一律不要機箱;主板完全定制,只要最基本的組件,早期的定制主板連電源開關和USB接口都不要;在主板上加裝隔離帶把CPU單獨隔出來,讓冷風只吹CPU,不吹內存、硬盤等不需要降溫的組件,最大限度降低冷卻電力消耗.
橫向可擴展性(Scale Out)是指通過增加服務器數量來提升集群整體性能.縱向可擴展性(Scale Up)是指提升每臺服務器性能進而提升集群整體性能.縱向可擴展性的上限非常明顯,單臺服務器的性能不可能無限提升,而且跟服務器性能相比,網絡開銷才是分布式系統最大的瓶頸.橫向可擴展性的上限空間比較大,集群總能很方便地增加服務器.而且分布式系統會盡可能保證橫向擴展帶來集群整體性能的(準)線性提升.比如有10臺服務器組成的集群,橫向擴展為100臺同樣服務器的集群,那么整體分布式系統性能會提升為接近原來的10倍.
互聯網公司的數據中心,一般一個分布式系統橫向擴展的上限在萬臺服務器左右.Google數據中心的基本單元,CELL,由兩萬臺左右服務器組成,每個CELL由一套分布式管理系統,BORG,統一管理,每個數據中心都由多個CELL組成.
單點失效是指,某個應用服務只有一份實例運行在某一臺服務器上,這臺服務器一旦掛掉,那么這個應用服務必然也受影響而掛掉,導致整個服務不可用.例如,某網站后臺如果只在某一臺服務器上運行一份,那這臺服務器一旦宕機,該網站服務必然受影響而不可用.再比如,如果所有數據都存在某一臺服務器上,那一旦這臺服務器壞了,所有數據都不可訪問.
因為分布式系統的服務器都是廉價的PC服務器,硬件不能保證100%可靠,所以分布式系統默認每臺服務器隨時都可能發生故障掛掉.同時分布式系統必須要提供高可靠服務,不允許出現單點失效,因此分布式系統里運行的每個應用服務都有多個運行實例跑在多個節點上,每個數據點都有多個備份存在不同的節點上.這樣一來,多個節點同時發生故障,導致某個應用服務的所有實例都掛掉、或某個數據點的多個備份都不可讀的概率大大降低,進而有效防止單點失效.
通常情況,不要讓服務器滿負荷運行,服務器長時間滿負荷運行的話,出故障的概率顯著升高.所以分布式系統采用一大堆中低性能的PC服務器,盡可能把負載均攤到所有服務器上,讓每臺服務器的負載都不高,保證集群整體穩定性.
如前所述,分布式系統的整體性能瓶頸在于內部網絡開銷.目前網絡傳輸的速度還趕不上CPU讀取內存或硬盤的速度,所以減少網絡通訊開銷,讓CPU盡可能處理內存的數據或本地硬盤的數據,能顯著提高分布式系統的性能.典型的例子就是Hadoop MapReduce,把計算任務分配到要處理的數據所在的節點上運行,從而避免在網絡上傳輸數據.
應用服務的狀態是指運行時程序因為處理服務請求而存在內存的數據.分布式應用服務最好是設計成無狀態.因為如果應用程序是有狀態的,那么一旦服務器宕機就會使得應用服務程序受影響而掛掉,那存在內存的數據也就丟失了,這顯然不是高可靠的服務.把應用服務設計成無狀態的,讓程序把需要保存的數據都保存在專門的存儲上,這樣應用服務程序可以任意重啟而不丟失數據,方便分布式系統在服務器宕機后恢復應用服務.
比如,在設計網站后臺的時候,對于用戶登陸請求,可以把登陸用戶的session相關信息保存在Redis或Memcached等緩存服務中,這樣每個網站的后臺實例不保存用戶登錄狀態,這樣即使重啟網站后臺程序也不丟失用戶的登錄狀態信息;如果把用戶的session相關信息保存在網站后臺程序的內存里,那一旦受理用戶登錄的網站后臺程序實例掛掉,必然有用戶的登錄狀態信息會丟失.
總而言之,分布式系統是大數據時代企業級應用的首選平臺,它有良好的可擴展性,尤其是橫向可擴展性(Scale Out),使得分布式系統非常靈活,能應對千變萬化的企業級需求,而且降低了企業客戶對服務器硬件的要求,真正能做到應用服務層面的彈性擴展(auto-scaling).
王璞,2002年北京航空航天大學獲得力學學士學位,2007年北京大學獲得計算機碩士,2011年美國George Mason University獲得計算機博士學位,研究方向機器學習,發表十余篇機器學習以及數據挖掘相關論文.畢業后在硅谷先后供職StumbleUpon,Groupon和Google三家公司.專長海量數據處理,分布式計算,以及大規模機器學習.于2014年回國創辦數人科技,專注于為企業客戶提供大數據分析處理一站式解決方案.
文章出處:聊聊架構