一文詳解 LVS、Nginx 及 HAProxy 工作原理

當前大多數的互聯網系統都使用了服務器集群技術,集群是將相同服務部署在多臺服務器上構成一個集群整體對外提供服務,這些集群可以是?Web?應用服務器集群,也可以是數據庫服務器集群,還可以是分布式緩存服務器集群等等。


在實際應用中,在?Web?服務器集群之前總會有一臺負載均衡服務器,負載均衡設備的任務就是作為?Web?服務器流量的入口,挑選最合適的一臺?Web?服務器,將客戶端的請求轉發給它處理,實現客戶端到真實服務端的透明轉發。

最近幾年很火的「云計算」以及分布式架構,本質上也是將后端服務器作為計算資源、存儲資源,由某臺管理服務器封裝成一個服務對外提供,客戶端不需要關心真正提供服務的是哪臺機器,在它看來,就好像它面對的是一臺擁有近乎無限能力的服務器,而本質上,真正提供服務的,是后端的集群。

LVS、Nginx、HAProxy?是目前使用最廣泛的三種軟件負載均衡軟件。

一般對負載均衡的使用是隨著網站規模的提升根據不同的階段來使用不同的技術。具體的應用需求還得具體分析,如果是中小型的?Web?應用,比如日?PV?小于1000萬,用?Nginx?就完全可以了;如果機器不少,可以用?DNS?輪詢,LVS?所耗費的機器還是比較多的;大型網站或重要的服務,且服務器比較多時,可以考慮用?LVS。

目前關于網站架構一般比較合理流行的架構方案:Web?前端采用?Nginx/HAProxy+Keepalived?作負載均衡器;后端采用?MySQ?L數據庫一主多從和讀寫分離,采用?LVS+Keepalived?的架構。

LVS

LVS?是?Linux?Virtual?Server?的簡稱,也就是?Linux?虛擬服務器。現在?LVS?已經是?Linux?標準內核的一部分,從?Linux2.4?內核以后,已經完全內置了?LVS?的各個功能模塊,無需給內核打任何補丁,可以直接使用?LVS?提供的各種功能。

LVS?自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。

LVS 的體系結構

LVS?架設的服務器集群系統有三個部分組成:

(1) 最前端的負載均衡層,用 Load Balancer 表示

(2) 中間的服務器集群層,用 Server Array 表示

(3) 最底端的數據共享存儲層,用 Shared Storage 表示

LVS 負載均衡機制

LVS?不像?HAProxy?等七層軟負載面向的是?HTTP?包,所以七層負載可以做的?URL?解析等工作,LVS?無法完成。

LVS?是四層負載均衡,也就是說建立在?OSI?模型的第四層——傳輸層之上,傳輸層上有我們熟悉的?TCP/UDP,LVS?支持?TCP/UDP?的負載均衡。因為?LVS?是四層負載均衡,因此它相對于其它高層負載均衡的解決辦法,比如?DNS?域名輪流解析、應用層負載的調度、客戶端的調度等,它的效率是非常高的。

所謂四層負載均衡?,也就是主要通過報文中的目標地址和端口。七層負載均衡?,也稱為“內容交換”,也就是主要通過報文中的真正有意義的應用層內容。

LVS?的轉發主要通過修改?IP?地址(NAT?模式,分為源地址修改?SNAT?和目標地址修改?DNAT)、修改目標?MAC(DR?模式)來實現。

NAT?模式:網絡地址轉換

NAT(Network?Address?Translation)是一種外網和內網地址映射的技術。

NAT?模式下,網絡數據報的進出都要經過?LVS?的處理。LVS?需要作為?RS(真實服務器)的網關。

當包到達?LVS?時,LVS?做目標地址轉換(DNAT),將目標?IP?改為?RS?的?IP。RS?接收到包以后,仿佛是客戶端直接發給它的一樣。RS?處理完,返回響應時,源?IP?是?RS?IP,目標?IP?是客戶端的?IP。這時?RS?的包通過網關(LVS)中轉,LVS?會做源地址轉換(SNAT),將包的源地址改為?VIP,這樣,這個包對客戶端看起來就仿佛是?LVS?直接返回給它的。

DR?模式:直接路由

DR?模式下需要?LVS?和?RS?集群綁定同一個?VIP(RS?通過將?VIP?綁定在?loopback?實現),但與?NAT?的不同點在于:請求由?LVS?接受,由真實提供服務的服務器(RealServer,RS)直接返回給用戶,返回的時候不經過?LVS。

詳細來看,一個請求過來時,LVS?只需要將網絡幀的?MAC?地址修改為某一臺?RS?的?MAC,該包就會被轉發到相應的?RS?處理,注意此時的源?IP?和目標?IP?都沒變,LVS?只是做了一下移花接木。RS?收到?LVS?轉發來的包時,鏈路層發現?MAC?是自己的,到上面的網絡層,發現?IP?也是自己的,于是這個包被合法地接受,RS?感知不到前面有?LVS?的存在。而當?RS?返回響應時,只要直接向源?IP(即用戶的?IP)返回即可,不再經過?LVS。

DR?負載均衡模式數據分發過程中不修改?IP?地址,只修改?mac?地址,由于實際處理請求的真實物理?IP?地址和數據請求目的?IP?地址一致,所以不需要通過負載均衡服務器進行地址轉換,可將響應數據包直接返回給用戶瀏覽器,避免負載均衡服務器網卡帶寬成為瓶頸。因此,DR?模式具有較好的性能,也是目前大型網站使用最廣泛的一種負載均衡手段。

LVS 的優點

1、抗負載能力強、是工作在傳輸層上僅作分發之用,沒有流量的產生,這個特點也決定了它在負載均衡軟件里的性能最強的,對內存和?cpu?資源消耗比較低。

2、配置性比較低,這是一個缺點也是一個優點,因為沒有可太多配置的東西,所以并不需要太多接觸,大大減少了人為出錯的幾率。

3、工作穩定,因為其本身抗負載能力很強,自身有完整的雙機熱備方案,如?LVS?+?Keepalived。

4、無流量,LVS?只分發請求,而流量并不從它本身出去,這點保證了均衡器?IO?的性能不會受到大流量的影響。

5、應用范圍比較廣,因為?LVS?工作在傳輸層,所以它幾乎可以對所有應用做負載均衡,包括?http、數據庫、在線聊天室等等。

LVS 的缺點

1、軟件本身不支持正則表達式處理,不能做動靜分離;而現在許多網站在這方面都有較強的需求,這個是?Nginx、HAProxy?+?Keepalived?的優勢所在。

2、如果是網站應用比較龐大的話,LVS/DR?+?Keepalived?實施起來就比較復雜了,相對而言,Nginx?/?HAProxy?+?Keepalived?就簡單多了。

Nginx

Nginx?是一個強大的?Web?服務器軟件,用于處理高并發的?HTTP?請求和作為反向代理服務器做負載均衡。具有高性能、輕量級、內存消耗少,強大的負載均衡能力等優勢。

Nignx 的架構設計

相對于傳統基于進程或線程的模型(Apache就采用這種模型)在處理并發連接時會為每一個連接建立一個單獨的進程或線程,且在網絡或者輸入/輸出操作時阻塞。這將導致內存和?CPU?的大量消耗,因為新起一個單獨的進程或線程需要準備新的運行時環境,包括堆和棧內存的分配,以及新的執行上下文,當然,這些也會導致多余的?CPU?開銷。最終,會由于過多的上下文切換而導致服務器性能變差。

反過來,Nginx?的架構設計是采用模塊化的、基于事件驅動、異步、單線程且非阻塞。

Nginx?大量使用多路復用和事件通知,Nginx?啟動以后,會在系統中以?daemon?的方式在后臺運行,其中包括一個?master?進程,n(n>=1)?個?worker?進程。所有的進程都是單線程(即只有一個主線程)的,且進程間通信主要使用共享內存的方式。

其中,master?進程用于接收來自外界的信號,并給?worker?進程發送信號,同時監控?worker?進程的工作狀態。worker?進程則是外部請求真正的處理者,每個?worker?請求相互獨立且平等的競爭來自客戶端的請求。請求只能在一個?worker?進程中被處理,且一個?worker?進程只有一個主線程,所以同時只能處理一個請求。(原理同?Netty?很像)

Nginx 負載均衡

Nginx?負載均衡主要是對七層網絡通信模型中的第七層應用層上的?http、https?進行支持。

Nginx?是以反向代理的方式進行負載均衡的。反向代理(Reverse?Proxy)方式是指以代理服務器來接受?Internet?上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給?Internet?上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。

Nginx?實現負載均衡的分配策略有很多,Nginx?的?upstream?目前支持以下幾種方式:

1、輪詢(默認):每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器?down?掉,能自動剔除。

2、weight:指定輪詢幾率,weight?和訪問比率成正比,用于后端服務器性能不均的情況。

3、ip_hash:每個請求按訪問?ip?的?hash?結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決?session?的問題。

4、fair(第三方):按后端服務器的響應時間來分配請求,響應時間短的優先分配。

5、url_hash(第三方):按訪問?url?的?hash?結果來分配請求,使每個?url?定向到同一個后端服務器,后端服務器為緩存時比較有效。

Nginx 的優點

1、跨平臺:Nginx?可以在大多數?Unix?like?OS編譯運行,而且也有?Windows?的移植版本

2、配置異常簡單:非常容易上手。配置風格跟程序開發一樣,神一般的配置

3、非阻塞、高并發連接:官方測試能夠支撐5萬并發連接,在實際生產環境中跑到2~3萬并發連接數

4、事件驅動:通信機制采用?epoll?模型,支持更大的并發連接

5、Master/Worker?結構:一個?master?進程,生成一個或多個?worker?進程

6、內存消耗小:處理大并發的請求內存消耗非常小。在3萬并發連接下,開啟的10個?Nginx?進程才消耗150M?內存(15M*10=150M)

7、內置的健康檢查功能:如果?Nginx?代理的后端的某臺?Web?服務器宕機了,不會影響前端訪問

8、節省帶寬:支持?GZIP?壓縮,可以添加瀏覽器本地緩存的?Header?頭

9、穩定性高:用于反向代理,宕機的概率微乎其微

Nginx 的缺點

1、Nginx 僅能支 持http、https 和 Email 協議,這樣就在適用范圍上面小些,這個是它的缺點

2、對后端服務器的健康檢查,只支持通過端口來檢測,不支持通過?ur?l來檢測。不支持?Session?的直接保持,但能通過?ip_hash?來解決

HAProxy

HAProxy?支持兩種代理模式?TCP(四層)和HTTP(七層),也是支持虛擬主機的。

HAProxy?的優點能夠補充?Nginx?的一些缺點,比如支持?Session?的保持,Cookie?的引導;同時支持通過獲取指定的?url?來檢測后端服務器的狀態。

HAProxy?跟?LVS?類似,本身就只是一款負載均衡軟件;單純從效率上來講?HAProxy?會比?Nginx?有更出色的負載均衡速度,在并發處理上也是優于?Nginx?的。

HAProxy?支持?TCP?協議的負載均衡轉發,可以對?MySQL?讀進行負載均衡,對后端的?MySQL?節點進行檢測和負載均衡,大家可以用?LVS+Keepalived?對?MySQL?主從做負載均衡。

HAProxy?負載均衡策略非常多:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、RI(請求URL)、rdp-cookie(根據cookie)。

Reference:

鐘武

https://zhongwuzw.github.io

王晨純

http://www.importnew.com/11229.html

周旭龍

http://edisonchou.cnblogs.com

注:本文轉載于linkedkeeper.com

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容