負(fù)載均衡
負(fù)載均衡(load balance 簡(jiǎn)稱,LB)是一種網(wǎng)絡(luò)技術(shù),它在多個(gè)備選資源中做資源分配。這里有三個(gè)關(guān)鍵字:
- 網(wǎng)絡(luò)技術(shù),LB要解決的問題本質(zhì)上是網(wǎng)絡(luò)問題,所以它實(shí)際上就是通過修改數(shù)據(jù)包中MAC地址,IP地址段來實(shí)現(xiàn)數(shù)據(jù)包的“中轉(zhuǎn)”。
- 資源,這里的資源不僅可以是計(jì)算機(jī)資源,也可以是交換機(jī),存儲(chǔ)設(shè)備等。
- 最優(yōu),它則是針對(duì)業(yè)務(wù)而言最優(yōu),所以一般負(fù)載均衡有很多算法;輪詢、加權(quán)輪詢、最小負(fù)載等;
LB是網(wǎng)絡(luò)技術(shù),所以業(yè)內(nèi)就參考OSI模型用四層負(fù)載均衡和七層負(fù)載均衡進(jìn)行分類。四層負(fù)載均衡工作在OSI的第四層(傳輸層),這里的主要協(xié)議有TCP、UDP、SCTP協(xié)議,這種類型的負(fù)載均衡器不管數(shù)據(jù)包是什么,只是通過修改IP頭部或者以太網(wǎng)頭部的地址實(shí)現(xiàn)負(fù)載均衡。七層負(fù)載均衡工作在OSI的第七層(應(yīng)用層),這一層主要是HTTP,MySQL等應(yīng)用協(xié)議,這種負(fù)載均衡一般會(huì)把數(shù)據(jù)包內(nèi)容解析出來后通過一定的算法找到合適的服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求。它是針對(duì)某些特定的協(xié)議,所以不通用。比如NGINX(1.9版本的nginx已經(jīng)支持四層轉(zhuǎn)發(fā)了)只能適用于HTTP而不適用于MySQL。
四層負(fù)載均衡是真正意義上的負(fù)載均衡,它通過修改網(wǎng)絡(luò)數(shù)據(jù)包,然后“中轉(zhuǎn)”請(qǐng)求,一般工作在操作系統(tǒng)的內(nèi)核空間(kernel space),比如通過Linux的netfilter定義的hook改變數(shù)據(jù)包。七層負(fù)載均衡并不是嚴(yán)格意義上的負(fù)載均衡,它必須解析出數(shù)據(jù)包的內(nèi)容,根據(jù)內(nèi)容做相關(guān)轉(zhuǎn)發(fā)(比如MySQL的讀寫分離);一般工作在用戶空間(user space),比如通過Nginx、Mysql Proxy、Apache它們都是實(shí)現(xiàn)某個(gè)具體協(xié)議,很多資料都稱這種軟件叫代理(Proxy)。
實(shí)現(xiàn)LB的問題

任何負(fù)載均衡都要解決三個(gè)問題:
- 修改數(shù)據(jù)包,使得數(shù)據(jù)包可以轉(zhuǎn)發(fā)到后端服務(wù)器。
- frontend server要維護(hù)一個(gè)算法,可以選出最優(yōu)的backend server。
- frontend server要維護(hù)一張表記錄client和backend server的關(guān)系(比如tcp請(qǐng)求是一系列數(shù)據(jù)包,所以在tcp關(guān)閉之前所有的數(shù)據(jù)包都應(yīng)該發(fā)送到同一個(gè)backend,可以參考tcp的三次握手四次斷開來理解這段話)。
以nginx為例,frontend server收到http請(qǐng)求數(shù)據(jù)包后會(huì)通過負(fù)載均衡算法選擇出一臺(tái)backend server;然后從本地重新構(gòu)建一個(gè)http請(qǐng)求發(fā)送給backend server,backend server收到frontend server的http請(qǐng)求后完成數(shù)據(jù)解析并返數(shù)據(jù)給frontend server,最后frontend server重新封裝此數(shù)據(jù)返回給client。在這個(gè)過程中forntend server的Nginx是工作在用戶空間的它代替Client訪問backend server。
LVS的實(shí)現(xiàn)
它是一款四層負(fù)載均衡軟件,在它的實(shí)現(xiàn)中forntend server稱為director;backend server稱為real server,它支持UDP、TCP、SCTP、IPSec( AH 、ESP兩種數(shù)據(jù)包 )四種傳輸層協(xié)議的負(fù)載。

LVS以內(nèi)核模塊的形式加載到內(nèi)核空間,通過netfilter定義的hook來實(shí)現(xiàn)數(shù)據(jù)包的控制。 它用到了三個(gè)hook(以Linux 4.8.15為例)主要“掛在”:local_in、inet_forward、local_out;所有發(fā)送給本機(jī)的數(shù)據(jù)包都會(huì)經(jīng)過local_in,所有非本機(jī)的數(shù)據(jù)包都會(huì)經(jīng)過forward,所有從本機(jī)發(fā)出的數(shù)據(jù)包都會(huì)經(jīng)過local_out。
LVS由兩部分組成(很像iptables),用戶空間提供了一個(gè)ipvsadm的命令行工具,通過它定義負(fù)載均衡的“規(guī)則”;內(nèi)核模塊是系統(tǒng)的主要模塊它包括:
- IP包處理模塊,用于截取/改寫IP報(bào)文;
- 連接表管理,用于記錄當(dāng)前連接的Hash表;
- 調(diào)度算法模塊,提供了八種負(fù)載均衡算法——輪詢、加權(quán)輪詢、最少鏈接、加權(quán)最少鏈接、局部性最少鏈接、帶復(fù)制的局部性最少鏈接、目標(biāo)地址哈希、源地址哈希;
- 連接狀態(tài)收集,回收已經(jīng)過時(shí)的連接;
- 統(tǒng)計(jì),IPVS的統(tǒng)計(jì)信息
LVS實(shí)戰(zhàn)
LVS術(shù)語定義:
- DS: Director Server,前端負(fù)載均衡節(jié)點(diǎn)(后文用Director稱呼)
- RS: Real Server,后端真實(shí)服務(wù)器
- VIP: 用戶請(qǐng)求的真實(shí)IP,一般是公網(wǎng)IP
- DIP: Director Server IP,Director和Real Server通訊的內(nèi)網(wǎng)IP地址
- RIP: Real Server IP,Director和Real Server通訊的內(nèi)網(wǎng)IP地址
總結(jié)起來,LVS的三種模式只有一個(gè)區(qū)別,也就是“誰來返回?cái)?shù)據(jù)給客戶端”,在LB架構(gòu)中,客戶端請(qǐng)求一定是先到達(dá)forentend Server(LVS中是Director Server),那么返回?cái)?shù)據(jù)給client不一定經(jīng)過Director Server。
- NAT模式中,RS返回?cái)?shù)據(jù)包是給DS的,DS再返回給client。
- DR(Dicter Routing)模式中,RS是直接返回給client數(shù)據(jù)給client的(通過額外的路由)。Direct通過修改請(qǐng)求中目標(biāo)MAC地址為選定的RS的MAC地址來實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā),這就要求DS和RS在同一個(gè)廣播域內(nèi)了。
- TUN(IP Tunneling)模式中,RS返回的數(shù)據(jù)也是直接返回給客戶端,這種模式通過Overlay協(xié)議(把一個(gè)IP數(shù)據(jù)包封裝到另一個(gè)數(shù)據(jù)包內(nèi)部叫Overlay)避免了DR的限制。
以上就是LVS三種模式真正的區(qū)別。