lvs+keepalived集羣架構服務

lvs+keepalived集羣架構服務

一,LVS功能詳解

1.1 LVS(Linux Virtual Server)介紹

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

1.2 企業網站LVS集羣架構圖

QQ截圖20170807112955.png-667.2kB

1.3 IPVS軟件工做層次圖

圖片1.png-22.6kB

從上圖咱們看出,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基本工做過程以下圖所示:linux

QQ截圖20170807214557.png-289.1kB

爲了方便你們探討LVS技術,LVS社區提供了一個命名的約定,內容以下表:nginx

名稱 縮寫 說明
虛擬IP VIP VIP爲Director用於向客戶端計算機提供服務的IP地址。好比:www.yunjisuan.com域名就要解析到vip上提供服務
真實IP地址 RIP 在集羣下面節點上使用的IP地址,物理IP地址
Dirctor的IP地址 DIP Director用於鏈接內外網絡的IP地址,物理網卡上的IP地址。是負載均衡器上的IP
客戶端主機IP地址 CIP 客戶端用戶計算機請求集羣服務器的IP地址,該地址用做發送給集羣的請求的源IP地址

LVS集羣內部的節點稱爲真實服務器(Real Server),也叫作集羣節點。請求集羣服務的計算機稱爲客戶端計算機。
與計算機一般在網上交換數據包的方式相同,客戶端計算機,Director和真實服務器使用IP地址彼此進行通訊。
不一樣架構角色命名狀況以下圖:web

QQ截圖20170807215600.png-310.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)apache

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

QQ截圖20180203195841.png-39.9kB

QQ截圖20180203195908.png-51.6kB

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模式

QQ截圖20180203200015.png-42.1kB

增長一個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節點都有一塊網卡連在同一物理網段上,即必須在同一個局域網環境。

QQ截圖20180203200058.png-45.3kB

只修改目標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模式

QQ截圖20170809102737.png-158.7kB

QQ截圖20170809104552.png-185.4kB

QQ截圖20170809104638.png-190.8kB

淘寶的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重點):

算法 說明
rr 輪循調度,它將請求依次分配不一樣的RS節點,也就是在RS節點中均攤請求。這種算法簡單,可是隻適合於RS節點處理性能相差不大的狀況
wrr 權重輪循,它將依據不一樣RS節點的權值分配任務。權值較高的RS將優先得到任務,而且分配到的鏈接數將比權值較低的RS節點更多。相同權值的RS獲得相同數目的鏈接數
dh 目的地址哈希調度,以目的地址爲關鍵字查找一個靜態hash表來得到須要的RS
sh 源地址哈希調度,以源地址爲關鍵字查找一個靜態hash表來得到須要的RS
wlc 加權最小鏈接數調度,實際鏈接數除以權值,最小的RS做爲分配的RS
lc 最小鏈接數調度,鏈接數最小的RS做爲分配的RS
lblc 基於地址的最小鏈接數調度,未來自同一目的地址的請求分配給同一臺RS節點
lblcr 基於地址帶重複最小鏈接數調度。(略)
SED 最短的指望的延遲(不成熟)
NQ 最小隊列調度(不成熟)
 

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協議:

協議 內容
TCP HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等
UDP DNS,NTP,TCP,視頻,音頻流播放協議等

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

3)調度器自己當前不支持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的官方中文閱讀資料

標題 地址
LVS項目介紹 http://www.linuxvirtualserver.org/zh/lvs1.html
LVS集羣的體系結構 http://www.linuxvirtualserver.org/zh/lvs2.html
LVS集羣中的IP負載均衡技術 http://www.linuxvirtualserver.org/zh/lvs3.html
LVS集羣的負載調度 http://www.linuxvirtualserver.org/zh/lvs4.html
 

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

2.1 安裝LVS軟件

2.1.1 LVS應用場景說明

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

管理IP地址 角色 備註
192.168.0.210 LVS調度器(Director) 對外提供服務的VIP爲192.168.0.240
192.168.0.223 RS1(真實服務器)  
192.168.0.224 RS2(真實服務器)  

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

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

外部IP地址 內部IP地址 角色 備註
192.168.200.210 192.168.0.210 LVS調度器(Director) 對外提供服務的VIP爲192.168.0.240
192.168.200.223 192.168.0.223 RS1(真實服務器)  
192.168.200.224 192.168.0.224 RS2(真實服務器)  

提示:
這個表格通常是提供Web或Web cache負載均衡的狀況,此種狀況特色爲雙網卡環境。這裏把192.168.0.0/24假設爲內網卡,192.168.200.0/24假設爲外網卡。

2.1.2 實驗一律述

QQ截圖20170810205508.png-22.4kB

內部IP(eth0) 外部IP(eth1) 角色 備註
192.168.0.210 LVS負載均衡器 VIP:192.168.0.240網關爲:192.168.0.100
192.168.0.223 Web01節點 網關爲:192.168.0.100
192.168.0.224 Web02節點 網關爲:192.168.0.100
192.168.0.220 內網客戶端 網關爲:192.168.0.100
192.168.200.200 外網客戶端 不配網關
192.168.0.100 192.168.200.100 網關型防火牆 雙網卡均無網關
 

2.1.3 兩臺Web配置簡單的http服務

爲了方便,咱們能夠用yum簡單裝一個apache提供httpd服務進行測試,過程略。

2.1.4 開始安裝LVS

如下的安裝都是在LVS LB 192.168.0.210上

1)下載相關軟件包

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

2)安裝準備命令

  1. [root@lvs01 ~]# lsmod | grep ip_vs #查看linux內核是否有ipvs服務
  2. [root@lvs01 ~]# uname -r #查看內核版本
  3. 2.6.32-431.el6.x86_64
  4. [root@lvs01 ~]# cat /etc/redhat-release #查看系統版本
  5. CentOS release 6.5 (Final)
  6. [root@lvs01 ~]# yum -y install kernel-devel #光盤安裝
  7. [root@lvs01 ~]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64/
  8. drwxr-xr-x. 2 root root 4096 Aug 9 19:28 /usr/src/kernels/2.6.32-431.el6.x86_64/ #安裝完就會出現此目錄
  9. [root@lvs01 ~]# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux #作一個軟鏈接
  10. [root@lvs01 ~]# ll -d /usr/src/linux/
  11. drwxr-xr-x. 2 root root 4096 Aug 9 19:28 /usr/src/linux/
  12. [root@lvs01 ~]# ll /usr/src/
  13. total 8
  14. drwxr-xr-x. 2 root root 4096 Sep 23 2011 debug
  15. drwxr-xr-x. 3 root root 4096 Aug 9 19:28 kernels
  16. lrwxrwxrwx. 1 root root 39 Aug 9 19:28 linux -> /usr/src/kernels/2.6.32-431.el6.x86_64/
  17. [root@lvs01 ~]#

特別注意:
此ln命令的連接路徑要和uname -r輸出結果內核版本對應,工做中若是作安裝虛擬化可能有多個內核路徑
若是沒有/usr/src/kernels/2.6.32-431.el6.x86_64/路徑,極可能是由於缺乏kernel-devel軟件包。可經過yum進行安裝
centos5.x版本不能用ipvs1.26

3)安裝lvs命令:

  1. [root@lvs01 ~]# yum -y install libnl* popt* #須要經過公網源安裝
  2. [root@lvs01 ~]# cd /usr/src/ipvsadm-1.26/
  3. [root@lvs01 ipvsadm-1.26]# make #直接編譯不須要./configure
  4. [root@lvs01 ipvsadm-1.26]# make install
  5. [root@lvs01 ~]# which ipvsadm
  6. /sbin/ipvsadm
  7. [root@lvs01 ~]# ipvsadm
  8. IP Virtual Server version 1.2.1 (size=4096)
  9. Prot LocalAddress:Port Scheduler Flags
  10. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  11. [root@lvs01 ~]# lsmod | grep ip_vs #執行完/sbin/ipvsadm就會有信息
  12. ip_vs 125220 0
  13. libcrc32c 1246 1 ip_vs
  14. ipv6 317340 270 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
  15. #==>出現這個內容就表示LVS已經安裝好,並加載到了內核

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)

 
  1. [root@lvs01 ~]# ifconfig eth0:0 192.168.0.240 broadcast 192.168.0.240 netmask 255.255.255.0 up
  2. [root@lvs01 ~]# ifconfig eth0:0
  3. eth0:0 Link encap:Ethernet HWaddr 00:0C:29:D5:7F:9D
  4. inet addr:192.168.0.240 Bcast:192.168.0.240 Mask:255.255.255.255
  5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

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

  1. [root@lvs01 ~]# ipvsadm -C #清空ipvs歷史設置
  2. [root@lvs01 ~]# ipvsadm --set 30 5 60 #設置超時時間(tcp tcpfin udp)
  3. [root@lvs01 ~]# ipvsadm -A -t 192.168.0.240:80 -s rr -p 20
  4. #說明:
  5. -A:添加一個虛擬路由主機(LB
  6. -t:指定虛擬路由主機的VIP地址和監聽端口
  7. -s:指定負載均衡算法
  8. -p:指定會話保持時間
  9. [root@lvs01 ~]# ipvsadm -a -t 192.168.0.240:80 -r 192.168.0.223:80 -g -w 1
  10. [root@lvs01 ~]# ipvsadm -a -t 192.168.0.240:80 -r 192.168.0.224:80 -g -w 1
  11. #說明:
  12. -a:添加RS節點
  13. -t:指定虛擬路由主機的VIP地址和監聽端口
  14. -r:指定RS節點的RIP地址和監聽端口
  15. -g:指定DR模式
  16. -w:指定權值

(3)查看lvs配置結果

  1. [root@lvs01 ~]# ipvsadm -L -n
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 192.168.0.240:80 rr persistent 20
  6. -> 192.168.0.223:80 Route 1 0 0
  7. -> 192.168.0.224:80 Route 1 0 0

(4)ipvs配置刪除方法

  1. [root@lvs01 ~]# #ipvsadm -D -t 192.168.0.240:80 -s rr #刪除虛擬路由主機
  2. [root@lvs01 ~]# #ipvsadm -d -t 192.168.0.240:80 -r 192.168.0.223:80 #刪除RS節點

此時,能夠打開瀏覽器訪問http://192.168.0.240體驗結果,若是沒意外,是沒法訪問的。(RS將包丟棄了)

QQ截圖20170810005652.png-434.1kB

2.2.2 手工在RS端綁定

  1. #在Web01上操做
  2. [root@web01 ~]# ifconfig lo:0 192.168.0.240/32 up #掩碼必須設置32
  3. [root@web01 ~]# ifconfig lo:0
  4. lo:0 Link encap:Local Loopback
  5. inet addr:192.168.0.240 Mask:0.0.0.0
  6. UP LOOPBACK RUNNING MTU:16436 Metric:1
  7. #在Web02上操做
  8. [root@web02 ~]# ifconfig lo:0 192.168.0.240/32 up #掩碼必須設置32
  9. [root@web02 ~]# ifconfig lo:0
  10. lo:0 Link encap:Local Loopback
  11. inet addr:192.168.0.240 Mask:0.0.0.0
  12. UP LOOPBACK RUNNING MTU:16436 Metric:1

2.2.3 瀏覽器測試LVS轉發效果

QQ截圖20170810010649.png-24.7kB

QQ截圖20170810010717.png-25.3kB

注意:
在測試時候你會發現刷新看的都是同一個RS節點
這是由於瀏覽器的緩存問題
等一段時間之後,刷新就會從新負載均衡到新RS節點了

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

QQ截圖20170810005652.png-434.1kB

  • 由於在DR模式下,RS節點和LVS同處一個局域網網段內。
  • 當網關經過ARP廣播試圖獲取VIP的MAC地址的時候
  • LVS和節點都會接收到ARP廣播而且LVS和節點都綁定了192.168.0.240這個VIP,因此都會去響應網關的這個廣播,致使衝突現象。
  • 所以,咱們須要對RS節點作抑制ARP廣播的措施。
  1. [root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  2. [root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
  3. [root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
  4. [root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

2.2.5 配置網關型防火牆

防火牆的雙網卡都不要設置網關,由於本身的就網關

  1. [root@localhost ~]# ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. inet6 ::1/128 scope host
  6. valid_lft forever preferred_lft forever
  7. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 #內網網卡
  8. link/ether 00:0c:29:ee:d3:15 brd ff:ff:ff:ff:ff:ff
  9. inet 192.168.0.100/24 brd 192.168.0.255 scope global eth0
  10. inet6 fe80::20c:29ff:feee:d315/64 scope link
  11. valid_lft forever preferred_lft forever
  12. 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 #外網網卡
  13. link/ether 00:0c:29:ee:d3:1f brd ff:ff:ff:ff:ff:ff
  14. inet 192.168.200.100/24 brd 192.168.200.255 scope global eth1
  15. inet6 fe80::20c:29ff:feee:d31f/64 scope link
  16. valid_lft forever preferred_lft forever
  17. [root@localhost ~]# route -n
  18. Kernel IP routing table
  19. Destination Gateway Genmask Flags Metric Ref Use Iface
  20. 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  21. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  22. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  23. 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
  24. #防火牆不須要配置網關,所以沒有默認路由信息
  25. [root@localhost ~]# head /etc/sysctl.conf #開啓網卡路由轉發
  26. # Kernel sysctl configuration file for Red Hat Linux
  27. #
  28. # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
  29. # sysctl.conf(5) for more details.
  30. # Controls IP packet forwarding
  31. net.ipv4.ip_forward = 1 #修改成1
  32. # Controls source route verification
  33. net.ipv4.conf.default.rp_filter = 1
  34. [root@localhost ~]# sysctl -p #讓配置即刻生效
  35. net.ipv4.ip_forward = 1
  36. net.ipv4.conf.default.rp_filter = 1
  37. net.ipv4.conf.default.accept_source_route = 0
  38. kernel.sysrq = 0
  39. kernel.core_uses_pid = 1
  40. net.ipv4.tcp_syncookies = 1
  41. error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
  42. error: "net.bridge.bridge-nf-call-iptables" is an unknown key
  43. error: "net.bridge.bridge-nf-call-arptables" is an unknown key
  44. kernel.msgmnb = 65536
  45. kernel.msgmax = 65536
  46. kernel.shmmax = 68719476736
  47. kernel.shmall = 4294967296

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

2.2.6 配置內網客戶端

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

  1. #內網客戶端訪問測試
  2. root@LanClient ~]# hostname -I
  3. 192.168.0.220 #內網客戶端IP
  4. [root@LanClient ~]# route -n #默認路由爲網關防火牆
  5. Kernel IP routing table
  6. Destination Gateway Genmask Flags Metric Ref Use Iface
  7. 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  8. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  9. 0.0.0.0 192.168.0.100 0.0.0.0 UG 0 0 0 eth0
  10. [root@LanClient ~]# curl 192.168.0.240
  11. 192.168.0.224 bbs
  12. [root@LanClient ~]# curl 192.168.0.240
  13. 192.168.0.223 bbs
  14. [root@LanClient ~]# curl 192.168.0.240
  15. 192.168.0.224 bbs
  16. [root@LanClient ~]# curl 192.168.0.240
  17. 192.168.0.223 bbs
  18. #從上面能夠看出,內網客戶端模擬訪問lvs負載均衡器,成功!

2.2.7 配置外網客戶端

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

QQ截圖20170810213311.png-9kB

因爲外網客戶端要訪問內網的LVS須要通過網關防火牆的跳轉,所以須要在防火牆服務器上作iptables的DNAT和SNAT,配置以下:

  1. [root@GATEWAY ~]# hostname -I
  2. 192.168.0.100(內網網卡) 192.168.200.100(外網網卡)
  3. [root@GATEWAY ~]# route -n
  4. Kernel IP routing table
  5. Destination Gateway Genmask Flags Metric Ref Use Iface
  6. 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  7. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  8. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  9. 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
  10. [root@GATEWAY ~]# iptables -t nat -A PREROUTING -i eth1 -d 192.168.200.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.240
  11. [root@GATEWAY ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 192.168.200.100
  12. [root@GATEWAY ~]# iptables -t nat -L -nv
  13. Chain PREROUTING (policy ACCEPT 25 packets, 5251 bytes)
  14. pkts bytes target prot opt in out source destination
  15. 32 1920 DNAT tcp -- eth1 * 0.0.0.0/0 192.168.200.100 tcp dpt:80 to:192.168.0.240
  16. Chain POSTROUTING (policy ACCEPT 53 packets, 3208 bytes)
  17. pkts bytes target prot opt in out source destination
  18. 0 0 SNAT all -- * eth1 192.168.0.0/24 0.0.0.0/0 to:192.168.200.100
  19. Chain OUTPUT (policy ACCEPT 22 packets, 1348 bytes)
  20. pkts bytes target prot opt in out source destination
  21. [root@GATEWAY ~]#

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

QQ截圖20170810214139.png-37.1kB

特別提示:
因爲瀏覽器緩存及LVS默認會話保持等影響,我的簡單的測試切換RS的概率要不少次而且間隔必定時間訪問才行。儘量關閉瀏覽器換不一樣的客戶端IP來測試,效果更明顯一些。用單機測試是有這種狀況(負載均衡的算法傾向於一個客戶端IP定向到一個後端服務器,以保持會話連貫性),若是用兩三臺機器去測試也許就不同。
在測試訪問的同時能夠經過ipvsadm -Lnc來查看訪問結果,以下所示:

  1. [root@lvs01 network-scripts]# ipvsadm -lnc
  2. IPVS connection entries
  3. pro expire state source virtual destination
  4. TCP 01:41 FIN_WAIT 192.168.0.220:59805 192.168.0.240:80 192.168.0.224:80
  5. TCP 01:40 FIN_WAIT 192.168.0.220:59803 192.168.0.240:80 192.168.0.224:80
  6. TCP 01:50 FIN_WAIT 192.168.200.200:34926 192.168.0.240:80 192.168.0.223:80
  7. TCP 01:41 FIN_WAIT 192.168.0.220:59804 192.168.0.240:80 192.168.0.223:80
  8. TCP 01:50 FIN_WAIT 192.168.200.200:34925 192.168.0.240:80 192.168.0.224:80
  9. TCP 01:41 FIN_WAIT 192.168.0.220:59806 192.168.0.240:80 192.168.0.223:80
  10. TCP 01:40 FIN_WAIT 192.168.0.220:59802 192.168.0.240:80 192.168.0.223:80
  11. TCP 01:51 FIN_WAIT 192.168.200.200:34927 192.168.0.240:80 192.168.0.224:80

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 實驗二概述

QQ截圖20170811104939.png-22.8kB

內部IP(eth0) 外部IP(eth1) 角色 備註
192.168.0.210 LVS負載均衡器(主) VIP:192.168.0.240
192.168.0.211 LVS負載均衡器(備) VIP:192.168.0.240
192.168.0.223 Web01節點  
192.168.0.224 Web02節點  
192.168.0.220 內網客戶端  
 

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

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

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

  1. [root@lvs01 ~]# yum -y install keepalived #光盤安裝便可

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

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

  1. [root@lvs01 ~]# sed -n '1,30p' /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 215379068@qq.com
  6. }
  7. notification_email_from yunjisuan
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id LVS01
  11. }
  12. vrrp_instance VI_1 {
  13. state MASTER
  14. interface eth0
  15. virtual_router_id 55
  16. priority 150
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.0.240/24 dev eth0 label eth0:240
  24. }
  25. }

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

  1. [root@localhost ~]# sed -n '1,30p' /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 215379068@qq.com
  6. }
  7. notification_email_from yunjisuan
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id LVS02
  11. }
  12. vrrp_instance VI_1 {
  13. state BACKUP
  14. interface eth0
  15. virtual_router_id 55
  16. priority 100
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.0.240/24 dev eth0 label eth0:240
  24. }
  25. }

3.6 添加LVS的負載均衡規則

如下操做過程,在LVS主和備上徹底同樣

  1. [root@localhost ~]# ipvsadm -C
  2. [root@localhost ~]# ipvsadm -A -t 192.168.0.240:80 -s rr
  3. [root@localhost ~]# ipvsadm -a -t 192.168.0.240:80 -r 192.168.0.223:80 -g -w 1
  4. [root@localhost ~]# ipvsadm -a -t 192.168.0.240:80 -r 192.168.0.224:80 -g -w 1
  5. [root@localhost ~]# ipvsadm -Ln
  6. IP Virtual Server version 1.2.1 (size=4096)
  7. Prot LocalAddress:Port Scheduler Flags
  8. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  9. TCP 192.168.0.240:80 rr persistent 20
  10. -> 192.168.0.223:80 Route 1 0 0
  11. -> 192.168.0.224:80 Route 1 0 0

3.7 啓動LVS主和備的keepalived服務

  1. #在LVS主上
  2. [root@lvs01 ~]# /etc/init.d/keepalived start
  3. [root@lvs01 ~]# ifconfig
  4. eth0 Link encap:Ethernet HWaddr 00:0C:29:D5:7F:9D
  5. inet addr:192.168.0.210 Bcast:192.168.0.255 Mask:255.255.255.0
  6. inet6 addr: fe80::20c:29ff:fed5:7f9d/64 Scope:Link
  7. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  8. RX packets:23567 errors:0 dropped:0 overruns:0 frame:0
  9. TX packets:14635 errors:0 dropped:0 overruns:0 carrier:0
  10. collisions:0 txqueuelen:1000
  11. RX bytes:2008524 (1.9 MiB) TX bytes:1746298 (1.6 MiB)
  12. eth0:240 Link encap:Ethernet HWaddr 00:0C:29:D5:7F:9D
  13. inet addr:192.168.0.240 Bcast:0.0.0.0 Mask:255.255.255.0
  14. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  15. lo Link encap:Local Loopback
  16. inet addr:127.0.0.1 Mask:255.0.0.0
  17. inet6 addr: ::1/128 Scope:Host
  18. UP LOOPBACK RUNNING MTU:16436 Metric:1
  19. RX packets:769 errors:0 dropped:0 overruns:0 frame:0
  20. TX packets:769 errors:0 dropped:0 overruns:0 carrier:0
  21. collisions:0 txqueuelen:0
  22. RX bytes:56636 (55.3 KiB) TX bytes:56636 (55.3 KiB)
  23. #在LVS副上
  24. [root@localhost ~]# /etc/init.d/keepalived start
  25. [root@localhost ~]# ifconfig
  26. eth0 Link encap:Ethernet HWaddr 00:0C:29:E7:06:1D
  27. inet addr:192.168.0.211 Bcast:192.168.0.255 Mask:255.255.255.0
  28. inet6 addr: fe80::20c:29ff:fee7:61d/64 Scope:Link
  29. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  30. RX packets:14109 errors:0 dropped:0 overruns:0 frame:0
  31. TX packets:4902 errors:0 dropped:0 overruns:0 carrier:0
  32. collisions:0 txqueuelen:1000
  33. RX bytes:12683754 (12.0 MiB) TX bytes:553207 (540.2 KiB)
  34. lo Link encap:Local Loopback
  35. inet addr:127.0.0.1 Mask:255.0.0.0
  36. inet6 addr: ::1/128 Scope:Host
  37. UP LOOPBACK RUNNING MTU:16436 Metric:1
  38. RX packets:155 errors:0 dropped:0 overruns:0 frame:0
  39. TX packets:155 errors:0 dropped:0 overruns:0 carrier:0
  40. collisions:0 txqueuelen:0
  41. RX bytes:11283 (11.0 KiB) TX bytes:11283 (11.0 KiB)
  42. #若是LVS副上沒有VIP就對了。若是主副都有,那麼請檢查防火牆是否開啓狀態

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

  1. #在內網客戶端上進行訪問測試
  2. [root@LanClient ~]# curl 192.168.0.240
  3. 192.168.0.224 bbs
  4. [root@LanClient ~]# curl 192.168.0.240
  5. 192.168.0.223 bbs
  6. [root@LanClient ~]# curl 192.168.0.240
  7. 192.168.0.224 bbs
  8. [root@LanClient ~]# curl 192.168.0.240
  9. 192.168.0.223 bbs
  10. [root@LanClient ~]# curl 192.168.0.240
  11. 192.168.0.224 bbs
  12. [root@LanClient ~]# curl 192.168.0.240
  13. 192.168.0.223 bbs
  14. [root@LanClient ~]# curl 192.168.0.240
  15. 192.168.0.224 bbs
  16. #在LVS主上進行訪問鏈接查詢
  17. [root@lvs01 ~]# ipvsadm -Lnc
  18. IPVS connection entries
  19. pro expire state source virtual destination
  20. TCP 00:01 FIN_WAIT 192.168.0.220:59887 192.168.0.240:80 192.168.0.223:80
  21. TCP 00:01 FIN_WAIT 192.168.0.220:59889 192.168.0.240:80 192.168.0.223:80
  22. TCP 00:01 FIN_WAIT 192.168.0.220:59888 192.168.0.240:80 192.168.0.224:80
  23. TCP 00:00 FIN_WAIT 192.168.0.220:59886 192.168.0.240:80 192.168.0.224:80
  24. #在LVS主上停掉keepalived服務
  25. [root@lvs01 ~]# /etc/init.d/keepalived stop
  26. Stopping keepalived: [ OK ]
  27. [root@lvs01 ~]# ifconfig | grep eth0:240
  28. #在LVS副上查看VIP
  29. [root@localhost ~]# ip a | grep eth0:240
  30. inet 192.168.0.240/24 scope global secondary eth0:240
  31. #再次在內網客戶端上進行訪問測試
  32. [root@LanClient ~]# curl 192.168.0.240
  33. 192.168.0.223 bbs
  34. [root@LanClient ~]# curl 192.168.0.240
  35. 192.168.0.224 bbs
  36. [root@LanClient ~]# curl 192.168.0.240
  37. 192.168.0.223 bbs
  38. [root@LanClient ~]# curl 192.168.0.240
  39. 192.168.0.224 bbs
  40. [root@LanClient ~]# curl 192.168.0.240
  41. 192.168.0.223 bbs
  42. #在LVS副上進行訪問鏈接查詢
  43. [root@localhost ~]# ipvsadm -Lnc
  44. IPVS connection entries
  45. pro expire state source virtual destination
  46. TCP 01:47 FIN_WAIT 192.168.0.220:59900 192.168.0.240:80 192.168.0.223:80
  47. TCP 01:09 FIN_WAIT 192.168.0.220:59891 192.168.0.240:80 192.168.0.224:80
  48. TCP 01:48 FIN_WAIT 192.168.0.220:59902 192.168.0.240:80 192.168.0.223:80
  49. TCP 01:09 FIN_WAIT 192.168.0.220:59892 192.168.0.240:80 192.168.0.224:80
  50. TCP 01:14 FIN_WAIT 192.168.0.220:59896 192.168.0.240:80 192.168.0.224:80
  51. TCP 01:10 FIN_WAIT 192.168.0.220:59894 192.168.0.240:80 192.168.0.224:80
  52. #開啓LVS主上的keepalived服務
  53. [root@lvs01 ~]# /etc/init.d/keepalived start
  54. [root@lvs01 ~]# ip a | grep eth0:240
  55. inet 192.168.0.240/24 scope global secondary eth0:240
  56. #查看LVS副上VIP資源是否釋放
  57. [root@localhost ~]# ip a | grep eth0:240
  58. [root@localhost ~]#

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

3.9 經過Keepalived對LVS進行管理的功能實現

  1. [root@lvs01 ~]# cat /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 215379068@qq.com
  6. }
  7. notification_email_from yunjisuan
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id LVS01
  11. }
  12. vrrp_instance VI_1 {
  13. state MASTER
  14. interface eth0
  15. virtual_router_id 55
  16. priority 150
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.0.240/24 dev eth0 label eth0:240
  24. }
  25. }
  26. virtual_server 192.168.0.240 80 { #虛擬主機VIP
  27. delay_loop 6 #
  28. lb_algo rr #算法
  29. lb_kind DR #模式
  30. nat_mask 255.255.255.0 #掩碼
  31. # persistence_timeout 50 #會話保持
  32. protocol TCP #協議
  33. real_server 192.168.0.223 80 { #RS節點
  34. weight 1 #權重
  35. TCP_CHECK { #節點健康檢查
  36. connect_timeout 8 #延遲超時時間
  37. nb_get_retry 3 #重試次數
  38. delay_before_retry 3 #延遲重試次數
  39. connect_port 80 #利用80端口檢查
  40. }
  41. }
  42. real_server 192.168.0.224 80 { #RS節點
  43. weight 1
  44. TCP_CHECK {
  45. connect_timeout 8
  46. nb_get_retry 3
  47. delay_before_retry 3
  48. connect_port 80
  49. }
  50. }
  51. }

以上keepalived配置文件在LVS主和備上都進行修改。
而後在lvs服務器上經過ipvsadm -C清除以前設置的規則
從新啓動keepalived服務進行測試,操做過程以下:

  1. [root@lvs01 ~]# /etc/init.d/keepalived stop #關閉主LVS的keepalived服務
  2. Stopping keepalived: [ OK ]
  3. [root@lvs01 ~]# ipvsadm -Ln #沒有ipvs規則
  4. IP Virtual Server version 1.2.1 (size=4096)
  5. Prot LocalAddress:Port Scheduler Flags
  6. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  7. [root@lvs01 ~]# ip a | grep 240 #沒有VIP
  8. [root@lvs01 ~]# /etc/init.d/keepalived start #啓動keepalived服務
  9. Starting keepalived: [ OK ]
  10. [root@lvs01 ~]# ipvsadm -Ln #出現ipvs規則
  11. IP Virtual Server version 1.2.1 (size=4096)
  12. Prot LocalAddress:Port Scheduler Flags
  13. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  14. TCP 192.168.0.240:80 rr
  15. -> 192.168.0.223:80 Route 1 0 0
  16. -> 192.168.0.224:80 Route 1 0 0
  17. [root@lvs01 ~]# ip a | grep 240 #出現VIP
  18. inet 192.168.0.240/24 scope global secondary eth0:240

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

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

  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.0.240:80 rr persistent 10
  5. -> 192.168.0.223:80 Route 1 0 0
  6. -> 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. 用戶發送得請求時間長短,和請求資源多少大小。
相關文章
相關標籤/搜索