當(dāng)前大多數(shù)的互聯(lián)網(wǎng)系統(tǒng)都使用了服務(wù)器集群技術(shù),集群是將相同服務(wù)部署在多臺服務(wù)器上構(gòu)成一個集群整體對外提供服務(wù)坐求,這些集群可以是 Web 應(yīng)用服務(wù)器集群,也可以是數(shù)據(jù)庫服務(wù)器集群晌梨,還可以是分布式緩存服務(wù)器集群等等瞻赶。
在實際應(yīng)用中赛糟,在 Web 服務(wù)器集群之前總會有一臺負(fù)載均衡服務(wù)器派任,負(fù)載均衡設(shè)備的任務(wù)就是作為 Web 服務(wù)器流量的入口砸逊,挑選最合適的一臺 Web 服務(wù)器,將客戶端的請求轉(zhuǎn)發(fā)給它處理掌逛,實現(xiàn)客戶端到真實服務(wù)端的透明轉(zhuǎn)發(fā)师逸。Java進(jìn)階交流群851531810
最近幾年很火的「云計算」以及分布式架構(gòu),本質(zhì)上也是將后端服務(wù)器作為計算資源豆混、存儲資源篓像,由某臺管理服務(wù)器封裝成一個服務(wù)對外提供,客戶端不需要關(guān)心真正提供服務(wù)的是哪臺機(jī)器皿伺,在它看來员辩,就好像它面對的是一臺擁有近乎無限能力的服務(wù)器,而本質(zhì)上鸵鸥,真正提供服務(wù)的奠滑,是后端的集群。
LVS妒穴、Nginx宋税、HAProxy 是目前使用最廣泛的三種軟件負(fù)載均衡軟件。
一般對負(fù)載均衡的使用是隨著網(wǎng)站規(guī)模的提升根據(jù)不同的階段來使用不同的技術(shù)讼油。具體的應(yīng)用需求還得具體分析杰赛,如果是中小型的 Web 應(yīng)用,比如日 PV 小于1000萬矮台,用 Nginx 就完全可以了乏屯;如果機(jī)器不少,可以用 DNS 輪詢瘦赫,LVS 所耗費的機(jī)器還是比較多的辰晕;大型網(wǎng)站或重要的服務(wù),且服務(wù)器比較多時耸彪,可以考慮用 LVS伞芹。
目前關(guān)于網(wǎng)站架構(gòu)一般比較合理流行的架構(gòu)方案:Web 前端采用 Nginx/HAProxy+Keepalived 作負(fù)載均衡器;后端采用 MySQ L數(shù)據(jù)庫一主多從和讀寫分離蝉娜,采用 LVS+Keepalived 的架構(gòu)唱较。
LVS
LVS 是 Linux Virtual Server 的簡稱,也就是 Linux 虛擬服務(wù)器≌俅ǎ現(xiàn)在 LVS 已經(jīng)是 Linux 標(biāo)準(zhǔn)內(nèi)核的一部分南缓,從 Linux2.4 內(nèi)核以后,已經(jīng)完全內(nèi)置了 LVS 的各個功能模塊荧呐,無需給內(nèi)核打任何補(bǔ)丁汉形,可以直接使用 LVS 提供的各種功能纸镊。
LVS 自從1998年開始,發(fā)展到現(xiàn)在已經(jīng)是一個比較成熟的技術(shù)項目了概疆。
LVS 的體系結(jié)構(gòu)
LVS 架設(shè)的服務(wù)器集群系統(tǒng)有三個部分組成:
(1) 最前端的負(fù)載均衡層逗威,用 Load Balancer 表示
(2) 中間的服務(wù)器集群層,用 Server Array 表示
(3) 最底端的數(shù)據(jù)共享存儲層岔冀,用 Shared Storage 表示
LVS 負(fù)載均衡機(jī)制
LVS 不像 HAProxy 等七層軟負(fù)載面向的是 HTTP 包凯旭,所以七層負(fù)載可以做的 URL 解析等工作,LVS 無法完成使套。
LVS 是四層負(fù)載均衡罐呼,也就是說建立在 OSI 模型的第四層——傳輸層之上,傳輸層上有我們熟悉的 TCP/UDP侦高,LVS 支持 TCP/UDP 的負(fù)載均衡嫉柴。因為 LVS 是四層負(fù)載均衡,因此它相對于其它高層負(fù)載均衡的解決辦法奉呛,比如 DNS 域名輪流解析计螺、應(yīng)用層負(fù)載的調(diào)度、客戶端的調(diào)度等侧馅,它的效率是非常高的危尿。
所謂四層負(fù)載均衡 ,也就是主要通過報文中的目標(biāo)地址和端口馁痴。七層負(fù)載均衡 谊娇,也稱為“內(nèi)容交換”,也就是主要通過報文中的真正有意義的應(yīng)用層內(nèi)容罗晕。
LVS 的轉(zhuǎn)發(fā)主要通過修改 IP 地址(NAT 模式济欢,分為源地址修改 SNAT 和目標(biāo)地址修改 DNAT)、修改目標(biāo) MAC(DR 模式)來實現(xiàn)小渊。
NAT 模式:網(wǎng)絡(luò)地址轉(zhuǎn)換
NAT(Network Address Translation)是一種外網(wǎng)和內(nèi)網(wǎng)地址映射的技術(shù)法褥。
NAT 模式下,網(wǎng)絡(luò)數(shù)據(jù)報的進(jìn)出都要經(jīng)過 LVS 的處理酬屉。LVS 需要作為 RS(真實服務(wù)器)的網(wǎng)關(guān)半等。
當(dāng)包到達(dá) LVS 時,LVS 做目標(biāo)地址轉(zhuǎn)換(DNAT)呐萨,將目標(biāo) IP 改為 RS 的 IP杀饵。RS 接收到包以后,仿佛是客戶端直接發(fā)給它的一樣谬擦。RS 處理完切距,返回響應(yīng)時,源 IP 是 RS IP惨远,目標(biāo) IP 是客戶端的 IP谜悟。這時 RS 的包通過網(wǎng)關(guān)(LVS)中轉(zhuǎn)话肖,LVS 會做源地址轉(zhuǎn)換(SNAT),將包的源地址改為 VIP葡幸,這樣最筒,這個包對客戶端看起來就仿佛是 LVS 直接返回給它的。
DR 模式:直接路由
DR 模式下需要 LVS 和 RS 集群綁定同一個 VIP(RS 通過將 VIP 綁定在 loopback 實現(xiàn))礼患,但與 NAT 的不同點在于:請求由 LVS 接受是钥,由真實提供服務(wù)的服務(wù)器(RealServer,RS)直接返回給用戶缅叠,返回的時候不經(jīng)過 LVS。
詳細(xì)來看虏冻,一個請求過來時肤粱,LVS 只需要將網(wǎng)絡(luò)幀的 MAC 地址修改為某一臺 RS 的 MAC,該包就會被轉(zhuǎn)發(fā)到相應(yīng)的 RS 處理厨相,注意此時的源 IP 和目標(biāo) IP 都沒變领曼,LVS 只是做了一下移花接木。RS 收到 LVS 轉(zhuǎn)發(fā)來的包時蛮穿,鏈路層發(fā)現(xiàn) MAC 是自己的庶骄,到上面的網(wǎng)絡(luò)層,發(fā)現(xiàn) IP 也是自己的践磅,于是這個包被合法地接受单刁,RS 感知不到前面有 LVS 的存在。而當(dāng) RS 返回響應(yīng)時府适,只要直接向源 IP(即用戶的 IP)返回即可羔飞,不再經(jīng)過 LVS。
DR 負(fù)載均衡模式數(shù)據(jù)分發(fā)過程中不修改 IP 地址檐春,只修改 mac 地址逻淌,由于實際處理請求的真實物理 IP 地址和數(shù)據(jù)請求目的 IP 地址一致,所以不需要通過負(fù)載均衡服務(wù)器進(jìn)行地址轉(zhuǎn)換疟暖,可將響應(yīng)數(shù)據(jù)包直接返回給用戶瀏覽器卡儒,避免負(fù)載均衡服務(wù)器網(wǎng)卡帶寬成為瓶頸。因此俐巴,DR 模式具有較好的性能骨望,也是目前大型網(wǎng)站使用最廣泛的一種負(fù)載均衡手段。
LVS 的優(yōu)點
抗負(fù)載能力強(qiáng)窜骄、Java進(jìn)階交流群851531810是工作在傳輸層上僅作分發(fā)之用锦募,沒有流量的產(chǎn)生,這個特點也決定了它在負(fù)載均衡軟件里的性能最強(qiáng)的邻遏,對內(nèi)存和 cpu 資源消耗比較低糠亩。
配置性比較低虐骑,這是一個缺點也是一個優(yōu)點,因為沒有可太多配置的東西赎线,所以并不需要太多接觸廷没,大大減少了人為出錯的幾率。
工作穩(wěn)定垂寥,因為其本身抗負(fù)載能力很強(qiáng)颠黎,自身有完整的雙機(jī)熱備方案,如 LVS + Keepalived滞项。
無流量适滓,LVS 只分發(fā)請求,而流量并不從它本身出去雏婶,這點保證了均衡器 IO 的性能不會受到大流量的影響忆肾。
應(yīng)用范圍比較廣,因為 LVS 工作在傳輸層戏仓,所以它幾乎可以對所有應(yīng)用做負(fù)載均衡疚宇,包括 http、數(shù)據(jù)庫赏殃、在線聊天室等等敷待。
LVS 的缺點
軟件本身不支持正則表達(dá)式處理,不能做動靜分離仁热;而現(xiàn)在許多網(wǎng)站在這方面都有較強(qiáng)的需求榜揖,這個是 Nginx、HAProxy + Keepalived 的優(yōu)勢所在股耽。
如果是網(wǎng)站應(yīng)用比較龐大的話根盒,LVS/DR + Keepalived 實施起來就比較復(fù)雜了,相對而言物蝙,Nginx / HAProxy + Keepalived 就簡單多了炎滞。
Nginx
Nginx 是一個強(qiáng)大的 Web 服務(wù)器軟件,用于處理高并發(fā)的 HTTP 請求和作為反向代理服務(wù)器做負(fù)載均衡诬乞。具有高性能册赛、輕量級、內(nèi)存消耗少震嫉,強(qiáng)大的負(fù)載均衡能力等優(yōu)勢森瘪。
Nignx 的架構(gòu)設(shè)計
相對于傳統(tǒng)基于進(jìn)程或線程的模型(Apache就采用這種模型)在處理并發(fā)連接時會為每一個連接建立一個單獨的進(jìn)程或線程,且在網(wǎng)絡(luò)或者輸入/輸出操作時阻塞票堵。這將導(dǎo)致內(nèi)存和 CPU 的大量消耗扼睬,因為新起一個單獨的進(jìn)程或線程需要準(zhǔn)備新的運行時環(huán)境,包括堆和棧內(nèi)存的分配悴势,以及新的執(zhí)行上下文窗宇,當(dāng)然措伐,這些也會導(dǎo)致多余的 CPU 開銷。最終军俊,會由于過多的上下文切換而導(dǎo)致服務(wù)器性能變差侥加。
反過來,Nginx 的架構(gòu)設(shè)計是采用模塊化的粪躬、基于事件驅(qū)動担败、異步、單線程且非阻塞镰官。
Nginx 大量使用多路復(fù)用和事件通知提前,Nginx 啟動以后,會在系統(tǒng)中以 daemon 的方式在后臺運行朋魔,其中包括一個 master 進(jìn)程岖研,n(n>=1) 個 worker 進(jìn)程。所有的進(jìn)程都是單線程(即只有一個主線程)的警检,且進(jìn)程間通信主要使用共享內(nèi)存的方式。
其中害淤,master 進(jìn)程用于接收來自外界的信號扇雕,并給 worker 進(jìn)程發(fā)送信號,同時監(jiān)控 worker 進(jìn)程的工作狀態(tài)窥摄。worker 進(jìn)程則是外部請求真正的處理者镶奉,每個 worker 請求相互獨立且平等的競爭來自客戶端的請求。請求只能在一個 worker 進(jìn)程中被處理崭放,且一個 worker 進(jìn)程只有一個主線程哨苛,所以同時只能處理一個請求。(原理同 Netty 很像)
Nginx 負(fù)載均衡
Nginx 負(fù)載均衡主要是對七層網(wǎng)絡(luò)通信模型中的第七層應(yīng)用層上的 http币砂、https 進(jìn)行支持建峭。
Nginx 是以反向代理的方式進(jìn)行負(fù)載均衡的。反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受 Internet 上的連接請求决摧,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器亿蒸,并將從服務(wù)器上得到的結(jié)果返回給 Internet 上請求連接的客戶端,此時代理服務(wù)器對外就表現(xiàn)為一個服務(wù)器掌桩。
Nginx 實現(xiàn)負(fù)載均衡的分配策略有很多边锁,Nginx 的 upstream 目前支持以下幾種方式:
輪詢(默認(rèn)):每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器 down 掉波岛,能自動剔除茅坛。
weight:指定輪詢幾率,weight 和訪問比率成正比则拷,用于后端服務(wù)器性能不均的情況贡蓖。
ip_hash:每個請求按訪問 ip 的 hash 結(jié)果分配曹鸠,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決 session 的問題摩梧。
fair(第三方):按后端服務(wù)器的響應(yīng)時間來分配請求物延,響應(yīng)時間短的優(yōu)先分配。
url_hash(第三方):按訪問 url 的 hash 結(jié)果來分配請求仅父,使每個 url 定向到同一個后端服務(wù)器叛薯,后端服務(wù)器為緩存時比較有效。
Nginx 的優(yōu)點
跨平臺:Nginx 可以在大多數(shù) Unix like OS編譯運行笙纤,而且也有 Windows 的移植版本
配置異常簡單:非常容易上手耗溜。配置風(fēng)格跟程序開發(fā)一樣,神一般的配置
非阻塞省容、高并發(fā)連接:官方測試能夠支撐5萬并發(fā)連接抖拴,在實際生產(chǎn)環(huán)境中跑到2~3萬并發(fā)連接數(shù)
事件驅(qū)動:通信機(jī)制采用 epoll 模型,支持更大的并發(fā)連接
Master/Worker 結(jié)構(gòu):一個 master 進(jìn)程腥椒,生成一個或多個 worker 進(jìn)程
內(nèi)存消耗邪⒄:處理大并發(fā)的請求內(nèi)存消耗非常小。在3萬并發(fā)連接下笼蛛,開啟的10個 Nginx 進(jìn)程才消耗150M 內(nèi)存(15M*10=150M)
內(nèi)置的健康檢查功能:如果 Nginx 代理的后端的某臺 Web 服務(wù)器宕機(jī)了洒放,不會影響前端訪問
節(jié)省帶寬:支持 GZIP 壓縮,可以添加瀏覽器本地緩存的 Header 頭
穩(wěn)定性高:用于反向代理滨砍,宕機(jī)的概率微乎其微
Nginx 的缺點
Nginx 僅能支 持http往湿、https 和 Email 協(xié)議,這樣就在適用范圍上面小些惋戏,這個是它的缺點
對后端服務(wù)器的健康檢查领追,只支持通過端口來檢測,不支持通過 ur l來檢測响逢。不支持 Session 的直接保持绒窑,但能通過 ip_hash 來解決
HAProxy
HAProxy 支持兩種代理模式 TCP(四層)和HTTP(七層),也是支持虛擬主機(jī)的龄句。
HAProxy 的優(yōu)點能夠補(bǔ)充 Nginx 的一些缺點回论,比如支持 Session 的保持,Cookie 的引導(dǎo)分歇;同時支持通過獲取指定的 url 來檢測后端服務(wù)器的狀態(tài)傀蓉。
HAProxy 跟 LVS 類似,本身就只是一款負(fù)載均衡軟件职抡;單純從效率上來講 HAProxy 會比 Nginx 有更出色的負(fù)載均衡速度葬燎,在并發(fā)處理上也是優(yōu)于 Nginx 的。
HAProxy 支持 TCP 協(xié)議的負(fù)載均衡轉(zhuǎn)發(fā),可以對 MySQL 讀進(jìn)行負(fù)載均衡谱净,對后端的 MySQL 節(jié)點進(jìn)行檢測和負(fù)載均衡窑邦,大家可以用 LVS+Keepalived 對 MySQL 主從做負(fù)載均衡。
HAProxy 負(fù)載均衡策略非常多:Round-robin(輪循)壕探、Weight-round-robin(帶權(quán)輪循)冈钦、source(原地址保持)、RI(請求URL)李请、rdp-cookie(根據(jù)cookie)瞧筛。
最后,給大家推薦一個Java進(jìn)階交流群851531810导盅,不管你在地球哪個方位较幌,不管你參加工作幾年都?xì)g迎你的入駐!(群內(nèi)會免費提供一些群主收藏的免費學(xué)習(xí)書籍資料以及整理好的幾百道面試題和答案文檔0追)