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