說明:以下內(nèi)容參考了撫琴煮酒的《構(gòu)建高可用Linux服務(wù)器》第六章內(nèi)容.
搭建負載均衡高可用環(huán)境相對簡單,,主要是要理解其中原理。此文描述了三種負載均衡器的優(yōu)缺點,,以便在實際的生產(chǎn)應(yīng)用中,,按需求取舍。
目前,,在線上環(huán)境中應(yīng)用較多的負載均衡器硬件有F5 BIG-IP,軟件有LVS,,Nginx及HAProxy,高可用軟件有Heartbeat,、Keepalived,成熟的架構(gòu)有LVS+Keepalived、Nginx+Keepalived,、HAProxy+keepalived及DRBD+Heartbeat.
三種負載均衡器的優(yōu)缺點說明如下:
LVS的優(yōu)點:
1,、抗負載能力強、工作在第4層僅作分發(fā)之用,,沒有流量的產(chǎn)生,,這個特點也決定了它在負載均衡軟件里的性能最強的;無流量,,同時保證了均衡器IO的性能不會受到大流量的影響;
2,、工作穩(wěn)定,,自身有完整的雙機熱備方案,,如LVS+Keepalived和LVS+Heartbeat;
3,、應(yīng)用范圍比較廣,,可以對所有應(yīng)用做負載均衡,;
4,、配置性比較低,這是一個缺點也是一個優(yōu)點,,因為沒有可太多配置的東西,,所以并不需要太多接觸,,大大減少了人為出錯的幾率,;
LVS的缺點:
1,、軟件本身不支持正則處理,不能做動靜分離,,這就凸顯了Nginx/HAProxy+Keepalived的優(yōu)勢。
2,、如果網(wǎng)站應(yīng)用比較龐大,,LVS/DR+Keepalived就比較復雜了,,特別是后面有Windows Server應(yīng)用的機器,實施及配置還有維護過程就比較麻煩,,相對而言,,Nginx/HAProxy+Keepalived就簡單多了,。
#############################################################
1. LVS/DR如何處理請求報文的,會修改IP包內(nèi)容嗎,?
1.1 vs/dr本身不會關(guān)心IP層以上的信息,即使是端口號也是tcp/ip協(xié)議棧去判斷是否正確,,vs/dr本身主要做這么幾個事:
1)接收client的請求,,根據(jù)你設(shè)定的負載均衡算法選取一臺realserver的ip;
2)以選取的這個ip對應(yīng)的mac地址作為目標mac,,然后重新將IP包封裝成幀轉(zhuǎn)發(fā)給這臺RS,;
3)在hash table中記錄連接信息。
vs/dr做的事情很少,,也很簡單,,所以它的效率很高,不比硬件負載均衡設(shè)備差多少,。
數(shù)據(jù)包,、數(shù)據(jù)幀的大致流向是這樣的:client --> VS --> RS --> client
1.2 前面已作了回答,vs/dr不會修改IP包的內(nèi)容.
2. RealServer為什么要在lo接口上配置VIP,?在出口網(wǎng)卡上配置VIP可以嗎,?
2.1 既然要讓RS能夠處理目標地址為vip的IP包,首先必須要讓RS能接收到這個包,。
在lo上配置vip能夠完成接收包并將結(jié)果返回client。
2.2 答案是不可以將VIP設(shè)置在出口網(wǎng)卡上,否則會響應(yīng)客戶端的arp request,造成client/gateway arp table紊亂,,以至于整個load balance都不能正常工作,。
3. RealServer為什么要抑制arp幀?
這個問題在上一問題中已經(jīng)作了說明,,這里結(jié)合實施命令進一步闡述,。我們在具體實施部署的時候都會作如下調(diào)整:
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
我相信很多人都不會弄懂它們的作用是什么,只知道一定得有,。我這里也不打算拿出來詳細討論,,只是作幾點說明,就當是補充吧,。
3.1
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
這兩條是可以不用的,,因為arp對邏輯接口沒有意義。
3.2 如果你的RS的外部網(wǎng)絡(luò)接口是eth0,,那么
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
其實真正要執(zhí)行的是:
echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce
所以我個人建議把上面兩條也加到你的腳本里去,,因為萬一系統(tǒng)里上面兩條默認的值不是0,那有可能是會出問題滴,。
4. LVS/DR load balancer(director)與RS為什么要在同一網(wǎng)段中,?
從第一個問題中大家應(yīng)該明白vs/dr是如何將請求轉(zhuǎn)發(fā)給RS的了吧,?它是在數(shù)據(jù)鏈路層來實現(xiàn)的,,所以director必須和RS在同一網(wǎng)段里面,。
5. 為什么director上lo接口除了VIP另外還要在eth0配一個ip(即DIP),?
5.1 如果是用了keepalived等工具做HA或者Load Balance,則在健康檢查時需要用到DIP,。
5.2 沒有健康檢查機制的HA或者Load Balance則沒有存在的實際意義。
6. LVS/DR ip_forward需要開啟嗎,?
不需要,。因為director跟realserver是同一個網(wǎng)段,無需開啟轉(zhuǎn)發(fā),。
7. director的vip的netmask一定要是255.255.255.255嗎,?
lvs/dr里,,director的vip的netmask 沒必要設(shè)置為255.255.255.255,,也不需要再去
route add -host $VIP dev eth0:0
director的vip本來就是要像正常的ip地址一樣對外通告的,不要搞得這么特殊.
8. LVS/DR如何進行tcp的三次握手?
Nginx的優(yōu)點:
1,、工作在OSI第7層,,可以針對http應(yīng)用做一些分流的策略。比如針對域名,、目錄結(jié)構(gòu),。它的正則比HAProxy更為強大和靈活;
2,、Nginx對網(wǎng)絡(luò)的依賴非常小,理論上能ping通就就能進行負載功能,,這個也是它的優(yōu)勢所在,;
3,、Nginx安裝和配置比較簡單,,測試起來比較方便;
4,、可以承擔高的負載壓力且穩(wěn)定,,一般能支撐超過幾萬次的并發(fā)量;
5,、Nginx可以通過端口檢測到服務(wù)器內(nèi)部的故障,,比如根據(jù)服務(wù)器處理網(wǎng)頁返回的狀態(tài)碼、超時等等,,并且會把返回錯誤的請求重新提交到另一個節(jié)點,;
6、Nginx不僅僅是一款優(yōu)秀的負載均衡器/反向代理軟件,,它同時也是功能強大的Web應(yīng)用服務(wù)器,。LNMP現(xiàn)在也是非常流行的web環(huán)境,大有和LAMP環(huán)境分庭抗禮之勢,,Nginx在處理靜態(tài)頁面,、特別是抗高并發(fā)方面相對apache有優(yōu)勢;
7,、Nginx現(xiàn)在作為Web反向加速緩存越來越成熟了,,速度比傳統(tǒng)的Squid服務(wù)器更快,有需求的朋友可以考慮用其作為反向代理加速器,;
Nginx的缺點:
1,、Nginx不支持url來檢測。
2,、Nginx僅能支持http和Email,,這個它的弱勢。
3,、Nginx的Session的保持,,Cookie的引導能力相對欠缺。
HAProxy的優(yōu)點:
1,、HAProxy是支持虛擬主機的,,可以工作在4、7層(支持多網(wǎng)段),;
2,、能夠補充Nginx的一些缺點比如Session的保持,Cookie的引導等工作,;
3,、支持url檢測后端的服務(wù)器;
4,、它跟LVS一樣,,本身僅僅就只是一款負載均衡軟件,;單純從效率上來講HAProxy更會比Nginx有更出色的負載均衡速度,在并發(fā)處理上也是優(yōu)于Nginx的,;
5,、HAProxy可以對Mysql讀進行負載均衡,對后端的MySQL節(jié)點進行檢測和負載均衡,,不過在后端的MySQL slaves數(shù)量超過10臺時性能不如LVS,;
6、HAProxy的算法較多,,達到8種,;