01?背景
????面對(duì)大量用戶訪問、高并發(fā)請(qǐng)求,單機(jī)網(wǎng)站可以從軟硬件兩個(gè)方面尋求解決方法:
??? 1、硬件方面:可以使用高性能的服務(wù)器、大型數(shù)據(jù)庫(kù),存儲(chǔ)設(shè)備,高性能Web服務(wù)器;
??? 2、軟件方面:采用高效率的編程語(yǔ)言(比如Go,Erlang,Scala)等。
????但是,當(dāng)單機(jī)容量達(dá)到極限時(shí),我們需要考慮業(yè)務(wù)拆分和分布式部署,來(lái)解決大型網(wǎng)站訪問量大,并發(fā)量高,海量數(shù)據(jù)的問題。即需要從架構(gòu)方面尋求解決方案。
02?概述
????負(fù)載均衡(Load Balance),意思是將負(fù)載(如前端的訪問請(qǐng)求)進(jìn)行平衡、(通過負(fù)載均衡算法)分?jǐn)偟蕉鄠€(gè)操作單元(服務(wù)器,中間件)上進(jìn)行執(zhí)行。是解決高性能,單點(diǎn)故障(高可用),擴(kuò)展性(水平伸縮)的終極解決方案??梢岳斫鉃?,負(fù)載均衡是高可用和高并發(fā)共同使用的一種技術(shù)。
????負(fù)載均衡的作用:
? ? 1、增加吞吐量,解決并發(fā)壓力(高性能);
? ? 2、提供故障轉(zhuǎn)移(高可用);
? ? 3、通過添加或減少服務(wù)器數(shù)量,提供網(wǎng)站伸縮性(擴(kuò)展性);
? ? 4、安全防護(hù)(負(fù)載均衡設(shè)備上做一些過濾,黑白名單等處理)。
03?原理
????系統(tǒng)的擴(kuò)展可分為縱向(垂直)擴(kuò)展和橫向(水平)擴(kuò)展。
????縱向擴(kuò)展,是從單機(jī)的角度通過增加硬件處理能力,比如CPU處理能力,內(nèi)存容量,磁盤等方面,實(shí)現(xiàn)服務(wù)器處理能力的提升,不能滿足大型分布式系統(tǒng)(網(wǎng)站),大流量,高并發(fā),海量數(shù)據(jù)的問題。因此需要采用橫向擴(kuò)展的方式,通過添加機(jī)器來(lái)滿足大型網(wǎng)站服務(wù)的處理能力。比如:一臺(tái)機(jī)器不能滿足,則增加兩臺(tái)或者多臺(tái)機(jī)器,共同承擔(dān)訪問壓力。
????典型負(fù)載均衡架構(gòu)如下:
????軟件負(fù)載解決的兩個(gè)核心問題是:選誰(shuí)、轉(zhuǎn)發(fā)。
04?分類
4.1 按照軟硬件
? ? 硬件負(fù)載均衡
????通過F5、A10、Citrix Netscaler等硬件實(shí)現(xiàn)負(fù)載均衡。
????軟件負(fù)載均衡
????通過LVS、Nginx、HAProxy等軟件實(shí)現(xiàn)負(fù)載均衡。
4.2 按照實(shí)現(xiàn)技術(shù)
????根據(jù)實(shí)現(xiàn)技術(shù)不同,可分為DNS負(fù)載均衡,HTTP負(fù)載均衡,IP負(fù)載均衡,鏈路層負(fù)載均衡等。
????DNS負(fù)載均衡
????最早的負(fù)載均衡技術(shù),利用域名解析實(shí)現(xiàn)負(fù)載均衡,在DNS服務(wù)器,配置多個(gè)A記錄,這些A記錄對(duì)應(yīng)的服務(wù)器構(gòu)成集群。大型網(wǎng)站總是部分使用DNS解析,作為第一級(jí)負(fù)載均衡。
? ??優(yōu)點(diǎn):
??? 1、使用簡(jiǎn)單:負(fù)載均衡工作交給DNS服務(wù)器處理,不需要專門的服務(wù)器維護(hù);
??? 2、提高性能:可以支持基于地址的域名解析,解析成距離用戶最近的服務(wù)器地址,可以加快訪問速度。
? ??缺點(diǎn):
??? 1、可用性差:新增/修改DNS后,解析時(shí)間較長(zhǎng);
??? 2、擴(kuò)展性低:DNS負(fù)載均衡的控制權(quán)在域名商,擴(kuò)展性有限。
????實(shí)踐建議:將DNS作為第一級(jí)負(fù)載均衡。
????IP負(fù)載均衡
????IP負(fù)載均衡,在網(wǎng)絡(luò)層通過修改請(qǐng)求目標(biāo)地址進(jìn)行負(fù)載均衡。
? ??優(yōu)點(diǎn):
????在內(nèi)核進(jìn)程完成數(shù)據(jù)分發(fā),比在應(yīng)用層分發(fā)性能更好。
? ??缺點(diǎn):
????所有請(qǐng)求響應(yīng)都需要經(jīng)過負(fù)載均衡服務(wù)器,集群最大吞吐量受限于負(fù)載均衡服務(wù)器網(wǎng)卡帶寬。
????鏈路層負(fù)載均衡
????在通信協(xié)議的數(shù)據(jù)鏈路層修改mac地址,進(jìn)行負(fù)載均衡。
????數(shù)據(jù)分發(fā)時(shí),不修改ip地址,指修改目標(biāo)mac地址,配置真實(shí)物理服務(wù)器集群所有機(jī)器虛擬ip和負(fù)載均衡服務(wù)器ip地址一致,達(dá)到不修改數(shù)據(jù)包的源地址和目標(biāo)地址,進(jìn)行數(shù)據(jù)分發(fā)的目的。
? ??優(yōu)點(diǎn):性能好。
???缺點(diǎn):配置復(fù)雜。
????實(shí)踐建議:直接路由(DR)模式最常用。
????混合型負(fù)載均衡
????由于多個(gè)服務(wù)器群內(nèi)硬件設(shè)備、規(guī)模、提供服務(wù)等差異,可以考慮給每個(gè)服務(wù)器群采用最合適的負(fù)載均衡方式,然后又在這多個(gè)服務(wù)器群間再一次負(fù)載均衡或群集起來(lái)以一個(gè)整體向外界提供服務(wù),從而達(dá)到最佳的性能,將這種方式稱之為混合型負(fù)載均衡。
4.3 按照OSI層次
? ??二層負(fù)載均衡
????負(fù)載均衡服務(wù)器對(duì)外依然提供一個(gè) VIP(浮動(dòng)IP),集群中不同的機(jī)器采用相同IP地址,但機(jī)器的MAC地址不一樣。當(dāng)負(fù)載均衡服務(wù)器接受到請(qǐng)求之后,通過改寫報(bào)文的目標(biāo)MAC地址的方式將請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)機(jī)器實(shí)現(xiàn)負(fù)載均衡。
? ??三層負(fù)載均衡
????負(fù)載均衡服務(wù)器對(duì)外依然提供一個(gè)VIP,但集群中不同的機(jī)器采用不同的IP地址。當(dāng)負(fù)載均衡服務(wù)器接受到請(qǐng)求之后,根據(jù)不同的負(fù)載均衡算法,通過IP將請(qǐng)求轉(zhuǎn)發(fā)至不同的真實(shí)服務(wù)器。
? ??四層負(fù)載均衡
????四層負(fù)載均衡服務(wù)器在接受到客戶端請(qǐng)求后,通過修改數(shù)據(jù)包的地址信息(IP+端口號(hào))將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器。
? ??七層負(fù)載均衡
????七層負(fù)載均衡工作在OSI模型的應(yīng)用層,應(yīng)用層協(xié)議較多,常用HTTP、DNS 等。七層負(fù)載就可以基于這些協(xié)議來(lái)負(fù)載。比如同一個(gè)Web服務(wù)器的負(fù)載均衡,除了根據(jù)IP加端口進(jìn)行負(fù)載外,還可根據(jù)七層的URL、瀏覽器類別、語(yǔ)言來(lái)決定是否要進(jìn)行負(fù)載均衡。
05?負(fù)載均衡算法
????負(fù)載均衡服務(wù)器在決定將請(qǐng)求轉(zhuǎn)發(fā)到具體哪臺(tái)真實(shí)服務(wù)器時(shí),是通過負(fù)載均衡算法來(lái)實(shí)現(xiàn)的。負(fù)載均衡算法可以分為兩類:靜態(tài)負(fù)載均衡算法和動(dòng)態(tài)負(fù)載均衡算法。
????靜態(tài)負(fù)載均衡算法包括:輪詢、比率、優(yōu)先權(quán)。
????動(dòng)態(tài)負(fù)載均衡算法包括:最少連接數(shù)、最快響應(yīng)速度、觀察方法、預(yù)測(cè)法、動(dòng)態(tài)性能分配、動(dòng)態(tài)服務(wù)器補(bǔ)充、服務(wù)質(zhì)量、服務(wù)類型、規(guī)則模式。
5.1 輪詢
????輪詢(Round Robin):順序循環(huán)將請(qǐng)求一次順序循環(huán)地連接每個(gè)服務(wù)器。以輪詢的方式依次請(qǐng)求調(diào)度不同的服務(wù)器;實(shí)現(xiàn)時(shí),一般為服務(wù)器帶上權(quán)重。
? ??優(yōu)點(diǎn):服務(wù)器請(qǐng)求數(shù)目相同;實(shí)現(xiàn)簡(jiǎn)單、高效;易水平擴(kuò)展。
? ??缺點(diǎn):服務(wù)器壓力不一樣,不適合服務(wù)器配置不同的情況;請(qǐng)求到目的結(jié)點(diǎn)的不確定,造成其無(wú)法適用于有寫操作的場(chǎng)景。
? ??應(yīng)用場(chǎng)景:數(shù)據(jù)庫(kù)或應(yīng)用服務(wù)層中只有讀的場(chǎng)景。
5.2 比率(Ratio)
????給每個(gè)服務(wù)器分配一個(gè)加權(quán)值為比例,根椐這個(gè)比例,把用戶的請(qǐng)求分配到每個(gè)服務(wù)器。
5.3 優(yōu)先權(quán)(Priority)
????給所有服務(wù)器分組,給每個(gè)組定義優(yōu)先權(quán)。當(dāng)最高優(yōu)先級(jí)中所有服務(wù)器出現(xiàn)故障,將請(qǐng)求送給次優(yōu)先級(jí)的服務(wù)器組。這種方式,實(shí)際為用戶提供一種熱備份的方式。
5.4 最少連接
????將請(qǐng)求分配到連接數(shù)最少的服務(wù)器(目前處理請(qǐng)求最少的服務(wù)器)。
? ??優(yōu)點(diǎn):根據(jù)服務(wù)器當(dāng)前的請(qǐng)求處理情況,動(dòng)態(tài)分配;
? ??缺點(diǎn):算法實(shí)現(xiàn)相對(duì)復(fù)雜,需要監(jiān)控服務(wù)器請(qǐng)求連接數(shù);
5.5 最快模式(Fastest)
????傳遞連接給那些響應(yīng)最快的服務(wù)器。
5.6 觀察模式(Observed)
????連接數(shù)目和響應(yīng)時(shí)間這兩項(xiàng)的最佳平衡為依據(jù)為新的請(qǐng)求選擇服務(wù)器。
5.7 預(yù)測(cè)模式(Predictive)
????利用收集到的服務(wù)器當(dāng)前的性能指標(biāo),進(jìn)行預(yù)測(cè)分析,選擇一臺(tái)服務(wù)器在下一個(gè)時(shí)間片內(nèi),其性能將達(dá)到最佳的服務(wù)器相應(yīng)用戶的請(qǐng)求。
5.8 動(dòng)態(tài)性能分配(Dynamic Ratio-APM)
????根據(jù)收集到的應(yīng)用程序和應(yīng)用服務(wù)器的各項(xiàng)性能參數(shù),動(dòng)態(tài)調(diào)整流量分配。
5.9 動(dòng)態(tài)服務(wù)器補(bǔ)充(Dynamic Server Act)
????當(dāng)主服務(wù)器群中因故障導(dǎo)致數(shù)量減少時(shí),動(dòng)態(tài)地將備份服務(wù)器補(bǔ)充至主服務(wù)器群。
5.10 服務(wù)質(zhì)量(QoS)
????按不同的優(yōu)先級(jí)對(duì)數(shù)據(jù)流進(jìn)行分配。
5.11 服務(wù)類型(ToS)
????按不同的服務(wù)類型(在 Type of Field 中標(biāo)識(shí))負(fù)載均衡對(duì)數(shù)據(jù)流進(jìn)行分配。
5.12 規(guī)則模式
????針對(duì)不同的數(shù)據(jù)流設(shè)置導(dǎo)向規(guī)則,用戶可自行設(shè)置。
06?負(fù)載均衡方案
6.1 硬件方案
????采用硬件的方式實(shí)現(xiàn)負(fù)載均衡,一般是單獨(dú)的負(fù)載均衡服務(wù)器,價(jià)格昂貴,常用的有:F5、A10、Citrix Netscaler。
? ??優(yōu)點(diǎn):
??? 1、硬件負(fù)載均衡穩(wěn)定性更強(qiáng),雙機(jī)或集群的效果更佳,可以應(yīng)對(duì)高并發(fā)、高吞吐的網(wǎng)絡(luò)環(huán)境中。
??? 2、在策略配置方面,可以實(shí)現(xiàn)深度的健康檢查方法,而不是簡(jiǎn)單的ping或tcp的方式,而是可以針對(duì)業(yè)務(wù)層進(jìn)行健康檢查,整體的策略調(diào)度更靈活、配置更方便,在七層負(fù)載方面更具優(yōu)勢(shì)。
? ??缺點(diǎn):
??? 1、價(jià)格昂貴;
??? 2、擴(kuò)展能力差,無(wú)法進(jìn)行擴(kuò)展和定制;
??? 3、調(diào)試和維護(hù)比較麻煩,需要專業(yè)人員。
????選擇:
????核心系統(tǒng)必須使用硬件負(fù)載均衡設(shè)備;
????測(cè)試系統(tǒng)和一般系統(tǒng)可以使用軟件負(fù)載均衡設(shè)備。
6.2 軟件方案
????硬件負(fù)載均衡價(jià)格昂貴,在實(shí)際應(yīng)用中遠(yuǎn)不如軟件負(fù)載均衡普遍。常用的軟件負(fù)載均衡軟件有Nginx、LVS、HaProxy、ats、perlbal、pound等。
????Nginx/LVS/HAProxy是目前使用最廣泛的三種負(fù)載均衡軟件。
? ??對(duì)比:
??? LVS:是基于四層的轉(zhuǎn)發(fā)(只能做端口轉(zhuǎn)發(fā),不能做基于URL、目錄的轉(zhuǎn)發(fā))
??? HAproxy:是基于四層和七層的轉(zhuǎn)發(fā),是專業(yè)的代理服務(wù)器
??? Nginx:是WEB服務(wù)器,緩存服務(wù)器,又是反向代理服務(wù)器,可以做七層的轉(zhuǎn)發(fā)
? ??選擇:
??? 1、HAproxy和Nginx可做七層轉(zhuǎn)發(fā),URL和目錄轉(zhuǎn)發(fā)都可以;
??? 2、中小型企業(yè)推薦使用HAproxy(配置簡(jiǎn)單);
??? 3、在很大并發(fā)量的時(shí)候選擇LVS。
07?網(wǎng)絡(luò)分層負(fù)載均衡架構(gòu)
????互聯(lián)網(wǎng)領(lǐng)域?qū)τ谪?fù)載均衡的架構(gòu)是隨著網(wǎng)站規(guī)模提升不斷演進(jìn)的,大致分為如下幾個(gè)階段:
????第一階段:利用Nginx或HAProxy進(jìn)行單點(diǎn)的負(fù)載均衡,該階段服務(wù)器剛從單機(jī)向集群轉(zhuǎn)變,需要在七層做轉(zhuǎn)發(fā)。
????第二階段:隨著網(wǎng)絡(luò)規(guī)模擴(kuò)大,Nginx單點(diǎn)瓶頸突出,這時(shí)使用LVS或者商用Array就是首要選擇,Nginx此時(shí)就作為L(zhǎng)VS或者Array的節(jié)點(diǎn)來(lái)使用,具體LVS或Array的是選擇是根據(jù)公司規(guī)模和預(yù)算來(lái)選擇。
????第三階段:這時(shí)網(wǎng)絡(luò)服務(wù)已經(jīng)成為主流產(chǎn)品,此時(shí)隨著公司知名度也進(jìn)一步擴(kuò)展,相關(guān)人才的能力以及數(shù)量也隨之提升,這時(shí)無(wú)論從開發(fā)適合自身產(chǎn)品的定制,以及降低成本來(lái)講開源的LVS,已經(jīng)成為首選,這時(shí)LVS會(huì)成為主流。
????常見互聯(lián)網(wǎng)分布式架構(gòu)可分為用戶層、反向代理層、Web站點(diǎn)層、業(yè)務(wù)服務(wù)層、數(shù)據(jù)存儲(chǔ)層?;ヂ?lián)網(wǎng)分層架構(gòu):
????每層之間交互都有相應(yīng)的負(fù)載均衡方案:? ?
????客戶端層->反向代理層:DNS輪詢。
????反向代理層->Web站點(diǎn)層:Ngnix(均衡策略:請(qǐng)求輪詢/最少連接路由/IP哈希)。
????Web站點(diǎn)層->業(yè)務(wù)服務(wù)層:連接池。
????業(yè)務(wù)服務(wù)層->數(shù)據(jù)存儲(chǔ)層:數(shù)據(jù)分片,讀寫分離。