分布式系統(tǒng)并不是什么新鮮詞,在上個(gè)世紀(jì)七八十年代就已經(jīng)有各種分布式系統(tǒng)出現(xiàn)。只是在互聯(lián)網(wǎng)時(shí)代,分布式系統(tǒng)才大放異彩,尤其是Google更是把分布式系統(tǒng)運(yùn)用到了極致。Google整個(gè)的軟件構(gòu)架都是基于各種各樣的分布式系統(tǒng),諸如Borg、 MapReduce、BigTable等。正是這些分布式系統(tǒng),使得Google可以處理高并發(fā)請求響應(yīng)以及海量數(shù)據(jù)處理等。Apache旗下的 Hadoop、Spark、Mesos等分布式系統(tǒng),把大數(shù)據(jù)處理相關(guān)技術(shù)變得非常親民,讓更多企業(yè)客戶體會到了分布式系統(tǒng)的便利。
分布式系統(tǒng)的特點(diǎn)
分布式系統(tǒng)最大的特點(diǎn)是可擴(kuò)展性,它能夠適應(yīng)需求變化而擴(kuò)展。
企業(yè)級應(yīng)用需求經(jīng)常隨時(shí)間而不斷變化,這也對企業(yè)級應(yīng)用平臺提出了很高的要求。企業(yè)級應(yīng)用平臺必須要能適應(yīng)需求的變化,即具有可擴(kuò)展性。比如移動互聯(lián)網(wǎng)2C應(yīng)用,隨著互聯(lián)網(wǎng)企業(yè)的業(yè)務(wù)規(guī)模不斷增大,業(yè)務(wù)變得越來越復(fù)雜,并發(fā)用戶請求越來越多,要處理的數(shù)據(jù)也越來越多,這個(gè)時(shí)候企業(yè)級應(yīng)用平臺必須能夠適應(yīng)這些變化,支持高并發(fā)訪問和海量數(shù)據(jù)處理。分布式系統(tǒng)有良好的可擴(kuò)展性,可以通過增加服務(wù)器數(shù)量來增強(qiáng)分布式系統(tǒng)整體的處理能力,以應(yīng)對企業(yè)的業(yè)務(wù)增長帶來的計(jì)算需求。
分布式系統(tǒng)的核心理念是讓多臺服務(wù)器協(xié)同工作,完成單臺服務(wù)器無法處理的任務(wù),尤其是高并發(fā)或者大數(shù)據(jù)量的任務(wù)。
分布式系統(tǒng)由獨(dú)立的服務(wù)器通過網(wǎng)絡(luò)松散耦合組成的。每個(gè)服務(wù)器都是一臺獨(dú)立的PC機(jī),服務(wù)器之間通過內(nèi)部網(wǎng)絡(luò)連接,內(nèi)部網(wǎng)絡(luò)速度一般比較快。因?yàn)榉植际郊豪锏姆?wù)器是通過內(nèi)部網(wǎng)絡(luò)松散耦合,各節(jié)點(diǎn)之間的通訊有一定的網(wǎng)絡(luò)開銷,因此分布式系統(tǒng)在設(shè)計(jì)上盡可能減少節(jié)點(diǎn)間通訊。此外,因?yàn)榫W(wǎng)絡(luò)傳輸瓶頸,單個(gè)節(jié)點(diǎn)的性能高低對分布式系統(tǒng)整體性能影響不大。比如,對分布式應(yīng)用來說,采用不同編程語言開發(fā)帶來的單個(gè)應(yīng)用服務(wù)的性能差異,跟網(wǎng)絡(luò)開銷比起來都可以忽略不計(jì)。因此,分布式系統(tǒng)每個(gè)節(jié)點(diǎn)一般不采用高性能的服務(wù)器,而是性能相對一般的普通PC服務(wù)器。提升分布式系統(tǒng)的整體性能是要通過橫向擴(kuò)展(增加更多的服務(wù)器),而不是縱向擴(kuò)展(提升每個(gè)節(jié)點(diǎn)的服務(wù)器性能)。
分布式系統(tǒng)最大的特點(diǎn)是廉價(jià)高效。
由成本低廉的PC服務(wù)器組成的集群,在性能方面能夠達(dá)到或超越大型機(jī)的處理性能,在成本上遠(yuǎn)低于大型機(jī)。這也是分布式系統(tǒng)最吸引人之處。成本低廉的PC服務(wù)器在硬件可靠性方面比大型機(jī)相去甚遠(yuǎn),于是分布式系統(tǒng)由軟件來對硬件進(jìn)行容錯(cuò),通過軟件來保證整體系統(tǒng)的高可靠性。
分布式系統(tǒng)最大的好處是實(shí)現(xiàn)企業(yè)應(yīng)用服務(wù)層面的彈性擴(kuò)展。
應(yīng)用服務(wù)層面的彈性擴(kuò)展是相對計(jì)算資源層面的彈性擴(kuò)展而言的。一般公有云服務(wù)(IaaS)廠商都會提供計(jì)算資源層面的彈性擴(kuò)展,比如可以很方便地增加或刪除虛擬主機(jī)、提升或降低虛擬主機(jī)的性能配置等等。但是企業(yè)客戶真正需要的是應(yīng)用服務(wù)層面的彈性擴(kuò)展,即隨著業(yè)務(wù)量的漲落,后臺應(yīng)用服務(wù)的實(shí)例能動態(tài)變化,這是IaaS廠商還做不到的。比如,某移動互聯(lián)網(wǎng)短視頻分享應(yīng)用,在晚間11點(diǎn)到凌晨1點(diǎn)是訪問高峰,同時(shí)在線人數(shù)高達(dá)幾十萬,這時(shí)后臺應(yīng)用服務(wù)要擴(kuò)張到數(shù)千個(gè)實(shí)例才能應(yīng)付這么高并發(fā)的訪問請求;過了高峰時(shí)段,后臺應(yīng)用服務(wù)可以收縮到幾十個(gè)實(shí)例。有了分布式系統(tǒng),就可以很方便地調(diào)度應(yīng)用服務(wù)實(shí)例,從幾十個(gè)到幾百個(gè)甚至上千個(gè),真正實(shí)現(xiàn)應(yīng)用服務(wù)的彈性擴(kuò)展。
分布式系統(tǒng)的設(shè)計(jì)理念
上面簡單介紹了分布式系統(tǒng)的基本情況,下面詳細(xì)闡述筆者理解的幾個(gè)分布式系統(tǒng)設(shè)計(jì)理念:
分布式系統(tǒng)對服務(wù)器硬件要求很低
這一點(diǎn)主要現(xiàn)在如下兩個(gè)方面:
對服務(wù)器硬件可靠性不做要求,允許服務(wù)器硬件發(fā)生故障,硬件的故障由軟件來容錯(cuò)。所以分布式系統(tǒng)的高可靠性是由軟件來保證;
對服務(wù)器的性能不做要求,不要求使用高頻CPU、大容量內(nèi)存、高能存儲等等。因?yàn)榉植际较到y(tǒng)的性能瓶頸在于節(jié)點(diǎn)間通訊帶來的網(wǎng)開銷,單臺服務(wù)器硬件性能再好,也要等待網(wǎng)絡(luò)IO。
一般而言,互聯(lián)網(wǎng)公司的大型數(shù)據(jù)中心都是選用大量廉價(jià)的PC服務(wù)器而不是用幾臺高性能服務(wù)器搭建分布式集群,以此來降低數(shù)據(jù)中心成本。比如,Google對于數(shù)據(jù)中心的成本控制做到了極致:所有服務(wù)器一律不要機(jī)箱;主板完全定制,只要最基本的組件,早期的定制主板連電源開關(guān)和USB接口都不要;在主板上加裝隔離帶把CPU單獨(dú)隔出來,讓冷風(fēng)只吹CPU,不吹內(nèi)存、硬盤等不需要降溫的組件,最大限度降低冷卻電力消耗。
分布式系統(tǒng)強(qiáng)調(diào)橫向可擴(kuò)展性
橫向可擴(kuò)展性(Scale Out)是指通過增加服務(wù)器數(shù)量來提升集群整體性能。縱向可擴(kuò)展性(Scale Up)是指提升每臺服務(wù)器性能進(jìn)而提升集群整體性能。縱向可擴(kuò)展性的上限非常明顯,單臺服務(wù)器的性能不可能無限提升,而且跟服務(wù)器性能相比,網(wǎng)絡(luò)開銷才是分布式系統(tǒng)最大的瓶頸。橫向可擴(kuò)展性的上限空間比較大,集群總能很方便地增加服務(wù)器。而且分布式系統(tǒng)會盡可能保證橫向擴(kuò)展帶來集群整體性能的(準(zhǔn))線性提升。比如有10臺服務(wù)器組成的集群,橫向擴(kuò)展為100臺同樣服務(wù)器的集群,那么整體分布式系統(tǒng)性能會提升為接近原來的10倍。
互聯(lián)網(wǎng)公司的數(shù)據(jù)中心,一般一個(gè)分布式系統(tǒng)橫向擴(kuò)展的上限在萬臺服務(wù)器左右。Google數(shù)據(jù)中心的基本單元,CELL,由兩萬臺左右服務(wù)器組成,每個(gè)CELL由一套分布式管理系統(tǒng),BORG,統(tǒng)一管理,每個(gè)數(shù)據(jù)中心都由多個(gè)CELL組成。
分布式系統(tǒng)不允許單點(diǎn)失效(No Single Point Failure)
單點(diǎn)失效是指,某個(gè)應(yīng)用服務(wù)只有一份實(shí)例運(yùn)行在某一臺服務(wù)器上,這臺服務(wù)器一旦掛掉,那么這個(gè)應(yīng)用服務(wù)必然也受影響而掛掉,導(dǎo)致整個(gè)服務(wù)不可用。例如,某網(wǎng)站后臺如果只在某一臺服務(wù)器上運(yùn)行一份,那這臺服務(wù)器一旦宕機(jī),該網(wǎng)站服務(wù)必然受影響而不可用。再比如,如果所有數(shù)據(jù)都存在某一臺服務(wù)器上,那一旦這臺服務(wù)器壞了,所有數(shù)據(jù)都不可訪問。
因?yàn)榉植际较到y(tǒng)的服務(wù)器都是廉價(jià)的PC服務(wù)器,硬件不能保證100%可靠,所以分布式系統(tǒng)默認(rèn)每臺服務(wù)器隨時(shí)都可能發(fā)生故障掛掉。同時(shí)分布式系統(tǒng)必須要提供高可靠服務(wù),不允許出現(xiàn)單點(diǎn)失效,因此分布式系統(tǒng)里運(yùn)行的每個(gè)應(yīng)用服務(wù)都有多個(gè)運(yùn)行實(shí)例跑在多個(gè)節(jié)點(diǎn)上,每個(gè)數(shù)據(jù)點(diǎn)都有多個(gè)備份存在不同的節(jié)點(diǎn)上。這樣一來,多個(gè)節(jié)點(diǎn)同時(shí)發(fā)生故障,導(dǎo)致某個(gè)應(yīng)用服務(wù)的所有實(shí)例都掛掉、或某個(gè)數(shù)據(jù)點(diǎn)的多個(gè)備份都不可讀的概率大大降低,進(jìn)而有效防止單點(diǎn)失效。
通常情況,不要讓服務(wù)器滿負(fù)荷運(yùn)行,服務(wù)器長時(shí)間滿負(fù)荷運(yùn)行的話,出故障的概率顯著升高。所以分布式系統(tǒng)采用一大堆中低性能的PC服務(wù)器,盡可能把負(fù)載均攤到所有服務(wù)器上,讓每臺服務(wù)器的負(fù)載都不高,保證集群整體穩(wěn)定性。
分布式系統(tǒng)盡可能減少節(jié)點(diǎn)間通訊開銷
如前所述,分布式系統(tǒng)的整體性能瓶頸在于內(nèi)部網(wǎng)絡(luò)開銷。目前網(wǎng)絡(luò)傳輸?shù)乃俣冗€趕不上CPU讀取內(nèi)存或硬盤的速度,所以減少網(wǎng)絡(luò)通訊開銷,讓CPU盡可能處理內(nèi)存的數(shù)據(jù)或本地硬盤的數(shù)據(jù),能顯著提高分布式系統(tǒng)的性能。典型的例子就是Hadoop MapReduce,把計(jì)算任務(wù)分配到要處理的數(shù)據(jù)所在的節(jié)點(diǎn)上運(yùn)行,從而避免在網(wǎng)絡(luò)上傳輸數(shù)據(jù)。
分布式系統(tǒng)應(yīng)用服務(wù)最好做成無狀態(tài)的
應(yīng)用服務(wù)的狀態(tài)是指運(yùn)行時(shí)程序因?yàn)樘幚矸?wù)請求而存在內(nèi)存的數(shù)據(jù)。分布式應(yīng)用服務(wù)最好是設(shè)計(jì)成無狀態(tài)。因?yàn)槿绻麘?yīng)用程序是有狀態(tài)的,那么一旦服務(wù)器宕機(jī)就會使得應(yīng)用服務(wù)程序受影響而掛掉,那存在內(nèi)存的數(shù)據(jù)也就丟失了,這顯然不是高可靠的服務(wù)。把應(yīng)用服務(wù)設(shè)計(jì)成無狀態(tài)的,讓程序把需要保存的數(shù)據(jù)都保存在專門的存儲上,這樣應(yīng)用服務(wù)程序可以任意重啟而不丟失數(shù)據(jù),方便分布式系統(tǒng)在服務(wù)器宕機(jī)后恢復(fù)應(yīng)用服務(wù)。
比如,在設(shè)計(jì)網(wǎng)站后臺的時(shí)候,對于用戶登陸請求,可以把登陸用戶的session相關(guān)信息保存在Redis或Memcache等緩存服務(wù)中,這樣每個(gè)網(wǎng)站的后臺實(shí)例不保存用戶登錄狀態(tài),這樣即使重啟網(wǎng)站后臺程序也不丟失用戶的登錄狀態(tài)信息;如果把用戶的session相關(guān)信息保存在網(wǎng)站后臺程序的內(nèi)存里,那一旦受理用戶登錄的網(wǎng)站后臺程序?qū)嵗龗斓簦厝挥杏脩舻牡卿洜顟B(tài)信息會丟失。
總而言之,分布式系統(tǒng)是大數(shù)據(jù)時(shí)代企業(yè)級應(yīng)用的首選平臺,它有良好的可擴(kuò)展性,尤其是橫向可擴(kuò)展性(Scale Out),使得分布式系統(tǒng)非常靈活,能應(yīng)對千變?nèi)f化的企業(yè)級需求,而且降低了企業(yè)客戶對服務(wù)器硬件的要求,真正能做到應(yīng)用服務(wù)層面的彈性擴(kuò)展(auto- scaling)。