lvs+keepalived集群架構服務


一,LVS功能詳解

 

1.1 LVS(Linux Virtual Server)介紹

LVS是Linux Virtual Server 的簡寫(也叫做IPVS),意即Linux虛擬服務器,是一個虛擬的服務器集群系統,可以在UNIX/LINUX平台下實現負載均衡集群功能。

 

1.2 企業網站LVS集群架構圖

image_1ctflvluuq31mrre1d1bdn1449.png-727.2kB

 

1.3 IPVS軟件工作層次圖

image_1ctfm01hb7gm1tnev7n1hju9njm.png-24.3kB

從上圖我們看出,LVS負載均衡調度技術是在Linux內核中實現的,因此,被稱之為Linux虛擬服務器(Linux Virtual Server)。我們使用該軟件配置LVS時候,不能直接配置內核中的ipbs,而需要使用ipvs管理工具ipvsadm進行管理,或者通過Keepalived軟件直接管理ipvs。

 

1.4 LVS體系結構與工作原理簡單描述

  • LVS集群負載均衡器接受服務的所有入站客戶端計算機請求,並根據調度算法決定哪個集群節點應該處理回復請求。負載均衡器(簡稱LB)有時也被稱為LVS Director(簡稱Director)。

  • LVS虛擬服務器的體系結構如下圖所示,一組服務器通過高速的局域網或者地理分布的廣域網相互連接,在他們的前端有一個負載調度器(Load Balancer)。 負載調度器能無縫地將網絡請求調度到真實服務器上,從而使得服務器集群的結構對客戶是透明的,客戶訪問集群系統提供的網絡服務就像訪問一台高性能,高可用的服務器一樣。客戶程序不受服務器集群的影響不需要作任何修改。系統的伸縮性通過在服務集群中透明地加入和刪除一個節點來達到,通過檢測節點或服務進程故障和正確地重置系統達到高可用性。由於我們的負載調度技術是在Linux內核中實現的,我們稱之為Linux虛擬服務器(Linux Virtual Server)。

 

1.5 LVS 基本工作過程圖

LVS基本工作過程如下圖所示:

image_1ctfm1pg5f6i194t4v1qsr1p9i2m.png-315.1kB

為了方便大家探討LVS技術,LVS社區提供了一個命名的約定,內容如下表:

image_1ctfm2ji9pup203nusmlsvp63j.png-33.5kB

LVS集群內部的節點稱為真實服務器(Real Server),也叫做集群節點。請求集群服務的計算機稱為客戶端計算機。 
與計算機通常在網上交換數據包的方式相同,客戶端計算機,Director和真實服務器使用IP地址彼此進行通信。

不同架構角色命名情況如下圖:

image_1ctfm33sn1d75110vs8l1fuc15pi40.png-342.1kB

 

1.6 LVS集群的3種常見工作模式介紹與原理講解

IP虛擬服務器軟件IPVS

  • 在調度器的實現技術中,IP負載均衡技術是效率最高的。在已有的IP負載均衡技術中有通過網絡地址轉換(Network Address Translation)將一組服務器構成一個高性能的,高可用的虛擬服務器,我們稱之為VS/NAT技術(Virtual Server via Network Address Translation),大多數商業化的IP負載均衡調度器產品都是使用NAT的方法,如Cisco的額LocalDirector,F5,Netscaler的Big/IP和Alteon的ACEDirector。

  • 在分析VS/NAT 的缺點和網絡服務的非對稱性的基礎上,我們提出通過IP隧道實現虛擬服務器的方法VS/TUN(Virtual Server via IP Tunneling)和通過直接路由實現虛擬服務器的方法VS/DR(Virtual Server via Direct Routing),他們可以極大地提高系統的伸縮性。所以,IPVS軟件實現了這三種IP負載均衡技術。淘寶開源的模式FULLNAT.

LVS的四種工作模式

  1. NAT(Network Address Translation)
  2. TUN(Tunneling)
  3. DR(Direct Routing)
  4. FULLNAT(Full Network Address Translation)
 

1.6.1 NAT模式-網絡地址轉換<==收費站模式(了解即可)

Virtual Server via Network Address Translation(VS/NAT)

調度時:目的IP改成RIP(DNAT) 
返回時:源IP改成VIP(SNAT)

image_1cvac3prqq2t1a3o15lj9th17c39.png-338.6kB


image_1cvac4lf2q201cnfmav1m3pu82m.png-313kB

NAT模式特點小結:

  1. NAT技術將請求的報文(DNAT)和響應的報文(SNAT),通過調度器地址重寫然后在轉發發給內部的服務器,報文返回時在改寫成原來的用戶請求的地址。
  2. 只需要在調度器LB上配置WAN公網IP即可,調度器也要有私有LAN IP和內部RS節點通信。
  3. 每台內部RS節點的網關地址,必須要配成調度器LB的私有LAN內物理網卡地址(LDIP),這樣才能確保數據報文返回時仍然經過調度器LB。
  4. 由於請求與響應的數據報文都經過調度器LB,因此,網站訪問量大時調度器LB有較大瓶頸,一般要求最多10-20台節點。
  5. NAT模式支持對IP及端口的轉換,即用戶請求10.0.0.1:80,可以通過調度器轉換到RS節點的10.0.0.2:8080(DR和TUN模式不具備的)
  6. 所有NAT內部RS節點只需要配置私有LAN IP即可。
  7. 由於數據包來回都需要經過調度器,因此,要開啟內核轉發net.ipv4.ip_forward=1,當然也包括iptables防火牆的forward功能(DR和TUN模式不需要)。
 

1.6.2 TUN模式-(了解即可)

image_1cvac5jod19brdkvpi7qs81ho013.png-347.4kB

增加一個IP頭部。通過IP隧道進行通信(可以跨網段找到RS節點) 
TUN模式特點小結:

  1. 負載均衡器通過把請求的報文通過IP隧道的方式轉發至真實服務器,而真實服務器將響應處理后直接返回給客戶端用戶。
  2. 由於真實服務器將響應處理后的報文直接返回給客戶端用戶,因此,最好RS有一個外網IP地址,這樣效率才會更高。理論上:只要能出網即可,無需外網IP地址。
  3. 由於調度器LB只處理入站請求的報文。因此,此集群系統的吞吐量可以提高10倍以上,但隧道模式也會帶來一定得系統開銷。TUN模式適合LAN/WAN。
  4. TUN模式的LAN環境轉發不如DR模式效率高,而且還要考慮系統對IP隧道的支持問題。
  5. 所有的RS服務器都要綁定VIP,抑制ARP,配置復雜。
  6. LAN環境一般多采用DR模式,WAN環境可以用TUN模式,但是當前在WAN環境下,請求轉發更多的被haproxy/nginx/DNS調度等代理取代。因此,TUN模式在國內公司實際應用的已經很少。跨機房應用要么拉光纖成局域網,要么DNS調度,底層數據還得同步。
  7. 直接對外的訪問業務,例如:Web服務做RS節點,最好用公網IP地址。不直接對外的業務,例如:MySQL,存儲系統RS節點,最好用內部IP地址。
 

1.6.3 DR模式-直接路由模式(重點)

Virtual Server via Direct Routing(VS/DR)

VS/DR模式是通過改寫請求報文的目標MAC地址,將請求發給真實服務器的,而真實服務器將響應后的處理結果直接返回給客戶端用戶。同VS/TUN技術一樣,VS/DR技術可極大地提高集群系統的伸縮性。而且,這種DR模式沒有IP隧道的開銷,對集群中的真實服務器也沒有必須支持IP隧道協議的要求,但是要求調度器LB與正式服務器RS節點都有一塊網卡連在同一物理網段上,即必須在同一個局域網環境。

image_1cvac6k701i1g1atuf9514p51bp51g.png-355.5kB


image_1cv7c9su4sp51aki176nnae1n8n9.png-912.7kB

只修改目標MAC地址,通過MAC找到RS節點(無法跨網段找到RS節點) 
DR模式特點小結:

  1. 通過在調度器LB上修改數據包的目的MAC地址實現轉發。(源IP地址仍然是CIP,目的IP地址仍然是VIP)
  2. 請求的報文經過調度器,而RS響應處理后的報文無需經過調度器LB,因此,並發訪問量大時使用效率很高(和NAT模式相比)
  3. 因DR模式是通過MAC地址的改寫機制實現的轉發,因此,所有RS節點和調度器LB只能在一個局域網LAN中(缺點)
  4. RS節點的默認網關不需要是調度器LB的DIP,而直接是IDC機房分配的上級路由器的IP(這是RS帶有外網IP地址的情況),理論講:只要RS可以出網即可,不是必須要配置外網IP
  5. 由於DR模式的調度器僅進行了目的MAC地址的改寫,因此,調度器LB無法改變請求的報文的目的端口(缺點)
  6. 當前,調度器LB支持幾乎所有的UNIX,LINUX系統,但目前不支持WINDOWS系統。真實服務器RS節點可以是WINDOWS系統。
  7. 總的來說DR模式效率很高,但是配置也較麻煩,因此,訪問量不是特別大的公司可以用haproxy/nginx取代之。這符合運維的原則:簡單,易用,高效。日2000W PV或並發請求1萬以下都可以考慮用haproxy/nginx(LVS NAT模式)
  8. 直接對外的訪問業務,例如:Web服務做RS節點,RS最好用公網IP地址。如果不直接對外的業務,例如:MySQl,存儲系統RS節點,最好只用內部IP地址。
 

1.6.4 FULLNAT模式-(了解即可)

image_1ctfmd3dk9pcfbp12m513se1rsu61.png-177.4kB


image_1ctfmd6k610if1p10c061iu5ues6e.png-213.9kB


image_1ctfmd9osecl1ga11nu4eeg1t7f6r.png-212.4kB

淘寶的LVS應用模式

FULLANT特點:

  1. 源IP改成不同的VIP和目的IP改成RIP
  2. RS處理完畢返回時,返回給不同的LVS調度器
  3. 所有LVS調度器之間通過session表進行Client Address的共享
 

1.7 LVS的調度算法

  • LVS的調度算法決定了如何在集群節點之間分布工作負荷。

  • 當Director調度器收到來自客戶端計算機訪問它的VIP上的集群服務的入站請求時,Director調度器必須決定哪個集群節點應該處理請求。Director調度器可用於做出該決定的調度方法分成兩個基本類別: 
    固定調度方法:rr,wrr,dh,sh 
    動態調度算法:wlc,lc,lblc,lblcr,SED,NQ

10種調度算法見如下表格(rr,wrr,wlc重點):

image_1ctfmf8qtj2mmeg132v1afkav478.png-70.3kB

 

1.8 LVS的調度算法的生產環境選型

  • 一般的網絡服務,如Http,Mail,MySQL等,常用的LVS調度算法為: 
    • 基本輪叫調度rr算法
    • 加權最小連接調度wlc
    • 加權輪叫調度wrr算法
  • 基於局部性的最少鏈接LBLC和帶復制的基於局部性最少鏈接LBLCR主要適用於Web Cache和Db Cache集群,但是我們很少這樣用。(都是一致性哈希算法)
  • 源地址散列調度SH和目標地址散列調度DH可以結合使用在防火牆集群中,它們可以保證整個系統的唯一出入口。
  • 最短預期延時調度SED和不排隊調度NQ主要是對處理時間相對比較長的網絡服務。

實際使用中,這些算法的適用范圍不限於這些。我們最好參考內核中的連接調度算法的實現原理,根據具體業務需求合理的選型。

 

1.9 LVS集群的特點

LVS集群的特點可以歸結如下:

(1)功能:

實現三種IP負載均衡技術和10種連接調度算法的IPVS軟件。在IPVS內部實現上,采用了高效的Hash函數和垃圾回收機制,能正確處理所調度報文相關的ICMP消息(有些商品化的系統反而不能)。虛擬服務的設置數目沒有限制,每個虛擬服務都有自己的服務器集。它支持持久的虛擬服務(如HTTP Cookie 和HTTPS等需要該功能的支持),並提供詳盡的統計數據,如連接的處理速率和報文的流量等。針對大規模拒絕服務(Deny of service)攻擊,實現了三種防衛策略:有基於內容請求分發的應用層交換軟件KTCPVS,它也是在Linux內核中實現。有相關的集群管理軟件對資源進行檢測,能及時將故障屏蔽,實現系統的高可用性。主,從調度器能周期性地進行狀態同步,從而實現更高的可用性。

(2)適用性

  1. 后端真實服務器可運行任何支持TCP/IP的操作系統,包括Linux,各種Unix(如FreeBSD,Sun Solaris,HP Unix等),Mac/OS和windows NT/2000等。

  2. 負載均衡調度器LB能夠支持絕大多數的TCP和UDP協議:

image_1ctfmiso3kuu65p14nv1qiu1lq17l.png-11.1kB

無需對客戶機和服務作任何修改,可適用大多數Internet服務。

  1. 調度器本身當前不支持windows系統。支持大多數的Linux和UINIX系統。

(3)性能

LVS服務器集群系統具有良好的伸縮性,可支持幾百萬個並發連接。配置100M網卡,采用VS/TUN或VS/DR調度技術,集群系統的吞吐量可高達1Gbits/s;如配置千兆網卡,則系統的最大吞吐量可接近10Gbits/s

(4)可靠性

LVS服務器集群軟件已經在很多大型的,關鍵性的站點得到很好的應用,所以它的可靠性在真實應用得到很好的證實。

(5)軟件許可證

LVS集群軟件是按GPL(GNU Public License)許可證發行的自由軟件,這意味着你可以得到軟件的源代碼,有權對其進行修改,但必須保證你的修改也是以GPL方式發行。

 

1.10 LVS的官方中文閱讀資料

image_1ctfmkoqn13he1g16oeuf5f20v82.png-25.4kB

 

二,手動實現LVS的負載均衡功能(DR模式)

 

2.1 安裝LVS軟件

 

2.1.1 LVS應用場景說明

1. 數據庫及memcache等對內業務的負載均衡環境

image_1cvascgct1tm1avu17o6ios6e79.png-16.5kB

特別提示:上面的環境為內部環境的負載均衡模式,即LVS服務是對內部業務的,如數據庫及memcache等的負載均衡

2. web服務或web cache等負載均衡環境

image_1ctfmmeosfqd1804ccg1lv51djl8s.png-17.5kB

提示: 
這個表格一般是提供Web或Web cache負載均衡的情況,此種情況特點為雙網卡環境。這里把192.168.0.0/24假設為內網卡,192.168.200.0/24假設為外網卡。

 

2.1.2 實驗一概述

image_1ctfmmu5ouvb145d1o6q19v7138t99.png-31.8kB


image_1ctfmnea81r6soqh4vovv32o89m.png-30.1kB


內部IP(eth) 外部IP(eth1) 角色 備注
192.168.200.69 LVS負載均衡器 VIP:192.168.200.240網關為:192.168.200.100
192.168.200.96 Web01節點 網關為:192.168.200.100
192.168.200.97 Web02節點 網關為:192.168.200.100
192.168.200.98 內網客戶端 網關為:192.168.200.100
192.168.1.100 外網客戶端 不配網關
192.168.200.100 192.168.1.200 網關型防火牆 雙網卡無網關
 

2.1.3 兩台Web配置簡單的nginx服務

過程略。

 
  1. echo "`hostname -I` sl" > /usr/local/nginx/html/index.html --->測試用
 

2.1.4 開始安裝LVS

以下的安裝都是在LVS LB 192.168.200.69上

 

1)下載相關軟件包

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz # <===適合5.x系統

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz # <===適合6.x系統

 

2)安裝准備命令

lsmod | grep ip_vs #查看linux內核是否有ipvs服務

uname -r #查看內核版本

cat /etc/redhat-release #查看系統版本

yum -y install kernel-devel #光盤安裝

ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64/ #安裝完就會出現此目錄

ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux #做一個軟連接

ll -d /usr/src/linux/

image_1cvakq3ub13mgi4r1ev49vhgpv9.png-21.7kB


image_1cval9igu60q12hr1l3889515ilm.png-114.5kB

 

特別注意

此ln命令的鏈接路徑要和uname -r輸出結果內核版本對應,工作中如果做安裝虛擬化可能有多個內核路徑 
如果沒有/usr/src/kernels/2.6.32-431.el6.x86_64/路徑,很可能是因為缺少kernel-devel軟件包。可通過yum進行安裝 
centos5.x版本不能用ipvs1.26

 

lvs+keepalived所有包

鏈接:https://pan.baidu.com/s/1sZUVJA-9d1KHhsxVePssSQ 
提取碼:wnyt

 

3)安裝lvs命令

yum -y install libnl* popt* #需要通過公網源安裝

tar xf ipvsadm-1.26.tar.gz -C /usr/src

cd /usr/src/ipvsadm-1.26/

make #直接編譯不需要./configure

make install

which ipvsadm

/sbin/ipvsadm

 
  1. IP Virtual Server version 1.2.1 (size=4096)
  2. Prot LocalAddress:Port Scheduler Flags
  3. -> RemoteAddress:Port Forward Weight ActiveConn InActConn

lsmod | grep ip_vs #執行完/sbin/ipvsadm就會有信息

 
  1. ip_vs 125220 0
  2. libcrc32c 1246 1 ip_vs
  3. ipv6 317340 270 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
  4. #==>出現這個內容就表示LVS已經安裝好,並加載到了內核

image_1cvalnoap15mdal21hoorjnvil13.png-160.7kB


image_1cvalp720m05o39eql1lob1frq1g.png-38kB

 

LVS安裝小結

1,CentOS5.X安裝lvs,使用1.24版本。 
2,CentOS6.X安裝lvs,使用1.26版本。 
3,安裝lvs后,要執行ipvsadm把ip_vs模塊加載到內核。

 

2.2 手動配置LVS負載均衡服務

 

2.2.1 手工添加lvs轉發

 

(1)配置LVS虛擬IP(VIP)

ifconfig eth0:0 192.168.200.240/24

ifconfig eth0:0

image_1cvalr5f811k0g9rjir17ob1d5m1t.png-27.7kB

 

(2)手工執行配置添加LVS服務並增加兩台RS

ipvsadm -C #清空ipvs歷史設置,因為是剛配置的所以沒有歷史

ipvsadm --set 30 5 60 #設置超時時間,為了測試效果不寫(tcp tcpfin udp)

ipvsadm -A -t 192.168.200.240:80 -s rr -p 20 --->為了測試效果,這里不需要寫-p參數

ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.96:80 -g -w 1

ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.97:80 -g -w 1

image_1cvalu4na1cop1va6ru61dpf1tav2a.png-21.9kB

 

配置添加參數說明

 
  1. #說明:
  2. -A:添加一個虛擬路由主機(LB
  3. -t:指定虛擬路由主機的VIP地址和監聽端口
  4. -s:指定負載均衡算法
  5. -p:指定會話保持時間
  6. #說明:
  7. -a:添加RS節點
  8. -t:指定虛擬路由主機的VIP地址和監聽端口
  9. -r:指定RS節點的RIP地址和監聽端口
  10. -g:指定DR模式
  11. -w:指定權值
 

(3)查看lvs配置結果

ipvsadm -L -n

 
  1. IP Virtual Server version 1.2.1 (size=4096)
  2. Prot LocalAddress:Port Scheduler Flags
  3. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  4. TCP 192.168.200.240:80 rr
  5. -> 192.168.200.96:80 Route 1 0 0
  6. -> 192.168.200.97:80 Route 1 0 0

image_1cvaluqor79d1lvs15s1b1kdt52n.png-29kB

 

(4)ipvs配置刪除方法

ipvsadm -D -t 192.168.200.240:80 -s rr #刪除虛擬路由主機

ipvsadm -d -t 192.168.200.240:80 -r 192.168.200.96:80 #刪除RS節點

此時,可以打開瀏覽器訪問http://192.168.200.240體驗結果,如果沒意外,是無法訪問的。(RS將包丟棄了)

image_1ctfmsfa8raq2uc1tttqn11va3aj.png-501.6kB

 

2.2.2 手工在RS端綁定

 

在Web01上操作

ifconfig lo:0 192.168.200.240/32 up #掩碼必須設置32

ifconfig lo:0

image_1cvamaqsvmvr19gkd2k18e9126334.png-27.3kB

 

在Web02上操作

ifconfig lo:0 192.168.200.240/32 up #掩碼必須設置32

ifconfig lo:0

image_1cvamb3hi1i90trgabl1rp26033h.png-27.8kB

 

2.2.3 瀏覽器測試LVS轉發效果

image_1cvap6u7o1ub41p9i1ck516514lp55.png-11.5kB


image_1cvap8eugek7fcvimq1lkv3an5i.png-15.7kB

注意: 
在測試時候你會發現刷新看的都是同一個RS節點 
這是因為瀏覽器的緩存問題 
因為沒有-p:指定會話保持時間,所以直接再次可以訪問 
不需要等一段時間以后,刷新就會重新負載均衡到新RS節點了

 

2.2.4 關於DR模式RS節點的ARP抑制的問題

image_1ctfmu7h2gom1s85ho81ttu1gcrbq.png-501.6kB

  • 因為在DR模式下,RS節點和LVS同處一個局域網網段內。
  • 當網關通過ARP廣播試圖獲取VIP的MAC地址的時候
  • LVS和節點都會接收到ARP廣播並且LVS和節點都綁定了192.168.200.240這個VIP,所以都會去響應網關的這個廣播,導致沖突現象。
  • 因此,我們需要對RS節點做抑制ARP廣播的措施。

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

image_1cvan7mttujtbrm1ij6bqfr0f3u.png-30.3kB


image_1cvan80i511bc1n5l1fn81d38a9l4b.png-30.5kB

 

2.2.5 配置網關型防火牆

防火牆的雙網卡都不要設置網關,因為自己的就網關

ip a

route -n --->防火牆不需要配置網關,因此沒有默認路由信息

vim /etc/sysctl.conf --->開啟網卡路由轉發

 
  1. net.ipv4.ip_forward = 1 #修改為1

sysctl -p --->讓配置即刻生效

image_1cvanm5jnjh7g7r18qp1nkb58o4o.png-121.6kB

 

特別提示

Web01,Web02,LVS負載均衡器,以及內網客戶端均將網關設置成網關型防火牆的eth0:192.168.200.100

 

2.2.6 配置內網客戶端

內網客戶端用於模擬lvs應用於內網的負載均衡情況 
比如lvs數據庫讀負載均衡,比如lvs memcached緩存組負載均衡 
由於這類型的負載均衡請求都是由內網服務器發起,因此用內網客戶端來模擬

 

內網客戶端訪問測試

hostname -I #內網客戶端IP

route -n #默認路由為網關防火牆

curl 192.168.200.240

image_1cvapc42l1s3os5j188hg5t1as65v.png-52.7kB

從上面可以看出,內網客戶端模擬訪問lvs負載均衡器,成功!

 

2.2.7 配置外網客戶端

外網客戶端模擬的是lvs轉發外網用戶訪問需求給RS節點處理的情況 
模擬外網客戶端,要求客戶端不能配置任何網關

image_1cvapmqec17778cd8u1b19ebk6c.png-30.2kB

由於外網客戶端要訪問內網的LVS需要經過網關防火牆的跳轉,因此需要在防火牆服務器上做iptables的DNAT和SNAT,配置如下:

hostname -I 
192.168.200.100 (內網網卡) 192.168.1.100(外網網卡)

route -n

iptables -t nat -A PREROUTING -i eth1 -d 192.168.1.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.240:80

iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth1 -j SNAT --to-source 192.168.1.100

iptables -t nat -L -nv

image_1cvararc21bt11gvcbh71d581oqf6p.png-91.3kB

 

進行外網客戶端訪問LVS負載均衡器測試

訪問防火牆的外網網卡IP經過iptables的跳轉訪問道了內網的lvs調度器,進而返回Web節點處理結果

image_1cvardlmmd6115tmi951dd21ch876.png-115.5kB

 

特別提示

由於瀏覽器緩存及LVS默認會話保持等影響,個人簡單的測試切換RS的幾率要很多次並且間隔一定時間訪問才行。盡可能關閉瀏覽器換不同的客戶端IP來測試,效果更明顯一些。用單機測試是有這種情況(負載均衡的算法傾向於一個客戶端IP定向到一個后端服務器,以保持會話連貫性),如果用兩三台機器去測試也許就不一樣。 
在測試訪問的同時可以通過ipvsadm -Lnc來查看訪問結果,如下所示:

ipvsadm -lnc

 
  1. IPVS connection entries
  2. pro expire state source virtual destination
  3. TCP 00:41 FIN_WAIT 192.168.1.200:43145 192.168.200.240:80 192.168.200.97:80
  4. TCP 00:40 FIN_WAIT 192.168.1.200:43143 192.168.200.240:80 192.168.200.97:80
  5. TCP 00:28 FIN_WAIT 192.168.1.200:43140 192.168.200.240:80 192.168.200.96:80
  6. TCP 00:29 FIN_WAIT 192.168.1.200:43141 192.168.200.240:80 192.168.200.97:80
  7. TCP 00:41 FIN_WAIT 192.168.1.200:43144 192.168.200.240:80 192.168.200.96:80
  8. TCP 00:39 FIN_WAIT 192.168.1.200:43142 192.168.200.240:80 192.168.200.96:80
  9. TCP 00:43 FIN_WAIT 192.168.1.200:43146 192.168.200.240:80 192.168.200.96:80

image_1cvarf0kt1v9ubm1q88nid1bvq7j.png-44.2kB

 

2.3 arp抑制技術參數說明

  •  arp_ignore-INTRGER
  • 定義對目標地址為本地IP的ARP詢問不同的應答模式 
    • 0(默認值):回應任何網絡接口上對任何本地IP地址的arp查詢請求。
    • 1:只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求
    • 2:只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內。
    • 3:不回應該網絡界面的arp請求,而只對設置的唯一和連接地址做出回應。
    • 4-7:保留未使用
    • 8:不回應所有(本地地址)的arp查詢。
  • arp_announce-INTEGER
  • 對網絡接口上,本地IP地址的發出的,ARP回應,作出相應級別的限制:確定不同程度的限制,宣布對來自本地源IP地址發出Arp請求的接口。 
    • 0(默認值):在任意網絡接口(eth0,eth1,lo)上的任何本地地址
    • 1:盡量避免不在該網絡接口子網段的本地地址做出arp回應,當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候很有用。此時會檢查來訪IP是否為所有接口上的子網段內IP之一。如果該來訪IP不屬於各個網絡接口上的子網段內,那么將采用級別2的方式來進行處理。
    • 2:對查詢目標使用最適當的本地地址,在此模式下將忽略這個IP數據包的源地址並嘗試選擇能與該地址通信的本地地址,首要是選擇所有的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址。如果沒有合適的地址被發現,將選擇當前的發送網絡接口或其他的有可能接受到該ARP回應的網絡接口來進行發送。限制了使用本地的vip地址作為優先的網絡接口。
 

2.4 開發腳本配置LVS負載均衡器端

 

2.4.1 LVS負載均衡器端自動配置腳本:

 
  1. [root@lvs01 scripts]# cat ipvs_server.sh
  2. #!/bin/bash
  3. # author:Mr.chen
  4. #LVS scripts
  5. . /etc/init.d/functions
  6. VIP=192.168.0.240
  7. SUBNET="eth0:`echo $VIP | awk -F "." '{print $4}'`"
  8. PORT=80
  9. RIP=(
  10. 192.168.0.223
  11. 192.168.0.224
  12. )
  13. function start(){
  14. if [ `ifconfig | grep $VIP | wc -l` -ne 0 ];then
  15. stop
  16. fi
  17. ifconfig $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up
  18. ipvsadm -C
  19. ipvsadm --set 30 5 60
  20. ipvsadm -A -t $VIP:$PORT -s rr -p 20
  21. for ((i=0;i<${#RIP[*]};i++))
  22. do
  23. ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1
  24. done
  25. }
  26. function stop(){
  27. ipvsadm -C
  28. if [ `ifconfig | grep $VIP | wc -l` -ne 0 ];then
  29. ifconfig $SUBNET down
  30. fi
  31. route del -host $VIP dev eth0 &>/dev/null
  32. }
  33. case "$1" in
  34. start)
  35. start
  36. echo "ipvs is started"
  37. ;;
  38. stop)
  39. stop
  40. echo "ipvs is stopped"
  41. ;;
  42. restart)
  43. stop
  44. echo "ipvs is stopped"
  45. start
  46. echo "ipvs is started"
  47. ;;
  48. *)
  49. echo "USAGE:$0 {start | stop | restart}"
  50. esac
 

2.4.2 RS節點Web服務器端自動配置腳本

 
  1. [root@web01 scripts]# cat rs_server.sh
  2. #!/bin/bash
  3. # author:Mr.chen
  4. # RS_sever scripts
  5. . /etc/rc.d/init.d/functions
  6. VIP=192.168.0.240
  7. case "$1" in
  8. start)
  9. echo "start LVS of REALServer IP"
  10. interface="lo:`echo $VIP | awk -F "." '{print $4}'`"
  11. /sbin/ifconfig $interface $VIP broadcast $VIP netmask 255.255.255.255 up
  12. route add -host $VIP dev $interface
  13. echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  14. echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
  15. echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
  16. echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
  17. ;;
  18. stop)
  19. interface="lo:`echo $VIP | awk -F "." '{print $4}'`"
  20. /sbin/ifconfig $interface down
  21. echo "STOP LVS of REALServer IP"
  22. echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  23. echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
  24. echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
  25. echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
  26. ;;
  27. *)
  28. echo "Usage: $0 {start|stop}"
  29. exit 1
  30. esac
 

三,企業LVS負載均衡高可用最優方案(LVS+Keepalived)

 

3.1 實驗二概述

image_1ctfn6smsos1r1u1m3him31bamd1.png-31.7kB


image_1ctfn76r4dd9119b29t1imp10e8de.png-22.8kB

 

3.2 LVS負載均衡器主和備安裝LVS軟件

安裝過程過程略

模擬了真實環境主備都添加了一塊新的網卡eth1

image_1cvd5k8491ivd1klj1ubh157j1do9m.png-39.7kB


image_1cvd5l28dp8h87af2q14tqpk613.png-39.8kB

 

3.3 兩台Web服務器安裝Web服務

安裝過程略

 

3.4 LVS負載均衡器主和備安裝Keepalived軟件

yum -y install keepalived #光盤安裝即可

image_1cvd26ua2jtk12rpo2o1okspvm9.png-131.6kB

 

3.5 僅實現LVS負載均衡器主和備的keepalived高可用功能

 

LVS負載均衡器主的keepalived配置文件內容如下

vim /etc/keepalived/keepalived.conf

cat /etc/keepalived/keepalived.conf

 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. 1123400300@qq.com
  5. }
  6. notification_email_from yunjisuan
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_01
  10. }
  11. vrrp_instance VI_1 {
  12. state MASTER
  13. interface eth1
  14. virtual_router_id 55
  15. priority 150
  16. advert_int 1
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.200.240/24 dev eth0 label eth0:240
  23. }
  24. }

image_1cvd5mm61ji0taa1dqi15vd13li20.png-52kB

 

LVS負載均衡器備的keepalived配置文件內容如下

vim /etc/keepalived/keepalived.conf

cat /etc/keepalived/keepalived.conf

 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. 1123400300@qq.com
  5. }
  6. notification_email_from yunjisuan
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_02
  10. }
  11. vrrp_instance VI_1 {
  12. state BACKUP
  13. interface eth1
  14. virtual_router_id 55
  15. priority 100
  16. advert_int 1
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.200.240/24 dev eth0 label eth0:240
  23. }
  24. }

image_1cvd5olke1851avr1jt817ve1b52d.png-52.3kB

 

3.6 添加LVS的負載均衡規則

以下操作過程,在LVS主和備上完全一樣

ipvsadm -C

ipvsadm -A -t 192.168.200.240:80 -s rr

ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.96:80 -g -w 1

ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.97:80 -g -w 1

ipvsadm -Ln

image_1cvd5th9ig7n14h1a3rboe5p72q.png-46.2kB


image_1cvd5uh7acr71991jlv10vd1mfd37.png-45.8kB

 

3.7 啟動LVS主和備的keepalived服務

 

在LVS主上

/etc/init.d/keepalived start

ifconfig

image_1cvd6197m9ra2tkihguo1ipo3k.png-109.9kB

 

在LVS副上

/etc/init.d/keepalived start

ifconfig

image_1cvd62bnq1d46snres31iip17ob41.png-96.5kB

 

特別提示

如果LVS副上沒有VIP就對了。如果主副都有,那么請檢查防火牆是否開啟狀態

 

手工在RS端綁定(工作環境需要寫成腳本)

 

在Web01上操作

ifconfig lo:0 192.168.200.240/32 up #掩碼必須設置32

image_1cvd6i6821qr6spae6e8l11tme4e.png-79.7kB

 

在Web02上操作

ifconfig lo:0 192.168.200.240/32 up #掩碼必須設置32

image_1cvd6ief8h2nbnbve610jaa164r.png-81.5kB

 

3.8 內網客戶端進行訪問測試

curl 192.168.200.240

image_1cvd7s2vg1vhbghdq31inu1t3m9.png-41kB

 

在LVS主上進行訪問連接查詢

ipvsadm -Lnc

image_1cvd7smc41v3o1l6sajb1dkadnnm.png-56.8kB

 

在LVS主上停掉keepalived服務

/etc/init.d/keepalived stop

ifconfig | grep eth0:240

image_1cvd7tdbd5791ddqfgp1v9b16se13.png-18.2kB

 

在LVS副上查看VIP

ip a | grep eth0:240

image_1cvd7tuounmf1dnl1daqbfacm20.png-17.8kB

 

再次在內網客戶端上進行訪問測試

curl 192.168.200.240

image_1cvd7udsi1faj9hs2eu1uv81tmj2d.png-51.5kB

 

在LVS副上進行訪問連接查詢

ipvsadm -Lnc

image_1cvd7uqugm0jso51oj01qqh1hs32q.png-48.5kB

 

開啟LVS主上的keepalived服務

/etc/init.d/keepalived start

ip a | grep eth0:240

image_1cvd7vfit1e4v7qh1jcodiqtd937.png-22.3kB

 

查看LVS副上VIP資源是否釋放

ip a | grep eth0:240

ifconfig

image_1cvd805a31fvjm851knk1eu2eej3k.png-94.4kB

綜上,至此基於LVS的keepalived高可用功能實驗完畢

 

3.9 通過Keepalived對LVS進行管理的功能實現雙實例

 

LVS負載均衡器主的keepalived配置文件內容如下

 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. 1123400300@qq.com
  5. }
  6. notification_email_from yunjisuan
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_DEVEL
  10. }
  11. vrrp_instance VI_1 {
  12. state MASTER
  13. interface eth1
  14. virtual_router_id 55
  15. priority 150
  16. advert_int 1
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.200.240/24 dev eth0 label eth0:240
  23. }
  24. }
  25. vrrp_instance VI_2 {
  26. state BACKUP
  27. interface eth1
  28. virtual_router_id 56
  29. priority 100
  30. advert_int 1
  31. authentication {
  32. auth_type PASS
  33. auth_pass 1111
  34. }
  35. virtual_ipaddress {
  36. 192.168.200.250/24 dev eth0 label eth0:250
  37. }
  38. }
  39. virtual_server 192.168.200.240 80 {
  40. delay_loop 6
  41. lb_algo rr
  42. lb_kind DR
  43. nat_mask 255.255.255.0
  44. # persistence_timeout 50
  45. protocol TCP
  46. real_server 192.168.200.96 80 {
  47. weight 1
  48. TCP_CHECK {
  49. connect_timeout 3
  50. nb_get_retry 3
  51. delay_before_retry 3
  52. connetct_port 80
  53. }
  54. }
  55. real_server 192.168.200.97 80 {
  56. weight 1
  57. TCP_CHECK {
  58. connect_timeout 3
  59. nb_get_retry 3
  60. delay_before_retry 3
  61. connetct_port 80
  62. }
  63. }
  64. }
  65. virtual_server 192.168.200.250 80 {
  66. delay_loop 6
  67. lb_algo rr
  68. lb_kind DR
  69. nat_mask 255.255.255.0
  70. # persistence_timeout 50
  71. protocol TCP
  72. real_server 192.168.200.96 80 {
  73. weight 1
  74. TCP_CHECK {
  75. connect_timeout 3
  76. nb_get_retry 3
  77. delay_before_retry 3
  78. connetct_port 80
  79. }
  80. }
  81. real_server 192.168.200.97 80 {
  82. weight 1
  83. TCP_CHECK {
  84. connect_timeout 3
  85. nb_get_retry 3
  86. delay_before_retry 3
  87. connetct_port 80
  88. }
  89. }
  90. }
 

LVS負載均衡器備的keepalived配置文件內容如下

 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. 1123400300@qq.com
  5. }
  6. notification_email_from yunjisuan
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_02
  10. }
  11. vrrp_instance VI_1 {
  12. state BACKUP
  13. interface eth1
  14. virtual_router_id 55
  15. priority 100
  16. advert_int 1
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.200.240/24 dev eth0 label eth0:240
  23. }
  24. }
  25. vrrp_instance VI_2 {
  26. state MASTER
  27. interface eth1
  28. virtual_router_id 56
  29. priority 150
  30. advert_int 1
  31. authentication {
  32. auth_type PASS
  33. auth_pass 1111
  34. }
  35. virtual_ipaddress {
  36. 192.168.200.250/24 dev eth0 label eth0:250
  37. }
  38. }
  39. virtual_server 192.168.200.240 80 {
  40. delay_loop 6
  41. lb_algo rr
  42. lb_kind DR
  43. nat_mask 255.255.255.0
  44. # persistence_timeout 50
  45. protocol TCP
  46. real_server 192.168.200.96 80 {
  47. weight 1
  48. TCP_CHECK {
  49. connect_timeout 3
  50. nb_get_retry 3
  51. delay_before_retry 3
  52. connetct_port 80
  53. }
  54. }
  55. real_server 192.168.200.97 80 {
  56. weight 1
  57. TCP_CHECK {
  58. connect_timeout 3
  59. nb_get_retry 3
  60. delay_before_retry 3
  61. connetct_port 80
  62. }
  63. }
  64. }
  65. virtual_server 192.168.200.250 80 {
  66. delay_loop 6
  67. lb_algo rr
  68. lb_kind DR
  69. nat_mask 255.255.255.0
  70. # persistence_timeout 50
  71. protocol TCP
  72. real_server 192.168.200.96 80 {
  73. weight 1
  74. TCP_CHECK {
  75. connect_timeout 3
  76. nb_get_retry 3
  77. delay_before_retry 3
  78. connetct_port 80
  79. }
  80. }
  81. real_server 192.168.200.97 80 {
  82. weight 1
  83. TCP_CHECK {
  84. connect_timeout 3
  85. nb_get_retry 3
  86. delay_before_retry 3
  87. connetct_port 80
  88. }
  89. }
  90. }
 

keepalived配置文件詳解

 
  1. virtual_server 192.168.0.240 80 { #虛擬主機VIP
  2. delay_loop 6 #
  3. lb_algo rr #算法
  4. lb_kind DR #模式
  5. nat_mask 255.255.255.0 #掩碼
  6. # persistence_timeout 50 #會話保持
  7. protocol TCP #協議
  8. real_server 192.168.0.223 80 { #RS節點
  9. weight 1 #權重
  10. TCP_CHECK { #節點健康檢查
  11. connect_timeout 8 #延遲超時時間
  12. nb_get_retry 3 #重試次數
  13. delay_before_retry 3 #延遲重試次數
  14. connect_port 80 #利用80端口檢查
  15. }
  16. }
  17. real_server 192.168.0.224 80 { #RS節點
 

特別提示

ipvsadm -C

以上keepalived配置文件在LVS主和備上都進行修改。 
然后在lvs服務器上通過ipvsadm -C清除之前設置的規則

image_1cvd8iagkq5312odqiv1l8i1nbd41.png-24.4kB


image_1cvd8imj883c1aklmav13tvn8l4e.png-24.7kB

 

重新啟動Lvs主keepalived服務進行測試,操作過程如下

/etc/init.d/keepalived stop #關閉主LVS的keepalived服務

ipvsadm -Ln #沒有ipvs規則

ip a | grep 240 #沒有VIP

ip a | grep 250 #沒有VIP

/etc/init.d/keepalived start #啟動keepalived服務

ipvsadm -Ln #出現ipvs規則

ip a | grep 240 #出現VIP

ip a | grep 250 #出現VIP

image_1cvd8o3h7jpo15ponuretk1udm4r.png-82.7kB

 

重新啟動Lvs備keepalived服務進行測試,操作過程如下

/etc/init.d/keepalived stop #關閉主LVS的keepalived服務

ipvsadm -Ln #沒有ipvs規則

ip a | grep 240 #沒有VIP

ip a | grep 250 #沒有VIP

/etc/init.d/keepalived start #啟動keepalived服務

ipvsadm -Ln #出現ipvs規則

ip a | grep 240 #沒有240VIP證明雙實例啟動成功

ip a | grep 250 #出現VIP

image_1cvd8ujgqjnj11th1ie51v3771i6o.png-78.1kB

 

檢測主備VIP情況

image_1cvd90e3p1gc1v845uf6kdgsg75.png-104kB


image_1cvd91ren12h11luhjhsg9715m7i.png-103.4kB

 

因為是雙實例需要手工在RS端在綁定另一個VIP

 

在Web01上操作

ifconfig lo:1 192.168.200.250/32 up #掩碼必須設置32

ifconfig lo:1

image_1cvd95gtkohk1jaguei1v5n24j8c.png-26kB

 

在Web02上操作

ifconfig lo:1 192.168.200.250/32 up #掩碼必須設置32

ifconfig lo:1

image_1cvd959131dnv1d4a1i0i5b714qd7v.png-26.4kB

 

在內網客戶端測試(因為之前已經測試過VIP漂移了這里就不演示了)

curl 192.168.200.240

curl 192.168.200.250

image_1cvd969aqnht12u41g141l2o1i8p99.png-51.8kB

 

附錄:LVS集群分發請求RS不均衡生產環境實戰解決

生產環境中ipvsadm -L -n 發現兩台RS的負載不均衡,一台有很多請求,一台沒有。並且沒有請求的那台RS經測試服務正常,lo:VIP也有。但是就是沒有請求

IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
-> RemoteAddress:Port Forward Weight ActiveConn InActConn 
TCP 192.168.0.240:80 rr persistent 10 
-> 192.168.0.223:80 Route 1 0 0 
-> 192.168.0.224:80 Route 1 8 12758

問題原因:

persistent 10的原因,persistent會話保持,當clientA訪問網站的時候,LVS把請求分發給了52,那么以后clientA再點擊的其他操作其他請求,也會發送給52這台機器。

解決辦法:

到keepalived中注釋掉persistent 10 然后/etc/init.d/keepalived reload,然后可以看到以后負載均衡兩邊都均衡了。

其他導致負載不均衡的原因可能有:

    1. LVS自身的會話保持參數設置(-p 300,persistent 300)。優化:大公司盡量用cookies替代session
    2. LVS調度算法設置,例如:rr,wrr,wlc,lc算法
    3. 后端RS節點的會話保持參數,例如:apache的keepalive參數
    4. 訪問量較少的情況,不均衡的現象更加明顯
    5. 用戶發送得請求時間長短,和請求資源多少大小。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM