01?背景
????面對大量用戶訪問、高并發(fā)請求藏研,單機(jī)網(wǎng)站可以從軟硬件兩個方面尋求解決方法:
??? 1敬矩、硬件方面:可以使用高性能的服務(wù)器、大型數(shù)據(jù)庫遥倦,存儲設(shè)備谤绳,高性能Web服務(wù)器占锯;
??? 2袒哥、軟件方面:采用高效率的編程語言(比如Go,Erlang消略,Scala)等堡称。
????但是,當(dāng)單機(jī)容量達(dá)到極限時艺演,我們需要考慮業(yè)務(wù)拆分和分布式部署却紧,來解決大型網(wǎng)站訪問量大,并發(fā)量高胎撤,海量數(shù)據(jù)的問題晓殊。即需要從架構(gòu)方面尋求解決方案。
02?概述
????負(fù)載均衡(Load Balance)伤提,意思是將負(fù)載(如前端的訪問請求)進(jìn)行平衡巫俺、(通過負(fù)載均衡算法)分?jǐn)偟蕉鄠€操作單元(服務(wù)器,中間件)上進(jìn)行執(zhí)行肿男。是解決高性能介汹,單點故障(高可用),擴(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)存容量锨匆,磁盤等方面崭别,實現(xiàn)服務(wù)器處理能力的提升,不能滿足大型分布式系統(tǒng)(網(wǎng)站)恐锣,大流量茅主,高并發(fā),海量數(shù)據(jù)的問題土榴。因此需要采用橫向擴(kuò)展的方式诀姚,通過添加機(jī)器來滿足大型網(wǎng)站服務(wù)的處理能力。比如:一臺機(jī)器不能滿足玷禽,則增加兩臺或者多臺機(jī)器赫段,共同承擔(dān)訪問壓力。
????典型負(fù)載均衡架構(gòu)如下:
????軟件負(fù)載解決的兩個核心問題是:選誰矢赁、轉(zhuǎn)發(fā)糯笙。
04?分類
4.1 按照軟硬件
? ? 硬件負(fù)載均衡
????通過F5、A10撩银、Citrix Netscaler等硬件實現(xiàn)負(fù)載均衡给涕。
????軟件負(fù)載均衡
????通過LVS、Nginx蜒蕾、HAProxy等軟件實現(xiàn)負(fù)載均衡稠炬。
4.2 按照實現(xiàn)技術(shù)
????根據(jù)實現(xiàn)技術(shù)不同,可分為DNS負(fù)載均衡咪啡,HTTP負(fù)載均衡首启,IP負(fù)載均衡,鏈路層負(fù)載均衡等撤摸。
????DNS負(fù)載均衡
????最早的負(fù)載均衡技術(shù)毅桃,利用域名解析實現(xiàn)負(fù)載均衡褒纲,在DNS服務(wù)器,配置多個A記錄钥飞,這些A記錄對應(yīng)的服務(wù)器構(gòu)成集群莺掠。大型網(wǎng)站總是部分使用DNS解析,作為第一級負(fù)載均衡读宙。
? ??優(yōu)點:
??? 1彻秆、使用簡單:負(fù)載均衡工作交給DNS服務(wù)器處理,不需要專門的服務(wù)器維護(hù)结闸;
??? 2唇兑、提高性能:可以支持基于地址的域名解析,解析成距離用戶最近的服務(wù)器地址桦锄,可以加快訪問速度扎附。
? ??缺點:
??? 1、可用性差:新增/修改DNS后结耀,解析時間較長留夜;
??? 2、擴(kuò)展性低:DNS負(fù)載均衡的控制權(quán)在域名商图甜,擴(kuò)展性有限碍粥。
????實踐建議:將DNS作為第一級負(fù)載均衡。
????IP負(fù)載均衡
????IP負(fù)載均衡具则,在網(wǎng)絡(luò)層通過修改請求目標(biāo)地址進(jìn)行負(fù)載均衡即纲。
? ??優(yōu)點:
????在內(nèi)核進(jìn)程完成數(shù)據(jù)分發(fā)具帮,比在應(yīng)用層分發(fā)性能更好博肋。
? ??缺點:
????所有請求響應(yīng)都需要經(jīng)過負(fù)載均衡服務(wù)器,集群最大吞吐量受限于負(fù)載均衡服務(wù)器網(wǎng)卡帶寬蜂厅。
????鏈路層負(fù)載均衡
????在通信協(xié)議的數(shù)據(jù)鏈路層修改mac地址匪凡,進(jìn)行負(fù)載均衡。
????數(shù)據(jù)分發(fā)時掘猿,不修改ip地址病游,指修改目標(biāo)mac地址,配置真實物理服務(wù)器集群所有機(jī)器虛擬ip和負(fù)載均衡服務(wù)器ip地址一致稠通,達(dá)到不修改數(shù)據(jù)包的源地址和目標(biāo)地址衬衬,進(jìn)行數(shù)據(jù)分發(fā)的目的。
? ??優(yōu)點:性能好改橘。
???缺點:配置復(fù)雜滋尉。
????實踐建議:直接路由(DR)模式最常用。
????混合型負(fù)載均衡
????由于多個服務(wù)器群內(nèi)硬件設(shè)備飞主、規(guī)模狮惜、提供服務(wù)等差異高诺,可以考慮給每個服務(wù)器群采用最合適的負(fù)載均衡方式,然后又在這多個服務(wù)器群間再一次負(fù)載均衡或群集起來以一個整體向外界提供服務(wù)碾篡,從而達(dá)到最佳的性能虱而,將這種方式稱之為混合型負(fù)載均衡。
4.3 按照OSI層次
? ??二層負(fù)載均衡
????負(fù)載均衡服務(wù)器對外依然提供一個 VIP(浮動IP)开泽,集群中不同的機(jī)器采用相同IP地址牡拇,但機(jī)器的MAC地址不一樣。當(dāng)負(fù)載均衡服務(wù)器接受到請求之后穆律,通過改寫報文的目標(biāo)MAC地址的方式將請求轉(zhuǎn)發(fā)到目標(biāo)機(jī)器實現(xiàn)負(fù)載均衡诅迷。
? ??三層負(fù)載均衡
????負(fù)載均衡服務(wù)器對外依然提供一個VIP,但集群中不同的機(jī)器采用不同的IP地址众旗。當(dāng)負(fù)載均衡服務(wù)器接受到請求之后罢杉,根據(jù)不同的負(fù)載均衡算法,通過IP將請求轉(zhuǎn)發(fā)至不同的真實服務(wù)器贡歧。
? ??四層負(fù)載均衡
????四層負(fù)載均衡服務(wù)器在接受到客戶端請求后滩租,通過修改數(shù)據(jù)包的地址信息(IP+端口號)將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器。
? ??七層負(fù)載均衡
????七層負(fù)載均衡工作在OSI模型的應(yīng)用層利朵,應(yīng)用層協(xié)議較多律想,常用HTTP、DNS 等绍弟。七層負(fù)載就可以基于這些協(xié)議來負(fù)載技即。比如同一個Web服務(wù)器的負(fù)載均衡,除了根據(jù)IP加端口進(jìn)行負(fù)載外樟遣,還可根據(jù)七層的URL而叼、瀏覽器類別、語言來決定是否要進(jìn)行負(fù)載均衡豹悬。
05?負(fù)載均衡算法
????負(fù)載均衡服務(wù)器在決定將請求轉(zhuǎn)發(fā)到具體哪臺真實服務(wù)器時葵陵,是通過負(fù)載均衡算法來實現(xiàn)的。負(fù)載均衡算法可以分為兩類:靜態(tài)負(fù)載均衡算法和動態(tài)負(fù)載均衡算法瞻佛。
????靜態(tài)負(fù)載均衡算法包括:輪詢脱篙、比率、優(yōu)先權(quán)伤柄。
????動態(tài)負(fù)載均衡算法包括:最少連接數(shù)绊困、最快響應(yīng)速度、觀察方法适刀、預(yù)測法秤朗、動態(tài)性能分配、動態(tài)服務(wù)器補充蔗彤、服務(wù)質(zhì)量川梅、服務(wù)類型疯兼、規(guī)則模式。
5.1 輪詢
????輪詢(Round Robin):順序循環(huán)將請求一次順序循環(huán)地連接每個服務(wù)器贫途。以輪詢的方式依次請求調(diào)度不同的服務(wù)器吧彪;實現(xiàn)時,一般為服務(wù)器帶上權(quán)重丢早。
? ??優(yōu)點:服務(wù)器請求數(shù)目相同姨裸;實現(xiàn)簡單、高效怨酝;易水平擴(kuò)展傀缩。
? ??缺點:服務(wù)器壓力不一樣粉洼,不適合服務(wù)器配置不同的情況批糟;請求到目的結(jié)點的不確定,造成其無法適用于有寫操作的場景矢炼。
? ??應(yīng)用場景:數(shù)據(jù)庫或應(yīng)用服務(wù)層中只有讀的場景斤葱。
5.2 比率(Ratio)
????給每個服務(wù)器分配一個加權(quán)值為比例慷垮,根椐這個比例,把用戶的請求分配到每個服務(wù)器揍堕。
5.3 優(yōu)先權(quán)(Priority)
????給所有服務(wù)器分組料身,給每個組定義優(yōu)先權(quán)。當(dāng)最高優(yōu)先級中所有服務(wù)器出現(xiàn)故障衩茸,將請求送給次優(yōu)先級的服務(wù)器組芹血。這種方式,實際為用戶提供一種熱備份的方式楞慈。
5.4 最少連接
????將請求分配到連接數(shù)最少的服務(wù)器(目前處理請求最少的服務(wù)器)幔烛。
? ??優(yōu)點:根據(jù)服務(wù)器當(dāng)前的請求處理情況,動態(tài)分配抖部;
? ??缺點:算法實現(xiàn)相對復(fù)雜说贝,需要監(jiān)控服務(wù)器請求連接數(shù);
5.5 最快模式(Fastest)
????傳遞連接給那些響應(yīng)最快的服務(wù)器慎颗。
5.6 觀察模式(Observed)
????連接數(shù)目和響應(yīng)時間這兩項的最佳平衡為依據(jù)為新的請求選擇服務(wù)器。
5.7 預(yù)測模式(Predictive)
????利用收集到的服務(wù)器當(dāng)前的性能指標(biāo)言询,進(jìn)行預(yù)測分析俯萎,選擇一臺服務(wù)器在下一個時間片內(nèi),其性能將達(dá)到最佳的服務(wù)器相應(yīng)用戶的請求运杭。
5.8 動態(tài)性能分配(Dynamic Ratio-APM)
????根據(jù)收集到的應(yīng)用程序和應(yīng)用服務(wù)器的各項性能參數(shù)夫啊,動態(tài)調(diào)整流量分配。
5.9 動態(tài)服務(wù)器補充(Dynamic Server Act)
????當(dāng)主服務(wù)器群中因故障導(dǎo)致數(shù)量減少時辆憔,動態(tài)地將備份服務(wù)器補充至主服務(wù)器群撇眯。
5.10 服務(wù)質(zhì)量(QoS)
????按不同的優(yōu)先級對數(shù)據(jù)流進(jìn)行分配报嵌。
5.11 服務(wù)類型(ToS)
????按不同的服務(wù)類型(在 Type of Field 中標(biāo)識)負(fù)載均衡對數(shù)據(jù)流進(jìn)行分配。
5.12 規(guī)則模式
????針對不同的數(shù)據(jù)流設(shè)置導(dǎo)向規(guī)則熊榛,用戶可自行設(shè)置锚国。
06?負(fù)載均衡方案
6.1 硬件方案
????采用硬件的方式實現(xiàn)負(fù)載均衡,一般是單獨的負(fù)載均衡服務(wù)器玄坦,價格昂貴血筑,常用的有:F5、A10煎楣、Citrix Netscaler豺总。
? ??優(yōu)點:
??? 1、硬件負(fù)載均衡穩(wěn)定性更強择懂,雙機(jī)或集群的效果更佳喻喳,可以應(yīng)對高并發(fā)、高吞吐的網(wǎng)絡(luò)環(huán)境中困曙。
??? 2沸枯、在策略配置方面,可以實現(xiàn)深度的健康檢查方法赂弓,而不是簡單的ping或tcp的方式绑榴,而是可以針對業(yè)務(wù)層進(jìn)行健康檢查,整體的策略調(diào)度更靈活盈魁、配置更方便翔怎,在七層負(fù)載方面更具優(yōu)勢。
? ??缺點:
??? 1杨耙、價格昂貴赤套;
??? 2、擴(kuò)展能力差珊膜,無法進(jìn)行擴(kuò)展和定制容握;
??? 3、調(diào)試和維護(hù)比較麻煩车柠,需要專業(yè)人員剔氏。
????選擇:
????核心系統(tǒng)必須使用硬件負(fù)載均衡設(shè)備;
????測試系統(tǒng)和一般系統(tǒng)可以使用軟件負(fù)載均衡設(shè)備竹祷。
6.2 軟件方案
????硬件負(fù)載均衡價格昂貴谈跛,在實際應(yīng)用中遠(yuǎn)不如軟件負(fù)載均衡普遍。常用的軟件負(fù)載均衡軟件有Nginx塑陵、LVS感憾、HaProxy、ats令花、perlbal阻桅、pound等凉倚。
????Nginx/LVS/HAProxy是目前使用最廣泛的三種負(fù)載均衡軟件。
? ??對比:
??? 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(配置簡單)负芋;
??? 3、在很大并發(fā)量的時候選擇LVS嗜愈。
07?網(wǎng)絡(luò)分層負(fù)載均衡架構(gòu)
????互聯(lián)網(wǎng)領(lǐng)域?qū)τ谪?fù)載均衡的架構(gòu)是隨著網(wǎng)站規(guī)模提升不斷演進(jìn)的旧蛾,大致分為如下幾個階段:
????第一階段:利用Nginx或HAProxy進(jìn)行單點的負(fù)載均衡,該階段服務(wù)器剛從單機(jī)向集群轉(zhuǎn)變蠕嫁,需要在七層做轉(zhuǎn)發(fā)锨天。
????第二階段:隨著網(wǎng)絡(luò)規(guī)模擴(kuò)大,Nginx單點瓶頸突出剃毒,這時使用LVS或者商用Array就是首要選擇病袄,Nginx此時就作為LVS或者Array的節(jié)點來使用,具體LVS或Array的是選擇是根據(jù)公司規(guī)模和預(yù)算來選擇赘阀。
????第三階段:這時網(wǎng)絡(luò)服務(wù)已經(jīng)成為主流產(chǎn)品益缠,此時隨著公司知名度也進(jìn)一步擴(kuò)展,相關(guān)人才的能力以及數(shù)量也隨之提升基公,這時無論從開發(fā)適合自身產(chǎn)品的定制幅慌,以及降低成本來講開源的LVS,已經(jīng)成為首選轰豆,這時LVS會成為主流胰伍。
????常見互聯(lián)網(wǎng)分布式架構(gòu)可分為用戶層、反向代理層秒咨、Web站點層喇辽、業(yè)務(wù)服務(wù)層、數(shù)據(jù)存儲層雨席。互聯(lián)網(wǎng)分層架構(gòu):
????每層之間交互都有相應(yīng)的負(fù)載均衡方案:? ?
????客戶端層->反向代理層:DNS輪詢吠式。
????反向代理層->Web站點層:Ngnix(均衡策略:請求輪詢/最少連接路由/IP哈希)陡厘。
????Web站點層->業(yè)務(wù)服務(wù)層:連接池抽米。
????業(yè)務(wù)服務(wù)層->數(shù)據(jù)存儲層:數(shù)據(jù)分片,讀寫分離糙置。