大話集群和負(fù)載均衡
來(lái)源 |?cnblogs.com/nullering/p/9311151.html
在“高并發(fā),海量數(shù)據(jù),分布式,NoSql,云計(jì)算......”概念滿天飛的年代,相信不少朋友都聽(tīng)說(shuō)過(guò)甚至常與人提起“集群,負(fù)載均衡”等,
但不是所有人都有機(jī)會(huì)真正接觸到這些技術(shù),也不是所有人都真正理解了這些“聽(tīng)起來(lái)很牛的”技術(shù)名詞。下面簡(jiǎn)單解釋一下吧。
要了解這些概念首先要了解一下項(xiàng)目架構(gòu)的演進(jìn),我這里應(yīng)用一張Dubbo的文檔圖片如圖
一:項(xiàng)目架構(gòu)的演進(jìn)

ORM與MVC:
早期的架構(gòu)都集中在一臺(tái)服務(wù)器上,這樣對(duì)于小型的業(yè)務(wù)訪問(wèn)量是完全可以的,但是隨著業(yè)務(wù)的增多,我們引進(jìn)的MVC的架構(gòu),這種架構(gòu)是將整個(gè)業(yè)務(wù)分成不同的層(表現(xiàn)層,業(yè)務(wù)層,數(shù)據(jù)訪問(wèn)層)維護(hù)也更加方面了,開(kāi)發(fā)更加方便。
PRC架構(gòu):
但是業(yè)務(wù)如果繼續(xù)增大,項(xiàng)目會(huì)出現(xiàn)臃腫,一臺(tái)服務(wù)器已經(jīng)完全沒(méi)辦法支持了,所以出現(xiàn)了RPC分布式的架構(gòu),RPC架構(gòu)就是將服務(wù)進(jìn)行合理拆分,分別放入多臺(tái)服務(wù)器執(zhí)行,服務(wù)器與服務(wù)器之間通過(guò)遠(yuǎn)程調(diào)用的方式進(jìn)行通信。
服務(wù)提供者:運(yùn)行在服務(wù)器端,提供服務(wù)接口與服務(wù)實(shí)現(xiàn)類(lèi)
服務(wù)中心:運(yùn)行在服務(wù)器端,負(fù)責(zé)將本地服務(wù)發(fā)布成遠(yuǎn)程服務(wù),管理遠(yuǎn)程服務(wù),提供服務(wù)給消費(fèi)者使用。
服務(wù)消費(fèi)者:運(yùn)行在客戶端,通過(guò)遠(yuǎn)程代理對(duì)象調(diào)用遠(yuǎn)程服務(wù)
目前Java中常用的RPC框架:
1:Dubbo:
2:Spring Cloud
3:Thrift
SOA架構(gòu):
但是業(yè)務(wù)繼續(xù)增加,對(duì)RPC架構(gòu)來(lái)說(shuō),各個(gè)服務(wù)與服務(wù)之間的通信越來(lái)越多,依賴(lài)越來(lái)越多,越來(lái)越混亂,給開(kāi)發(fā)帶來(lái)了困難,于是SOA架構(gòu)應(yīng)運(yùn)而生,SOA架構(gòu)將服務(wù)與服務(wù)集中起來(lái)進(jìn)行管理,加上一個(gè)服務(wù)治理中心。誰(shuí)發(fā)布了服務(wù)來(lái)中心進(jìn)行注冊(cè),誰(shuí)需要依賴(lài)什么服務(wù)來(lái)中心進(jìn)行請(qǐng)求。
而最近很火的微服務(wù),則是將業(yè)務(wù)拆分更加精細(xì),每一個(gè)可以成為一個(gè)完整的服務(wù)。演變肯定會(huì)演變,但是過(guò)程得多久誰(shuí)也不好說(shuō)。
二:名詞解釋
接下來(lái)進(jìn)入正題,解釋讓外行看起來(lái)高大上的名詞
1:集群
集群(Cluster)
所謂集群是指一組獨(dú)立的計(jì)算機(jī)系統(tǒng)構(gòu)成的一個(gè)松耦合的多處理器系統(tǒng),它們之間通過(guò)網(wǎng)絡(luò)實(shí)現(xiàn)進(jìn)程間的通信。應(yīng)用程序可以通過(guò)網(wǎng)絡(luò)共享內(nèi)存進(jìn)行消息傳送,實(shí)現(xiàn)分布式計(jì)算機(jī)。通俗一點(diǎn)來(lái)說(shuō),就是讓若干臺(tái)計(jì)算機(jī)聯(lián)合起來(lái)工作(服務(wù)),可以是并行的,也可以是做備份。
大規(guī)模集群,通常具備以下一些特點(diǎn):
(1)高可靠性(HA)
利用集群管理軟件,當(dāng)主服務(wù)器故障時(shí),備份服務(wù)器能夠自動(dòng)接管主服務(wù)器的工作,并及時(shí)切換過(guò)去,以實(shí)現(xiàn)對(duì)用戶的不間斷服務(wù)。
(2)高性能計(jì)算(HP)
即充分利用集群中的每一臺(tái)計(jì)算機(jī)的資源,實(shí)現(xiàn)復(fù)雜運(yùn)算的并行處理,通常用于科學(xué)計(jì)算領(lǐng)域,比如基因分析、化學(xué)分析等。
(3)負(fù)載平衡(LB)
即把負(fù)載壓力根據(jù)某種算法合理分配到集群中的每一臺(tái)計(jì)算機(jī)上,以減輕主服務(wù)器的壓力,降低對(duì)主服務(wù)器的硬件和軟件要求。
常用的集群又分以下幾種:
load balance cluster(負(fù)載均衡集群)
一共有四兄弟開(kāi)裁縫鋪,生意特別多,一個(gè)人做不下來(lái),老是延誤工期,于是四個(gè)兄弟商量:老大接訂單, 三個(gè)兄弟來(lái)干活。客戶多起來(lái)之后,老大根據(jù)一定的原則(policy) 根據(jù)三兄弟手上的工作量來(lái)分派新任務(wù)。
High availability cluster(高可用集群)
兩兄弟開(kāi)早餐鋪,生意不大,但是每天早上7點(diǎn)到9點(diǎn)之間客戶很多并且不能中斷。為了保證2個(gè)小時(shí)內(nèi)這個(gè)早餐鋪能夠保證持續(xù)提供服務(wù),兩兄弟商量幾個(gè)方法:
方法一:平時(shí)老大做生意,老二這個(gè)時(shí)間段在家等候,一旦老大無(wú)法做生意了,老二就出來(lái)頂上,這個(gè)叫做?Active/Standby.(雙機(jī)熱備)
方法二:平時(shí)老大做生意,老二這個(gè)時(shí)候就在旁邊幫工,一旦老大無(wú)法做生意,老二就馬上頂上,這個(gè)叫做Active/Passive.(雙機(jī)雙工)
方法三:平時(shí)老大賣(mài)包子,老二也在旁邊賣(mài)豆?jié){,老大有問(wèn)題,老二就又賣(mài)包子,又賣(mài)豆?jié){,老二不行了,老大就又賣(mài)包子,又賣(mài)豆?jié){.這個(gè)叫做Active/Active (dual Active)(雙機(jī)互備)
high computing clustering(高性能計(jì)算集群)
10個(gè)兄弟一起做手工家具生意,一個(gè)客戶來(lái)找他們的老爹要求做一套非常復(fù)雜的仿古家具,一個(gè)人做也可以做,不過(guò)要做很久很久,為了1個(gè)星期就交出這一套家具,10個(gè)兄弟決定一起做。
老爹把這套家具的不同部分分開(kāi)交給兒子們做,然后每個(gè)兒子都在做木制家具的加工,最后拼在一起叫貨。
老爹是scheduler任務(wù)調(diào)度器,兒子們是compute node. 他們做的工作叫做作業(yè)。
2:負(fù)載均衡
HTTP重定向負(fù)載均衡
當(dāng)用戶發(fā)來(lái)請(qǐng)求的時(shí)候,Web服務(wù)器通過(guò)修改HTTP響應(yīng)頭中的Location標(biāo)記來(lái)返回一個(gè)新的url,然后瀏覽器再繼續(xù)請(qǐng)求這個(gè)新url,實(shí)際上就是頁(yè)面重定向。通過(guò)重定向,來(lái)達(dá)到“負(fù)載均衡”的目標(biāo)。例如,我們?cè)谙螺dJAVA源碼包的時(shí)候,點(diǎn)擊下載鏈接時(shí),為了解決不同國(guó)家和地域下載速度的問(wèn)題,它會(huì)返回一個(gè)離我們近的下載地址。
重定向的HTTP返回碼是302。優(yōu)點(diǎn):比較簡(jiǎn)單。缺點(diǎn):瀏覽器需要兩次請(qǐng)求服務(wù)器才能完成一次訪問(wèn),性能較差。重定向服務(wù)自身的處理能力有可能成為瓶頸,整個(gè)集群的伸縮性規(guī)模有限;使用HTTP302響應(yīng)碼重定向,有可能使搜索引擎判斷為SEO作弊,降低搜索排名。
DNS域名解析負(fù)載均衡
DNS(Domain Name System)負(fù)責(zé)域名解析的服務(wù),域名url實(shí)際上是服務(wù)器的別名,實(shí)際映射是一個(gè)IP地址,解析過(guò)程,就是DNS完成域名到IP的映射。而一個(gè)域名是可以配置成對(duì)應(yīng)多個(gè)IP的。因此,DNS也就可以作為負(fù)載均衡服務(wù)。
事實(shí)上,大型網(wǎng)站總是部分使用DNS域名解析,利用域名解析作為第一級(jí)負(fù)載均衡手段,即域名解析得到的一組服務(wù)器并不是實(shí)際提供Web服務(wù)的物理服務(wù)器,而是同樣提供負(fù)載均衡服務(wù)的內(nèi)部服務(wù)器,這組內(nèi)部負(fù)載均衡服務(wù)器再進(jìn)行負(fù)載均衡,將請(qǐng)求分發(fā)到真實(shí)的Web服務(wù)器上。
優(yōu)點(diǎn):將負(fù)載均衡的工作轉(zhuǎn)交給DNS,省掉了網(wǎng)站管理維護(hù)負(fù)載均衡服務(wù)器的麻煩,同時(shí)許多DNS還支持基于地理位置的域名解析,即會(huì)將域名解析成距離用戶地理最近的一個(gè)服務(wù)器地址,這樣可以加快用戶訪問(wèn)速度,改善性能。
缺點(diǎn):不能自由定義規(guī)則,而且變更被映射的IP或者機(jī)器故障時(shí)很麻煩,還存在DNS生效延遲的問(wèn)題。而且DNS負(fù)載均衡的控制權(quán)在域名服務(wù)商那里,網(wǎng)站無(wú)法對(duì)其做更多改善和更強(qiáng)大的管理。
反向代理負(fù)載均衡
反向代理服務(wù)可以緩存資源以改善網(wǎng)站性能。實(shí)際上,在部署位置上,反向代理服務(wù)器處于Web服務(wù)器前面(這樣才可能緩存Web相應(yīng),加速訪問(wèn)),這個(gè)位置也正好是負(fù)載均衡服務(wù)器的位置,所以大多數(shù)反向代理服務(wù)器同時(shí)提供負(fù)載均衡的功能,管理一組Web服務(wù)器,將請(qǐng)求根據(jù)負(fù)載均衡算法轉(zhuǎn)發(fā)到不同的Web服務(wù)器上。
Web服務(wù)器處理完成的響應(yīng)也需要通過(guò)反向代理服務(wù)器返回給用戶。由于web服務(wù)器不直接對(duì)外提供訪問(wèn),因此Web服務(wù)器不需要使用外部ip地址,而反向代理服務(wù)器則需要配置雙網(wǎng)卡和內(nèi)部外部?jī)商譏P地址。優(yōu)點(diǎn):和反向代理服務(wù)器功能集成在一起,部署簡(jiǎn)單。缺點(diǎn):反向代理服務(wù)器是所有請(qǐng)求和響應(yīng)的中轉(zhuǎn)站,其性能可能會(huì)成為瓶頸。
負(fù)載均衡策略
輪詢(xún)
加權(quán)輪詢(xún)
最少連接數(shù)
最快響應(yīng)
Hash法

3:緩存
緩存就是將數(shù)據(jù)存放在距離計(jì)算最近的位置以加快處理速度。緩存是改善軟件性能的第一手段,現(xiàn)在CPU越來(lái)越快的一個(gè)重要因素就是使用了更多的緩存,在復(fù)雜的軟件設(shè)計(jì)中,緩存幾乎無(wú)處不在。大型網(wǎng)站架構(gòu)設(shè)計(jì)在很多方面都使用了緩存設(shè)計(jì)。
CDN緩存
內(nèi)容分發(fā)網(wǎng)絡(luò),部署在距離終端用戶最近的網(wǎng)絡(luò)服務(wù)商,用戶的網(wǎng)絡(luò)請(qǐng)求總是先到達(dá)他的網(wǎng)絡(luò)服務(wù)商那里,在這里緩存網(wǎng)站的一些靜態(tài)資源(較少變化的數(shù)據(jù)),可以就近以最快速度返回給用戶,如視頻網(wǎng)站和門(mén)戶網(wǎng)站會(huì)將用戶訪問(wèn)量大的熱點(diǎn)內(nèi)容緩存在CDN中。
反向代理緩存
反向代理屬于網(wǎng)站前端架構(gòu)的一部分,部署在網(wǎng)站的前端,當(dāng)用戶請(qǐng)求到達(dá)網(wǎng)站的數(shù)據(jù)中心時(shí),最先訪問(wèn)到的就是反向代理服務(wù)器,這里緩存網(wǎng)站的靜態(tài)資源,無(wú)需將請(qǐng)求繼續(xù)轉(zhuǎn)發(fā)給應(yīng)用服務(wù)器就能返回給用戶。
本地緩存
在應(yīng)用服務(wù)器本地緩存著熱點(diǎn)數(shù)據(jù),應(yīng)用程序可以在本機(jī)內(nèi)存中直接訪問(wèn)數(shù)據(jù),而無(wú)需訪問(wèn)數(shù)據(jù)庫(kù)。
分布式緩存
大型網(wǎng)站的數(shù)據(jù)量非常龐大,即使只緩存一小部分,需要的內(nèi)存空間也不是單機(jī)能承受的,所以除了本地緩存,還需要分布式緩存,將數(shù)據(jù)緩存在一個(gè)專(zhuān)門(mén)的分布式緩存集群中,應(yīng)用程序通過(guò)網(wǎng)絡(luò)通信訪問(wèn)緩存數(shù)據(jù)。
4:流控(流量控制)
流量丟棄
通過(guò)單機(jī)內(nèi)存隊(duì)列來(lái)進(jìn)行有限的等待,直接丟棄用戶請(qǐng)求的處理方式顯得簡(jiǎn)單而粗暴,并且如果是I/O密集型應(yīng)用(包括網(wǎng)絡(luò)I/O和磁盤(pán)I/O),瓶頸一般不再CPU和內(nèi)存。因此,適當(dāng)?shù)牡却饶軌?/span>提升用戶體驗(yàn),又能夠提高資源利用率。
通過(guò)分布式消息隊(duì)列來(lái)將用戶的請(qǐng)求異步化。
有道無(wú)術(shù),術(shù)可成;有術(shù)無(wú)道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號(hào)
好文章,我在看??
