負(fù)載均衡原理最全詳解
為什么需要負(fù)載均衡
當(dāng)系統(tǒng)面臨大量用戶訪問(wèn),負(fù)載過(guò)高的時(shí)候,通常會(huì)使用增加服務(wù)器數(shù)量來(lái)進(jìn)行橫向擴(kuò)展,使用集群和負(fù)載均衡提高整個(gè)系統(tǒng)的處理能力。
從單機(jī)網(wǎng)站到分布式網(wǎng)站,很重要的區(qū)別是業(yè)務(wù)拆分和分布式部署,將應(yīng)用拆分后,部署到不同的機(jī)器上,實(shí)現(xiàn)大規(guī)模分布式系統(tǒng)。
分布式和業(yè)務(wù)拆分解決了,從集中到分布的問(wèn)題,但是每個(gè)部署的獨(dú)立業(yè)務(wù)還存在單點(diǎn)的問(wèn)題和訪問(wèn)統(tǒng)一入口問(wèn)題,為解決單點(diǎn)故障,我們可以采取冗余的方式,將相同的應(yīng)用部署到多臺(tái)機(jī)器上。
解決訪問(wèn)統(tǒng)一入口問(wèn)題,我們可以在集群前面增加負(fù)載均衡設(shè)備,實(shí)現(xiàn)流量分發(fā)。
圖片
負(fù)載均衡的作用
圖片
1.解決并發(fā)壓力
提高應(yīng)用處理性能,增加吞吐量,加強(qiáng)網(wǎng)絡(luò)處理能力。
2.實(shí)現(xiàn)高可用
提供故障轉(zhuǎn)移,實(shí)現(xiàn)整個(gè)應(yīng)用的高可用。
3.實(shí)現(xiàn)擴(kuò)展性
通過(guò)添加或減少服務(wù)器數(shù)量,提供網(wǎng)站伸縮性擴(kuò)展性。
4.實(shí)現(xiàn)安全防護(hù)
負(fù)載均衡設(shè)備上做一些過(guò)濾,黑白名單等處理。
負(fù)載均衡的原理
系統(tǒng)的擴(kuò)展可分為縱向(垂直)擴(kuò)展和橫向(水平)擴(kuò)展。
縱向擴(kuò)展,是從單機(jī)的角度通過(guò)增加硬件處理能力,比如CPU處理能力,內(nèi)存容量,磁盤等方面,實(shí)現(xiàn)服務(wù)器處理能力的提升,不能滿足大型分布式系統(tǒng)(網(wǎng)站),大流量,高并發(fā),海量數(shù)據(jù)的問(wèn)題。
因此需要采用橫向擴(kuò)展的方式,通過(guò)添加機(jī)器來(lái)滿足大型網(wǎng)站服務(wù)的處理能力。
比如:一臺(tái)機(jī)器不能滿足,則增加兩臺(tái)或者多臺(tái)機(jī)器,共同承擔(dān)訪問(wèn)壓力。這就是典型的集群和負(fù)載均衡架構(gòu):如下圖:
圖片
- 應(yīng)用集群:將同一應(yīng)用部署到多臺(tái)機(jī)器上,組成處理集群,接收負(fù)載均衡設(shè)備分發(fā)的請(qǐng)求,進(jìn)行處理,并返回相應(yīng)數(shù)據(jù)。
- 負(fù)載均衡設(shè)備:將用戶訪問(wèn)的請(qǐng)求,根據(jù)負(fù)載均衡算法,分發(fā)到集群中的一臺(tái)處理服務(wù)器。
負(fù)載均衡算法
1.輪循
圖片
輪詢很容易實(shí)現(xiàn),將請(qǐng)求按順序輪流分配到后臺(tái)服務(wù)器上,均衡的對(duì)待每一臺(tái)服務(wù)器,而不關(guān)心服務(wù)器實(shí)際的連接數(shù)和當(dāng)前的系統(tǒng)負(fù)載。
適合場(chǎng)景:適合于應(yīng)用服務(wù)器硬件都相同的情況。
2.加權(quán)輪循
圖片
在輪詢的基礎(chǔ)上根據(jù)硬件配置不同,按權(quán)重分發(fā)到不同的服務(wù)器。
適合場(chǎng)景:跟配置高、負(fù)載低的機(jī)器分配更高的權(quán)重,使其能處理更多的請(qǐng)求,而性能低、負(fù)載高的機(jī)器,配置較低的權(quán)重,讓其處理較少的請(qǐng)求。
3.隨機(jī)
圖片
通過(guò)系統(tǒng)隨機(jī)函數(shù),根據(jù)后臺(tái)服務(wù)器列表的大小值來(lái)隨機(jī)選取其中一臺(tái)進(jìn)行訪問(wèn)。
隨著調(diào)用量的增大,客戶端的請(qǐng)求可以被均勻地分派到所有的后端服務(wù)器上,其實(shí)際效果越來(lái)越接近于平均分配流量到后臺(tái)的每一臺(tái)服務(wù)器,也就是輪詢法的效果。
4.最少連接
圖片
記錄每個(gè)服務(wù)器正在處理的請(qǐng)求數(shù),把新的請(qǐng)求分發(fā)到最少連接的服務(wù)器上,因?yàn)橐S護(hù)內(nèi)部狀態(tài)不推薦。
5.源地址散列
圖片
根據(jù)服務(wù)消費(fèi)者請(qǐng)求客戶端的IP地址,通過(guò)哈希函數(shù)計(jì)算得到一個(gè)哈希值,將此哈希值和服務(wù)器列表的大小進(jìn)行取模運(yùn)算,得到的結(jié)果便是要訪問(wèn)的服務(wù)器地址的序號(hào)。
適合場(chǎng)景:根據(jù)請(qǐng)求的來(lái)源IP進(jìn)行hash計(jì)算,同一IP地址的客戶端,當(dāng)后端服務(wù)器列表不變時(shí),它每次都會(huì)映射到同一臺(tái)后端服務(wù)器進(jìn)行訪問(wèn)。
負(fù)載均衡的分類
圖片
1.二層負(fù)載均衡(mac)
根據(jù)OSI模型分的二層負(fù)載,一般是用虛擬mac地址方式,外部對(duì)虛擬MAC地址請(qǐng)求,負(fù)載均衡接收后分配后端實(shí)際的MAC地址響應(yīng)。
備注:MAC(Media Access Control Address)
2.三層負(fù)載均衡(ip)
一般采用虛擬IP地址方式,外部對(duì)虛擬的ip地址請(qǐng)求,負(fù)載均衡接收后分配后端實(shí)際的IP地址響應(yīng)。
3.四層負(fù)載均衡(tcp)
四層的負(fù)載均衡在三層負(fù)載均衡的基礎(chǔ)上,通過(guò)發(fā)布三層的IP地址(VIP),然后加四層的端口號(hào),來(lái)決定哪些流量需要做負(fù)載均衡。
四層負(fù)載均衡在中間傳輸層執(zhí)行,它處理消息的傳遞,但不考慮消息的內(nèi)容,用ip+port接收請(qǐng)求,再轉(zhuǎn)發(fā)到對(duì)應(yīng)的機(jī)器。
四層負(fù)載均衡不理解應(yīng)用協(xié)議,比如:
- HTTP
- FTP
- MySQL等等
實(shí)現(xiàn)四層負(fù)載均衡的軟件有:
- F5:硬件負(fù)載均衡器,功能很好,但是成本很高。
- lvs:重量級(jí)的四層負(fù)載軟件
- nginx:輕量級(jí)的四層負(fù)載軟件,帶緩存功能,正則表達(dá)式較靈活
- haproxy:模擬四層轉(zhuǎn)發(fā),較靈活
4.七層負(fù)載均衡(http)
七層負(fù)載均衡不同于四層負(fù)載均衡,它在高級(jí)應(yīng)用層上執(zhí)行,會(huì)處理每個(gè)消息的實(shí)際內(nèi)容。
所謂七層負(fù)載均衡,也稱為“內(nèi)容交換”,也就是主要通過(guò)報(bào)文中的真正有意義的應(yīng)用層內(nèi)容,決定最終選擇的內(nèi)部服務(wù)器。
七層負(fù)載均衡它可以根據(jù)消息內(nèi)容(如URL)做出負(fù)載均衡決策,比如:對(duì)URL圖片類的請(qǐng)求轉(zhuǎn)發(fā)到特定的圖片服務(wù)器。
實(shí)現(xiàn)七層負(fù)載均衡的軟件有:
- HAproxy:天生負(fù)載均衡技能,全面支持七層代理,會(huì)話保持,標(biāo)記,路徑轉(zhuǎn)移;
- Nginx:只在http協(xié)議和mail協(xié)議上功能比較好,性能與haproxy差不多;
- apache:功能較差
總的來(lái)說(shuō),一般是LVS做4層負(fù)載,Nginx或者Haproxy做7層負(fù)載,性能上LVS>HA>Nginx,功能性和便利性上Nginx>HA>LVS。