負(fù)載均衡
負(fù)載均衡(load balance 簡稱,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)洛史,它則是針對業(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ā)請求。它是針對某些特定的協(xié)議凛驮,所以不通用裆站。比如NGINX(1.9版本的nginx已經(jīng)支持四層轉(zhuǎn)發(fā)了)只能適用于HTTP而不適用于MySQL。
四層負(fù)載均衡是真正意義上的負(fù)載均衡黔夭,它通過修改網(wǎng)絡(luò)數(shù)據(jù)包遏插,然后“中轉(zhuǎn)”請求,一般工作在操作系統(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請求是一系列數(shù)據(jù)包,所以在tcp關(guān)閉之前所有的數(shù)據(jù)包都應(yīng)該發(fā)送到同一個(gè)backend浇衬,可以參考tcp的三次握手四次斷開來理解這段話)懒构。
以nginx為例,frontend server收到http請求數(shù)據(jù)包后會(huì)通過負(fù)載均衡算法選擇出一臺(tái)backend server耘擂;然后從本地重新構(gòu)建一個(gè)http請求發(fā)送給backend server胆剧,backend server收到frontend server的http請求后完成數(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: 用戶請求的真實(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)中,客戶端請求一定是先到達(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通過修改請求中目標(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ū)別趟紊。