LVS與Nginx結(jié)合的負(fù)載均衡方案
1 學(xué)習(xí)目標(biāo)
掌握什么是負(fù)載均衡及負(fù)載均衡的作用和意義。
了解lvs負(fù)載均衡的三種模式。
了解lvs-DR負(fù)載均衡部署方法。
掌握nginx實(shí)現(xiàn)負(fù)載均衡的方法。
掌握l(shuí)vs+nginx負(fù)載均衡拓?fù)浣Y(jié)構(gòu)。
2 負(fù)載均衡方案
2.1 什么是負(fù)載均衡
一臺(tái)普通服務(wù)器的處理能力是有限的,假如能達(dá)到每秒幾萬(wàn)個(gè)到幾十萬(wàn)個(gè)請(qǐng)求,但卻無(wú)法在一秒鐘內(nèi)處理上百萬(wàn)個(gè)甚至更多的請(qǐng)求。但若能將多臺(tái)這樣的服務(wù)器組成一個(gè)系統(tǒng),并通過(guò)軟件技術(shù)將所有請(qǐng)求平均分配給所有服務(wù)器,那么這個(gè)系統(tǒng)就完全擁有每秒鐘處理幾百萬(wàn)個(gè)甚至更多請(qǐng)求的能力。這就是負(fù)載均衡最初的基本設(shè)計(jì)思想。
負(fù)載均衡是由多臺(tái)服務(wù)器以對(duì)稱的方式組成一個(gè)服務(wù)器集合,每臺(tái)服務(wù)器都具有等價(jià)的地位,都可以單獨(dú)對(duì)外提供服務(wù)而無(wú)須其他服務(wù)器的輔助。通過(guò)某種負(fù)載分擔(dān)技術(shù),將外部發(fā)送來(lái)的請(qǐng)求按照某種策略分配到服務(wù)器集合的某一臺(tái)服務(wù)器上,而接收到請(qǐng)求的服務(wù)器獨(dú)立地回應(yīng)客戶的請(qǐng)求。負(fù)載均衡解決了大量并發(fā)訪問(wèn)服務(wù)問(wèn)題,其目的就是用最少的投資獲得接近于大型主機(jī)的性能。
2.2 相關(guān)技術(shù)
2.2.1 基于DNS的負(fù)載均衡
DNS(Domain Name System,域名系統(tǒng)),因特網(wǎng)上作為域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使用戶更方便的訪問(wèn)互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串。通過(guò)主機(jī)名,最終得到該主機(jī)名對(duì)應(yīng)的IP地址的過(guò)程叫做域名解析(或主機(jī)名解析)。DNS協(xié)議運(yùn)行在UDP協(xié)議之上,使用端口號(hào)53。
DNS負(fù)載均衡技術(shù)是最早的負(fù)載均衡解決方案,它是通過(guò)DNS服務(wù)中的隨機(jī)名字解析來(lái)實(shí)現(xiàn)的,在DNS服務(wù)器中,可以為多個(gè)不同的地址配置同一個(gè)名字,而最終查詢這個(gè)名字的客戶機(jī)將在解析這個(gè)名字時(shí)得到其中的一個(gè)地址。因此,對(duì)于同一個(gè)名字,不同的客戶機(jī)會(huì)得到不同的地址,它們也就訪問(wèn)不同地址上的Web服務(wù)器,從而達(dá)到負(fù)載均衡的目的。
如下圖:
優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單、實(shí)施容易、成本低、適用于大多數(shù)TCP/IP應(yīng)用;
缺點(diǎn):
1、 負(fù)載分配不均勻,DNS服務(wù)器將Http請(qǐng)求平均地分配到后臺(tái)的Web服務(wù)器上,而不考慮每個(gè)Web服務(wù)器當(dāng)前的負(fù)載情況;如果后臺(tái)的Web服務(wù)器的配置和處理能力不同,最慢的Web服務(wù)器將成為系統(tǒng)的瓶頸,處理能力強(qiáng)的服務(wù)器不能充分發(fā)揮作用;
2、可靠性低,如果后臺(tái)的某臺(tái)Web服務(wù)器出現(xiàn)故障,DNS服務(wù)器仍然會(huì)把DNS請(qǐng)求分配到這臺(tái)故障服務(wù)器上,導(dǎo)致不能響應(yīng)客戶端。
3、變更生效時(shí)間長(zhǎng),如果更改NDS有可能造成相當(dāng)一部分客戶不能享受Web服務(wù),并且由于DNS緩存的原因,所造成的后果要持續(xù)相當(dāng)長(zhǎng)一段時(shí)間(一般DNS的刷新周期約為24小時(shí))。
2.2.2 基于四層交換技術(shù)的負(fù)載均衡
基于四層交換技術(shù)的負(fù)載均衡是通過(guò)報(bào)文中的目標(biāo)地址和端口,再加上負(fù)載均衡設(shè)備設(shè)置的服務(wù)器選擇方式,決定最終選擇的內(nèi)部服務(wù)器與請(qǐng)求客戶端建立TCP連接,然后發(fā)送Client請(qǐng)求的數(shù)據(jù)。
如下圖:
client發(fā)送請(qǐng)求至4層負(fù)載均衡器,4層負(fù)載均衡器根據(jù)負(fù)載策略把client發(fā)送的報(bào)文目標(biāo)地址(原來(lái)是負(fù)載均衡設(shè)備的IP地址)修改為后端服務(wù)器(可以是web服務(wù)器、郵件服務(wù)等)IP地址,這樣client就可以直接跟后端服務(wù)器建立TCP連接并發(fā)送數(shù)據(jù)。
具有代表意義的產(chǎn)品:LVS(開(kāi)源軟件),F(xiàn)5(硬件)
優(yōu)點(diǎn):性能高、支持各種網(wǎng)絡(luò)協(xié)議
缺點(diǎn):對(duì)網(wǎng)絡(luò)依賴較大,負(fù)載智能化方面沒(méi)有7層負(fù)載好(比如不支持對(duì)url個(gè)性化負(fù)載),F(xiàn)5硬件性能很高但成本也高需要人民幣幾十萬(wàn),對(duì)于小公司就望而卻步了。
2.2.3 基于七層交換技術(shù)的負(fù)載均衡
基于七層交換技術(shù)的負(fù)載均衡也稱內(nèi)容交換,也就是主要通過(guò)報(bào)文中的真正有意義的應(yīng)用層內(nèi)容,再加上負(fù)載均衡設(shè)備設(shè)置的服務(wù)器選擇方式,決定最終選擇的服務(wù)器。
如下圖:
七層負(fù)載均衡服務(wù)器起了一個(gè)代理服務(wù)器的作用,client要訪問(wèn)webserver要先與七層負(fù)載設(shè)備進(jìn)行三次握手后建立TCP連接,把要訪問(wèn)的報(bào)文信息發(fā)送給七層負(fù)載均衡;然后七層負(fù)載均衡再根據(jù)設(shè)置的均衡規(guī)則選擇特定的webserver,然后通過(guò)三次握手與此臺(tái)webserver建立TCP連接,然后webserver把需要的數(shù)據(jù)發(fā)送給七層負(fù)載均衡設(shè)備,負(fù)載均衡設(shè)備再把數(shù)據(jù)發(fā)送給client。
具有代表意義的產(chǎn)品:nginx(軟件)、apache(軟件)
優(yōu)點(diǎn):對(duì)網(wǎng)絡(luò)依賴少,負(fù)載智能方案多(比如可根據(jù)不同的url進(jìn)行負(fù)載)
缺點(diǎn):網(wǎng)絡(luò)協(xié)議有限,nginx和apache支持http負(fù)載,性能沒(méi)有4層負(fù)載高
2.3 確定使用四層+七層負(fù)載結(jié)合方案
四層負(fù)載使用lvs軟件或F5硬件實(shí)現(xiàn)。
七層負(fù)載使用nginx實(shí)現(xiàn)。
如下圖是lvs+nginx的拓?fù)浣Y(jié)構(gòu):
2.4 nginx集群背景
在keepalived+nginx的主備容災(zāi)高可用的架構(gòu)中,nginx是作為外部訪問(wèn)系統(tǒng)的唯一入口,理論上一臺(tái)nginx的最大并發(fā)量可以高達(dá)50000,但是當(dāng)并發(fā)量更大的時(shí)候,keepalived+nginx的高可用機(jī)制是沒(méi)辦法滿足需求的,因?yàn)閗eepalived+nginx的架構(gòu)中確確實(shí)實(shí)是一臺(tái)nginx在工作,只有當(dāng)master宕機(jī)或異常時(shí)候,備份機(jī)才會(huì)上位。那么如何解決更大的高并發(fā)問(wèn)題呢,也許會(huì)問(wèn)能不能搭建nginx集群,直接對(duì)外提供訪問(wèn)?
很顯然這是欠妥當(dāng)?shù)模驗(yàn)楫?dāng)nginx作為外部的唯一訪問(wèn)入口,沒(méi)辦法直接以集群的形式對(duì)外提供服務(wù),沒(méi)有那么多的公網(wǎng)ip資源可用,既太浪費(fèi)也不友好。但是在內(nèi)網(wǎng)環(huán)境下,是可以用nginx集群(nginx橫向擴(kuò)展服務(wù)集合)的,當(dāng)然總得有一個(gè)對(duì)外入口,所以需要在nginx集群之上,在加一層負(fù)載均衡器,作為系統(tǒng)的唯一入口。
3 lvs實(shí)現(xiàn)四層負(fù)載DR模式(了解)
3.1 什么是lvs
LVS是Linux Virtual Server的簡(jiǎn)寫,意即Linux虛擬服務(wù)器,是一個(gè)虛擬的服務(wù)器集群系統(tǒng)。本項(xiàng)目在1998年5月由章文嵩博士成立,是中國(guó)國(guó)內(nèi)最早出現(xiàn)的自由軟件項(xiàng)目之一。
3.2 lvs實(shí)現(xiàn)負(fù)載的三種方式
運(yùn)行 lPVS軟件的服務(wù)器,在整個(gè)負(fù)載均衡集群中承擔(dān)一調(diào)度角色 軟件的服務(wù)器,(即 向真實(shí)服務(wù)器分配從客戶端過(guò)來(lái)的請(qǐng)求。LVS中的調(diào)度方法有三種 :NAT(Network Address Translation網(wǎng)絡(luò)地址轉(zhuǎn)換)、TUN(tunnel 隧道)、DR(direct route 直接路由)
3.2.1 LVS-DR 模式
請(qǐng)求由LVS接受,由真實(shí)提供服務(wù)的服務(wù)器(RealServer, RS)直接返回給用戶,返回的時(shí)候不經(jīng)過(guò)LVS。
DR模式下需要LVS服務(wù)器和RS綁定同一個(gè)VIP, 一個(gè)請(qǐng)求過(guò)來(lái)時(shí),LVS只需要將網(wǎng)絡(luò)幀的MAC地址修改為某一臺(tái)RS的MAC,該包就會(huì)被轉(zhuǎn)發(fā)到相應(yīng)的RS處理,注意此時(shí)的源IP和目標(biāo)IP都沒(méi)變,RS收到LVS轉(zhuǎn)發(fā)來(lái)的包,發(fā)現(xiàn)MAC是自己的,發(fā)現(xiàn)IP也是自己的,于是這個(gè)包被合法地接受,而當(dāng)RS返回響應(yīng)時(shí),只要直接向源IP(即用戶的IP)返回即可,不再經(jīng)過(guò)LVS。
DR模式下,lvs接收請(qǐng)求輸入,將請(qǐng)求轉(zhuǎn)發(fā)給RS,由RS輸出響應(yīng)給用戶,性能非常高。
它的不足之處是要求負(fù)載均衡器與RS在一個(gè)物理段上。
3.2.2 LVS-NAT模式
NAT(Network Address Translation)是一種外網(wǎng)和內(nèi)網(wǎng)地址映射的技術(shù)。NAT模式下,LVS需要作為RS的網(wǎng)關(guān),當(dāng)網(wǎng)絡(luò)包到達(dá)LVS時(shí),LVS做目標(biāo)地址轉(zhuǎn)換(DNAT),將目標(biāo)IP改為RS的IP。RS接收到包以后,處理完,返回響應(yīng)時(shí),源IP是RS IP,目標(biāo)IP是客戶端的IP,這時(shí)RS的包通過(guò)網(wǎng)關(guān)(LVS)中轉(zhuǎn),LVS會(huì)做源地址轉(zhuǎn)換(SNAT),將包的源地址改為VIP,對(duì)于客戶端只知道是LVS直接返回給它的。
NAT模式請(qǐng)求和響應(yīng)都需要經(jīng)過(guò)lvs,性能沒(méi)有DR模式好。
3.2.3 LVS-TUN模式
TUN模式是通過(guò)ip隧道技術(shù)減輕lvs調(diào)度服務(wù)器的壓力,許多Internet服務(wù)(例如WEB服務(wù)器)的請(qǐng)求包很短小,而應(yīng)答包通常很大,負(fù)載均衡器只負(fù)責(zé)將請(qǐng)求包分發(fā)給物理服務(wù)器,而物理服務(wù)器將應(yīng)答包直接發(fā)給用戶。所以,負(fù)載均衡器能處理很巨大的請(qǐng)求量。相比NAT性能要高的多,比DR模式的優(yōu)點(diǎn)是不限制負(fù)載均衡器與RS在一個(gè)物理段上。但是它的不足需要所有的服務(wù)器(lvs、RS)支持"IP Tunneling"(IP Encapsulation)協(xié)議。
3.3 lvs-DR環(huán)境
vip:192.168.101.100
lvs-director:192.168.101.8
nginx1:192.168.101.3
nginx2:192.168.101.4
3.4 lvs調(diào)度服務(wù)器Director安裝
3.4.1 安裝lvs
在192.168.101.8上安裝lvs
centos6.5自帶lvs,檢查linux內(nèi)核是否集成lvs模塊:
modprobe -l | grep ipvs
3.4.2 安裝lvs的管理工具ipvsadm
安裝依賴
yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*
安裝ipvsadm
將ipvsadm-1.26.tar.gz拷貝至/usr/local/下
cd /usr/localtar -zxvf ipvsadm-1.26.tar.gz cd ipvsadm-1.26makemake install
校驗(yàn)是否安裝成功:
3.5 真實(shí)服務(wù)器Real Server安裝
在192.168.101.3和192.168.101.4上安裝nginx。
3.5.1 nginx配置文件
創(chuàng)建nginx-lvs.conf,http內(nèi)容如下:
http { include mime.types; default_type application/octet-stream; sendfile on; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } }
3.6 Director Server配置
3.6.1 在eth0上綁定虛擬ip
ifconfig eth0:0 192.168.101.100 broadcast 192.168.101.100 netmask 255.255.255.255 up
此處在eth0設(shè)備上綁定了一個(gè)虛擬設(shè)備eth0:0,同時(shí)設(shè)置了一個(gè)虛擬IP是192.168.101.100,然后指定廣播地址也為192.168.101.100,需要特別注意的是,虛擬ip地址的廣播地址是它本身,子網(wǎng)掩碼是255.255.255.255。
3.6.2 添加路由規(guī)則
route add -host 192.168.101.100 dev eth0:0
3.6.3 啟用系統(tǒng)的包轉(zhuǎn)發(fā)功能
echo "1" >/proc/sys/net/ipv4/ip_forward
參數(shù)值為1時(shí)啟用ip轉(zhuǎn)發(fā),為0時(shí)禁止ip轉(zhuǎn)發(fā)。
3.6.4 清除原有轉(zhuǎn)發(fā)規(guī)則
ipvsadm --clear
3.6.5 添加虛擬IP規(guī)則
ipvsadm -A -t 192.168.101.100:80 -s rr
-s rr表示采用輪詢策略。
:80表示負(fù)載轉(zhuǎn)發(fā)的端口是80
3.6.6 在虛擬IP中添加服務(wù)規(guī)則
ipvsadm -a -t 192.168.101.100:80 -r 192.168.101.3:80 -g ipvsadm -a -t 192.168.101.100:80 -r 192.168.101.4:80 -g
在新加虛擬IP記錄中添加兩條新的Real Server記錄,-g表示指定LVS 的工作模式為直接路由模式。
lvs進(jìn)行負(fù)載轉(zhuǎn)發(fā)需要保證lvs負(fù)載的端口要和nginx服務(wù)的端口的一致,這里都為80。
3.6.7 重啟lvs
ipvsadm
3.7 Real Server配置
在lvs的DR和TUn模式下,用戶的訪問(wèn)請(qǐng)求到達(dá)真實(shí)服務(wù)器后,是直接返回給用戶的,而不再經(jīng)過(guò)前端的Director Server,因此,就需要在每個(gè)Real server節(jié)點(diǎn)上增加虛擬的VIP地址,這樣數(shù)據(jù)才能直接返回給用戶。
3.7.1 在回環(huán)設(shè)備上綁定了一個(gè)虛擬IP地址
ifconfig lo:0 192.168.101.100 broadcast 192.168.101.100 netmask 255.255.255.255 up/sbin/route add -host 192.168.101.100 dev lo:0
3.7.2 關(guān)閉arp解析
arp_announce :定義不同級(jí)別:當(dāng)ARP請(qǐng)求通過(guò)某個(gè)端口進(jìn)來(lái)是否利用這個(gè)接口來(lái)回應(yīng)。
0 -利用本地的任何地址,不管配置在哪個(gè)接口上去響應(yīng)ARP請(qǐng)求;
1 - 避免使用另外一個(gè)接口上的mac地址去響應(yīng)ARP請(qǐng)求;
2 - 盡可能使用能夠匹配到ARP請(qǐng)求的最佳地址。
arp_ignore:當(dāng)ARP請(qǐng)求發(fā)過(guò)來(lái)后發(fā)現(xiàn)自己正是請(qǐng)求的地址是否響應(yīng);
0 - 利用本地的任何地址,不管配置在哪個(gè)接口上去響應(yīng)ARP請(qǐng)求;
1 - 哪個(gè)接口上接受ARP請(qǐng)求,就從哪個(gè)端口上回應(yīng)。
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p #使用修改生效
sysctl -p #使用修改生效
3.8 測(cè)試
3.8.1 預(yù)期目標(biāo)
由于lvs設(shè)置為rr輪詢策略,當(dāng)訪問(wèn)虛IP http://192.168.101.100,每次刷新請(qǐng)求通過(guò)lvs負(fù)載到不同的服務(wù)器。
3.8.2 注意事項(xiàng)
1、測(cè)試時(shí)需要在nginx的http中設(shè)置keepalive_timeout 0; 取消使用http持久連接模式,保證每次客戶端發(fā)起請(qǐng)求都需要向服務(wù)端建立連接,這樣做是為了每次刷新頁(yè)面都要經(jīng)過(guò)lvs負(fù)載轉(zhuǎn)發(fā)。
2、lvs進(jìn)行負(fù)載轉(zhuǎn)發(fā)需要保證lvs負(fù)載的端口要和nginx服務(wù)的端口的一致,這里都為80。
keepalive_timeout說(shuō)明:
在nginx中keepalive_timeout的默認(rèn)值是75秒,默認(rèn)使用http持久連接模式,可使客戶端到服務(wù)器端的連接持續(xù)有效,當(dāng)出現(xiàn)對(duì)服務(wù)器的后繼請(qǐng)求時(shí),可避免建立或重新建立連接。生產(chǎn)環(huán)境建議keepalive_timeout不要設(shè)置為0。
3.8.3 測(cè)試過(guò)程
修改192.168.101.3和192.168.101.4下html目錄中index.html的內(nèi)容使之個(gè)性化。
第一次請(qǐng)求:http://192.168.101.100
刷新,相當(dāng)于第二次請(qǐng)求:
依次交替測(cè)試,發(fā)現(xiàn)每次請(qǐng)求被負(fù)載到不同的nginx上。
任意停止掉一個(gè)nginx,請(qǐng)求http://192.168.101.100繼續(xù)可以瀏覽,由于lvs采用輪詢策略如果其中一個(gè)nginx請(qǐng)求不可到達(dá)則去請(qǐng)求另外的nginx。
3.9 腳本封裝
為了方便配置啟動(dòng)lvs將上邊Director Server和Real Server的配置過(guò)程封裝在shell腳本中。
3.9.1 Director Server配置
在/etc/init.d下創(chuàng)建lvsdr,內(nèi)容如下:
#!/bin/sh# 定義虛擬ip VIP=192.168.101.100 #虛擬 ip根據(jù)需求修改 # 定義realserver,并已空格分開(kāi),根據(jù)需求修改 RIPS="192.168.101.3 192.168.101.4"# 定義提供服務(wù)的端口 SERVICE=80# 調(diào)用init.d腳本的標(biāo)準(zhǔn)庫(kù) . /etc/rc.d/init.d/functionscase $1 in start) echo "Start LVS of DR Mode" # 開(kāi)啟ip轉(zhuǎn)發(fā) echo "1" > /proc/sys/net/ipv4/ip_forward # 綁定虛擬ip ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up route add -host $VIP dev eth0:0 # 清除lvs規(guī)則 ipvsadm -C # 添加一條虛擬服務(wù)器記錄 # -p指定一定的時(shí)間內(nèi)將相同的客戶端分配到同一臺(tái)后端服務(wù)器 # 用于解決session的問(wèn)題,測(cè)試時(shí)或有別的解決方案時(shí)建議去掉 ipvsadm -A -t $VIP:$SERVICE -s rr # 添加真實(shí)服務(wù)器記錄 for RIP in $RIPS do echo $RIP:$SERVICE; ipvsadm -a -t $VIP:$SERVICE -r $RIP:$SERVICE -g done # 設(shè)置tcp tcpfin udp的超時(shí)連接值 ipvsadm --set 30 120 300 ipvsadm ;; stop) echo "Stop LVS DR" ifconfig eth0:0 down ipvsadm -C ;; *) echo "Usage:$0 {start | stop}" exit 1esac
修改腳本權(quán)限:chmod +x /etc/init.d/lvsdr
啟動(dòng)Director server:service lvsdr start
停止Director server:service lvsdr stop
3.9.2 Real Server配置
在/etc/init.d下創(chuàng)建lvsdr,內(nèi)容如下:
#!/bin/shVIP=192.168.101.100 #虛擬ip,根據(jù)需求修改 . /etc/rc.d/init.d/functionscase $1 in start) echo "lo:0 port starting" # 為了相應(yīng)lvs調(diào)度器轉(zhuǎn)發(fā)過(guò)來(lái)的包,需在本地lo接口上綁定vip ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up # 限制arp請(qǐng)求 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 ;; stop) echo "lo:0 port closing" ifconfig lo:0 down echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage: $0 {start | stop}" exit 1esac
修改腳本權(quán)限:chmod +x /etc/init.d/lvsdr
啟動(dòng)real server:service lvsdr start
停止real server:service lvsdr stop
4 nginx實(shí)現(xiàn)七層負(fù)載
參考nginx教案。
5 lvs四層+nginx七層負(fù)載均衡
5.1 需求
lvs采用DR模式基本上沒(méi)有性能瓶頸,用戶請(qǐng)求輸入至lvs經(jīng)過(guò)負(fù)載轉(zhuǎn)發(fā)到后臺(tái)服務(wù)上,通過(guò)后臺(tái)服務(wù)輸出響應(yīng)給用戶。nginx的負(fù)載性能遠(yuǎn)沒(méi)有l(wèi)vs好,lvs四層+nginx七層負(fù)載的好處是最前端是lvs接收請(qǐng)求進(jìn)行負(fù)載轉(zhuǎn)發(fā),由多個(gè)nginx共同完成七層負(fù)載,這樣nginx的負(fù)載性能就可以線性擴(kuò)展。
5.2 準(zhǔn)備環(huán)境
vip:192.168.101.100
lvs-director:192.168.101.8
nginx1:192.168.101.3 安裝nginx
nginx2:192.168.101.4 安裝nginx
tomcat1:192.168.101.5 安裝tomcat
tomcat2:192.168.101.6 安裝tomcat
5.3 配置
5.3.1 Director Server配置
vip:192.168.101.100
lvs-director:192.168.101.8
參考lvs四層負(fù)載DR模式進(jìn)行配置
5.3.2 Real Server配置
nginx1:192.168.101.3 安裝nginx
nginx2:192.168.101.4 安裝nginx
參考lvs四層負(fù)載DR模式進(jìn)行配置,需要修改nginx的配置文件使每個(gè)nginx對(duì)兩個(gè)tomcat進(jìn)行負(fù)載,如下:
http { include mime.types; default_type application/octet-stream; sendfile on; upstream tomcat_server_pool{ server 192.168.101.5:8080 weight=10; server 192.168.101.6:8080 weight=10; } server { listen 80; server_name localhost; location / { proxy_pass http://tomcat_server_pool; index index.jsp index.html index.htm; } } }
5.4 測(cè)試
請(qǐng)求http://192.168.101.100,lvs負(fù)載到不同的nginx上,如果停止任意一臺(tái)nginx或停止任意一臺(tái)tomcat不影響訪問(wèn)。
6 lvs高可用(了解)
6.1 什么是高可用
lvs作為負(fù)載均衡器,所有請(qǐng)求都先到達(dá)lvs,可見(jiàn)lvs處于非常重要的位置,如果lvs服務(wù)器宕機(jī)后端web服務(wù)將無(wú)法提供服務(wù),影響嚴(yán)重。
為了屏蔽負(fù)載均衡服務(wù)器的宕機(jī),需要建立一個(gè)備份機(jī)。主服務(wù)器和備份機(jī)上都運(yùn)行高可用(High Availability)監(jiān)控程序,通過(guò)傳送諸如“I am alive”這樣的信息來(lái)監(jiān)控對(duì)方的運(yùn)行狀況。當(dāng)備份機(jī)不能在一定的時(shí)間內(nèi)收到這樣的信息時(shí),它就接管主服務(wù)器的服務(wù)IP并繼續(xù)提供負(fù)載均衡服務(wù);當(dāng)備份管理器又從主管理器收到“I am alive”這樣的信息時(shí),它就釋放服務(wù)IP地址,這樣的主服務(wù)器就開(kāi)始再次提供負(fù)載均衡服務(wù)。
6.2 keepalived+lvs實(shí)現(xiàn)主備
6.2.1 什么是keepalived
keepalived是集群管理中保證集群高可用的一個(gè)服務(wù)軟件,用來(lái)防止單點(diǎn)故障。
Keepalived的作用是檢測(cè)web服務(wù)器的狀態(tài),如果有一臺(tái)web服務(wù)器死機(jī),或工作出現(xiàn)故障,Keepalived將檢測(cè)到,并將有故障的web服務(wù)器從系統(tǒng)中剔除,當(dāng)web服務(wù)器工作正常后Keepalived自動(dòng)將web服務(wù)器加入到服務(wù)器群中,這些工作全部自動(dòng)完成,不需要人工干涉,需要人工做的只是修復(fù)故障的web服務(wù)器。
6.2.2 keepalived工作原理
keepalived是以VRRP協(xié)議為實(shí)現(xiàn)基礎(chǔ)的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協(xié)議。
虛擬路由冗余協(xié)議,可以認(rèn)為是實(shí)現(xiàn)路由器高可用的協(xié)議,即將N臺(tái)提供相同功能的路由器組成一個(gè)路由器組,這個(gè)組里面有一個(gè)master和多個(gè)backup,master上面有一個(gè)對(duì)外提供服務(wù)的vip(該路由器所在局域網(wǎng)內(nèi)其他機(jī)器的默認(rèn)路由為該vip),master會(huì)發(fā)組播,當(dāng)backup收不到VRRP包時(shí)就認(rèn)為master宕掉了,這時(shí)就需要根據(jù)VRRP的優(yōu)先級(jí)來(lái)選舉一個(gè)backup當(dāng)master。這樣的話就可以保證路由器的高可用了。
keepalived主要有三個(gè)模塊,分別是core、check和VRRP。core模塊為keepalived的核心,負(fù)責(zé)主進(jìn)程的啟動(dòng)、維護(hù)以及全局配置文件的加載和解析。check負(fù)責(zé)健康檢查,包括常見(jiàn)的各種檢查方式。VRRP模塊是來(lái)實(shí)現(xiàn)VRRP協(xié)議的。
詳細(xì)參考:Keepalived權(quán)威指南中文.pdf
6.2.3 keepalived+lvs實(shí)現(xiàn)主備過(guò)程
6.2.3.1 初始狀態(tài)
6.2.3.2 主機(jī)宕機(jī)
6.2.3.3 主機(jī)恢復(fù)
6.2.4 準(zhǔn)備環(huán)境
vip:192.168.101.100
lvs-director:192.168.101.8 主lvs
lvs-director:192.168.101.9 備lvs
nginx1:192.168.101.3 安裝nginx
nginx2:192.168.101.4 安裝nginx
tomcat1:192.168.101.5 安裝tomcat
tomcat2:192.168.101.6 安裝tomcat
6.2.5 安裝keepalived
分別在主備lvs上安裝keepalived,參考“安裝手冊(cè)”進(jìn)行安裝:
6.2.6 配置keepalived
6.2.6.1 主lvs
修改主lvs下/etc/keepalived/keepalived.conf文件
! Configuration File for keepalived global_defs { notification_email { #xxxx@itcast.com # 發(fā)生故障時(shí)發(fā)送的郵箱 } #notification_email_from xxxx@itcast.com # 使用哪個(gè)郵箱發(fā)送 #smtp_server xxx.com # 發(fā)件服務(wù)器 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER # 標(biāo)示為主lvs interface eth0 # HA檢測(cè)端口 virtual_router_id 51 # 主備的virtual_router_id 必須相同 priority 100 # 優(yōu)先級(jí),備lvs要比主lvs稍小 advert_int 1 # VRRP Multicast 廣播周期秒數(shù) authentication { # 定義認(rèn)證 auth_type PASS # 認(rèn)證方式為口令認(rèn)證 auth_pass 1111 # 定義口令 } virtual_ipaddress { # 定義vip 192.168.101.100 # 多個(gè)vip可換行添加 } } virtual_server 192.168.101.100 80 { delay_loop 6 # 每隔6秒查看realserver狀態(tài) lb_algo wlc # 調(diào)度算法為加權(quán)最小連接數(shù) lb_kind DR # lvs工作模式為DR(直接路由)模式 nat_mask 255.255.255.0 persistence_timeout 50 # 同一IP 的連接50秒內(nèi)被分配到同一臺(tái)realserver(測(cè)試時(shí)建議改為0) protocol TCP # 用TCP監(jiān)測(cè)realserver的狀態(tài) real_server 192.168.101.3 80 { # 定義realserver weight 3 # 定義權(quán)重 TCP_CHECK { # 注意TCP_CHECK和{之間的空格,如果沒(méi)有的話只會(huì)添加第一個(gè)realserver connect_timeout 3 # 三秒無(wú)響應(yīng)超時(shí) nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.101.4 80 { weight 3 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
6.2.6.2 備lvs
修改備lvs下/etc/keepalived/keepalived.conf文件
配置備lvs時(shí)需要注意:需要修改state為BACKUP , priority比MASTER低,virtual_router_id和master的值一致
! Configuration File for keepalived global_defs { notification_email { #xxxx@itcast.com # 發(fā)生故障時(shí)發(fā)送的郵箱 } #notification_email_from xxxx@itcast.com # 使用哪個(gè)郵箱發(fā)送 #smtp_server xxx.com # 發(fā)件服務(wù)器 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP # 標(biāo)示為備lvs interface eth0 # HA檢測(cè)端口 virtual_router_id 51 # 主備的virtual_router_id 必須相同 priority 99 # 優(yōu)先級(jí),備lvs要比主lvs稍小 advert_int 1 # VRRP Multicast 廣播周期秒數(shù) authentication { # 定義認(rèn)證 auth_type PASS # 認(rèn)證方式為口令認(rèn)證 auth_pass 1111 # 定義口令 } virtual_ipaddress { # 定義vip 192.168.101.100 # 多個(gè)vip可換行添加 } } virtual_server 192.168.101.100 80 { delay_loop 6 # 每隔6秒查看realserver狀態(tài) lb_algo wlc # 調(diào)度算法為加權(quán)最小連接數(shù) lb_kind DR # lvs工作模式為DR(直接路由)模式 nat_mask 255.255.255.0 persistence_timeout 50 # 同一IP 的連接50秒內(nèi)被分配到同一臺(tái)realserver(測(cè)試時(shí)建議改為0) protocol TCP # 用TCP監(jiān)測(cè)realserver的狀態(tài) real_server 192.168.101.3 80 { # 定義realserver weight 3 # 定義權(quán)重 TCP_CHECK { # 注意TCP_CHECK和{之間的空格,如果沒(méi)有的話只會(huì)添加第一個(gè)realserver connect_timeout 3 # 三秒無(wú)響應(yīng)超時(shí) nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.101.4 80 { weight 3 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
6.2.7 測(cè)試
6.2.7.1 啟動(dòng)
director Server啟動(dòng):
注意:使用keepalived就不用手動(dòng)配置啟動(dòng)lvs,在主、備lvs上啟動(dòng)keepalived即可。
主備lvs(192.168.101.8、192.168.101.9)都啟動(dòng)keepalived。
service keepalived start
real server啟動(dòng):
192.168.101.3、192.168.101.4啟動(dòng)nginx和lvs的realserver配置
cd /usr/local/nginx/sbin./nginx -c /usr/local/nginx/conf/nginx-lvs.conf
啟動(dòng)lvs的realserver配置:
service lvsdr start
注意:real server的lvs配置需要使用lvsdr腳本。
tomcat 啟動(dòng)
略
6.2.7.2 初始狀態(tài)
查看主lvs的eth0設(shè)置:
vip綁定在主lvs的eth0上。
查詢lvs狀態(tài):
查看備lvs的eth0設(shè)置:
vip沒(méi)有綁定在備lvs的eth0上。
訪問(wèn)http://192.168.101.100,可以正常負(fù)載。
6.2.7.3 主機(jī)宕機(jī)
將主lvs的keepalived停止或?qū)⒅鱨vs關(guān)機(jī)(相當(dāng)于模擬宕機(jī)),查看主lvs的eth0:
eth0沒(méi)有綁定vip
查看備lvs的eth0:
vip已經(jīng)漂移到備lvs。
訪問(wèn)http://192.168.101.100,可以正常負(fù)載。
6.2.7.4 主機(jī)恢復(fù)
將主lvs的keepalived啟動(dòng)。
查看主lvs的eth0:
查看備lvs的eth0:
vip漂移到主lvs。
查看備lvs的eth0:
eth0沒(méi)有綁定vip
訪問(wèn)http://192.168.101.100,可以正常負(fù)載。
6.3 keepalived+lvs實(shí)現(xiàn)雙主
上邊主備方案是當(dāng)前只有一臺(tái)lvs工作,這造成資源浪費(fèi),可以采用雙主結(jié)構(gòu),讓兩臺(tái)lvs當(dāng)前都進(jìn)行工作,采用dns輪詢方式,當(dāng)用戶訪問(wèn)域名通過(guò)dns輪詢每臺(tái)lvs,雙主結(jié)構(gòu)需要兩個(gè)vip,這兩個(gè)vip要綁定域名。
同樣,在每臺(tái)lvs上安裝keepalived軟件,當(dāng)keepalived檢測(cè)到其中一個(gè)lvs宕機(jī)則將宕機(jī)的vip漂移到活動(dòng)lvs上,當(dāng)lvs恢復(fù)則vip又重新漂移回來(lái)。
6.3.1.1 初始狀態(tài)
每臺(tái)lvs綁定一個(gè)vip,共兩個(gè)vip,DNS設(shè)置域名對(duì)應(yīng)這兩個(gè)vip,通過(guò)DNS輪詢每次解析到不同的vip上即解析到不同的lvs上。
6.3.1.2 其中一個(gè)主機(jī)宕機(jī)
其中一個(gè)主機(jī)宕機(jī),每臺(tái)lvs上安裝的keepalived程序會(huì)檢測(cè)到對(duì)方宕機(jī),將宕機(jī)一方的vip漂移至活動(dòng)的lvs服務(wù)器上,這樣DNS輪詢?nèi)康揭慌_(tái)lvs繼續(xù)對(duì)外提供服務(wù)。
6.3.1.3 主機(jī)恢復(fù)
當(dāng)主機(jī)恢復(fù)又回到初始狀態(tài),每個(gè)vip綁定在不同的lvs上。
6.4 lvs擴(kuò)展的思考
前端使用1到2臺(tái)lvs作為負(fù)載基本可以滿足中小型網(wǎng)站的并發(fā)要求,當(dāng)lvs的負(fù)載成為瓶頸此時(shí)就需要對(duì)lvs進(jìn)行優(yōu)化、擴(kuò)展。
方案1:LVS-ospf集群
OSPF(Open Shortest Path First開(kāi)放式最短路徑優(yōu)先)是一個(gè)內(nèi)部網(wǎng)關(guān)協(xié)議(Interior Gateway Protocol,簡(jiǎn)稱IGP),用于在單一自治系統(tǒng)(autonomous system,AS)內(nèi)決策路由。
LVS(DR)通過(guò)ospfd,做lvs集群,實(shí)現(xiàn)一個(gè)VIP,多臺(tái)LVS同時(shí)工作提供服務(wù),這種方案需要依賴三層交換機(jī)設(shè)備實(shí)現(xiàn)。
用戶請(qǐng)求(VIP:42.xx.xx.100)到達(dá)三層交換機(jī)之后,通過(guò)對(duì)原地址、端口和目的地址、端口的hash,將鏈接分配到集群中的某一臺(tái)LVS上,LVS通過(guò)內(nèi)網(wǎng)(10.101.10.x)向后端轉(zhuǎn)發(fā)請(qǐng)求,后端再將數(shù)據(jù)返回給用戶。
LVS-ospf集群模式的最大優(yōu)勢(shì)就在于:
1.LVS調(diào)度機(jī)自由伸縮,橫向線性擴(kuò)展(最大8臺(tái),受限于三層設(shè)備允許的等價(jià)路由數(shù)目maximum load-balancing);
2.LVS機(jī)器同時(shí)工作,不存在備機(jī),提高利用率;
3.做到了真正的高可用,某臺(tái)LVS機(jī)器宕機(jī)后,不會(huì)影響服務(wù)
方案2:DNS輪詢
上面講的是一組雙主結(jié)構(gòu),可以采用多組雙主結(jié)構(gòu)達(dá)到橫向擴(kuò)展lvs的目的,此方案需要每臺(tái)lvs都綁定一個(gè)vip(公網(wǎng)ip),DNS設(shè)置域名輪詢多個(gè)vip,如下圖:
方案3:使用硬件負(fù)載均衡設(shè)置
如果資金允許可以購(gòu)買硬件設(shè)置來(lái)完成負(fù)載均衡,性能不錯(cuò)的有F5、Array等都可以滿足超高并發(fā)的要求。
掃描二維碼推送至手機(jī)訪問(wèn)。
版權(quán)聲明:本文由星星博客發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。