lvs+keepalived叢集架構服務
一,LVS功能詳解
1.1 LVS(Linux Virtual Server)介紹
LVS是Linux Virtual Server 的簡寫(也叫做IPVS),意即Linux虛擬伺服器,是一個虛擬的伺服器集群系統,可以在UNIX/LINUX平臺下實現負載均衡叢集功能。
1.2 企業網站LVS叢集架構圖
1.3 IPVS軟體工作層次圖
從上圖我們看出,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基本工作過程如下圖所示:
為了方便大家探討LVS技術,LVS社群提供了一個命名的約定,內容如下表:
名稱 |
縮寫 |
說明 |
虛擬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地址彼此進行通訊。
不同架構角色命名情況如下圖:
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的四種工作模式
- NAT(Network Address Translation)
- TUN(Tunneling)
- DR(Direct Routing)
- FULLNAT(Full Network Address Translation)
1.6.1 NAT模式-網路地址轉換<==收費站模式(瞭解即可)
Virtual Server via Network Address Translation(VS/NAT)
排程時:目的IP改成RIP(DNAT)
返回時:源IP改成VIP(SNAT)
NAT模式特點小結:
- NAT技術將請求的報文(DNAT)和響應的報文(SNAT),通過排程器地址重寫然後在轉發發給內部的伺服器,報文返回時在改寫成原來的使用者請求的地址。
- 只需要在排程器LB上配置WAN公網IP即可,排程器也要有私有LAN IP和內部RS節點通訊。
- 每臺內部RS節點的閘道器地址,必須要配成排程器LB的私有LAN內物理網絡卡地址(LDIP),這樣才能確保資料報文返回時仍然經過排程器LB。
- 由於請求與響應的資料報文都經過排程器LB,因此,網站訪問量大時排程器LB有較大瓶頸,一般要求最多10-20臺節點。
- NAT模式支援對IP及埠的轉換,即使用者請求10.0.0.1:80,可以通過排程器轉換到RS節點的10.0.0.2:8080(DR和TUN模式不具備的)
- 所有NAT內部RS節點只需要配置私有LAN IP即可。
- 由於資料包來回都需要經過排程器,因此,要開啟核心轉發net.ipv4.ip_forward=1,當然也包括iptables防火牆的forward功能(DR和TUN模式不需要)。
1.6.2 TUN模式-(瞭解即可)
增加一個IP頭部。通過IP隧道進行通訊(可以跨網段找到RS節點)
TUN模式特點小結:
- 負載均衡器通過把請求的報文通過IP隧道的方式轉發至真實伺服器,而真實伺服器將響應處理後直接返回給客戶端使用者。
- 由於真實伺服器將響應處理後的報文直接返回給客戶端使用者,因此,最好RS有一個外網IP地址,這樣效率才會更高。理論上:只要能出網即可,無需外網IP地址。
- 由於排程器LB只處理入站請求的報文。因此,此集群系統的吞吐量可以提高10倍以上,但隧道模式也會帶來一定得系統開銷。TUN模式適合LAN/WAN。
- TUN模式的LAN環境轉發不如DR模式效率高,而且還要考慮系統對IP隧道的支援問題。
- 所有的RS伺服器都要繫結VIP,抑制ARP,配置複雜。
- LAN環境一般多采用DR模式,WAN環境可以用TUN模式,但是當前在WAN環境下,請求轉發更多的被haproxy/nginx/DNS排程等代理取代。因此,TUN模式在國內公司實際應用的已經很少。跨機房應用要麼拉光纖成區域網,要麼DNS排程,底層資料還得同步。
- 直接對外的訪問業務,例如: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節點都有一塊網絡卡連在同一物理網段上,即必須在同一個區域網環境。
只修改目標MAC地址,通過MAC找到RS節點(無法跨網段找到RS節點)
DR模式特點小結:
- 通過在排程器LB上修改資料包的目的MAC地址實現轉發。(源IP地址仍然是CIP,目的IP地址仍然是VIP)
- 請求的報文經過排程器,而RS響應處理後的報文無需經過排程器LB,因此,併發訪問量大時使用效率很高(和NAT模式相比)
- 因DR模式是通過MAC地址的改寫機制實現的轉發,因此,所有RS節點和排程器LB只能在一個區域網LAN中(缺點)
- RS節點的預設閘道器不需要是排程器LB的DIP,而直接是IDC機房分配的上級路由器的IP(這是RS帶有外網IP地址的情況),理論講:只要RS可以出網即可,不是必須要配置外網IP
- 由於DR模式的排程器僅進行了目的MAC地址的改寫,因此,排程器LB無法改變請求的報文的目的埠(缺點)
- 當前,排程器LB支援幾乎所有的UNIX,LINUX系統,但目前不支援WINDOWS系統。真實伺服器RS節點可以是WINDOWS系統。
- 總的來說DR模式效率很高,但是配置也較麻煩,因此,訪問量不是特別大的公司可以用haproxy/nginx取代之。這符合運維的原則:簡單,易用,高效。日2000W PV或併發請求1萬以下都可以考慮用haproxy/nginx(LVS NAT模式)
- 直接對外的訪問業務,例如:Web服務做RS節點,RS最好用公網IP地址。如果不直接對外的業務,例如:MySQl,儲存系統RS節點,最好只用內部IP地址。
1.6.4 FULLNAT模式-(瞭解即可)
淘寶的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專案介紹 |
|
LVS叢集的體系結構 |
|
LVS叢集中的IP負載均衡技術 |
|
LVS叢集的負載排程 |
二,手動實現LVS的負載均衡功能(DR模式)
2.1 安裝LVS軟體
2.1.1 LVS應用場景說明
1)資料庫及memcache等對內業務的負載均衡環境
管理IP地址 |
角色 |
備註 |
10.1.1.141 |
LVS排程器(Director) |
對外提供服務的VIP為10.1.1.240 |
10.1.1.142 |
RS1(真實伺服器) |
|
10.1.1.143 |
RS2(真實伺服器) |
特別提示:上面的環境為內部環境的負載均衡模式,即LVS服務是對內部業務的,如資料庫及memcache等的負載均衡
2)web服務或web cache等負載均衡環境
外部IP地址 |
內部IP地址 |
角色 |
備註 |
|
10.1.1.141 |
LVS排程器(Director) |
對外提供服務的VIP為10.1.1.240 |
|
10.1.1.142 |
RS1(真實伺服器) |
|
|
10.1.1.143 |
RS2(真實伺服器) |
提示:
這個表格一般是提供Web或Web cache負載均衡的情況,此種情況特點為雙網絡卡環境。這裡把192.168.0.0/24假設為內網絡卡,192.168.200.0/24假設為外網絡卡。
2.1.2 實驗一概述
內部IP(eth0) |
外部IP(eth1) |
角色 |
備註 |
10.1.1.141 |
無 |
LVS負載均衡器 |
VIP: 10.1.1.240 閘道器為: 10.1.1.150 |
10.1.1.142 |
無 |
Web01節點 |
閘道器為:10.1.1.150 |
10.1.1.143 |
無 |
Web02節點 |
閘道器為:10.1.1.150 |
10.1.1.144 |
無 |
內網客戶端 |
閘道器為:10.1.1.150 |
|
192.168.1.201 |
外網客戶端 |
不配閘道器 |
10.1.1.150 |
192.168.1.201 |
閘道器型防火牆 |
雙網絡卡均無閘道器 |
2.1.3 兩臺Web配置簡單的http服務
為了方便,我們可以用yum簡單裝一個apache提供httpd服務進行測試,過程略。
2.1.4 開始安裝LVS
以下的安裝都是在LVS LB 10.1.141上
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)安裝準備命令
[[email protected] ~]# lsmod | grep ip_vs
[[email protected] ~]# mount /dev/sr0 /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
[[email protected] ~]# yum -y install kernel-devel
[[email protected] ~]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64/
drwxr-xr-x 22 root root 4096 Jan 3 02:29 /usr/src/kernels/2.6.32-431.el6.x86_64/
[[email protected] ~]# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux
[[email protected] ~]# ll -d /usr/src/linux/
drwxr-xr-x 22 root root 4096 Jan 3 02:29 /usr/src/linux/
[[email protected] ~]# ll /usr/src/
total 12
drwxr-xr-x. 2 root root 4096 Sep 23 2011 debug
drwxr-xr-x. 12 501 games 4096 Oct 2 21:39 httpd-2.2.9
drwxr-xr-x. 3 root root 4096 Jan 3 02:29 kernels
lrwxrwxrwx 1 root root 39 Jan 3 02:31 linux -> /usr/src/kernels/2.6
.32-431.el6.x86_64/
特別注意:
此ln命令的連結路徑要和uname -r輸出結果核心版本對應,工作中如果做安裝虛擬化可能有多個核心路徑
如果沒有/usr/src/kernels/2.6.32-431.el6.x86_64/路徑,很可能是因為缺少kernel-devel軟體包。可通過yum進行安裝
centos5.x版本不能用ipvs1.26
3)安裝lvs命令:
[[email protected] ~]# yum -y install createrepo
[[email protected] ~]# ls
anaconda-ks.cfg install.log ipvsadm-1.26.tar.gz
httpd-2.2.9.tar.gz install.log.syslog rpm
[[email protected] ~]# cd rpm/
[[email protected] rpm]# createrepo -v .
[[email protected] ~]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# vim CentOS-Media.repo
[[email protected] yum.repos.d]# cat CentOS-Media.repo | grep -v "#"
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[rpm]
name=rpm
baseurl=file:///root/rpm/
gpgcheck=0
enabled=1
[[email protected] yum.repos.d]# yum -y clean all && yum makecache
[[email protected] rpm]# yum -y install libnl* popt*
[[email protected] ~]# ls
anaconda-ks.cfg install.log ipvsadm-1.26.tar.gz
httpd-2.2.9.tar.gz install.log.syslog rpm
[[email protected] ~]# tar xf ipvsadm-1.26.tar.gz -C /usr/src
[[email protected] ~]# cd /usr/src/ipvsadm-1.26/
[[email protected] ipvsadm-1.26]# make && make install
[[email protected] ipvsadm-1.26]# which ipvsadm
/sbin/ipvsadm
[[email protected] ipvsadm-1.26]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[[email protected] ipvsadm-1.26]# /sbin/ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[[email protected] ipvsadm-1.26]# lsmod | grep ip_vs
ip_vs 125220 0
libcrc32c 1246 1 ip_vs
ipv6 317340 270 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_
defrag_ipv6
出現這個內容就表示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)
[[email protected] ~]# ifconfig eth0:0 10.1.1.240/24
[[email protected] ~]# ifconfig eth0:0
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:64:FB:85
inet addr:10.1.1.240 Bcast:10.1.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
(2)手工執行配置新增LVS服務並增加兩臺RS
[[email protected] ~]# ipvsadm -C
[[email protected] ~]# ipvsadm -A -t 10.1.1.240:80 -s rr
[[email protected] ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.240:http rr
[[email protected] ~]# ipvsadm -a -t 10.1.1.240:80 -r 10.1.1.142:80 -g -w 1
[[email protected] ~]# ipvsadm -a -t 10.1.1.240:80 -r 10.1.1.143:80 -g -w 1
(3)檢視lvs配置結果
[[email protected] ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.240:http rr
-> 10.1.1.142:http Route 1 0 0
-> 10.1.1.143:http Route 1 0 0
(4)ipvs配置刪除方法
- ipvsadm -D -t 192.168.0.240:80 -s rr #刪除虛擬路由主機
- ipvsadm -d -t 192.168.0.240:80 -r 192.168.0.223:80 #刪除RS節點
此時,可以開啟瀏覽器訪問http://10.1.1.240體驗結果,如果沒意外,是無法訪問的。(RS將包丟棄了)
2.2.2 手工在RS端繫結
在NginxWebB上操作
[[email protected] ~]# ifconfig lo:0 10.1.1.240/32 up
[[email protected]~]# ifconfig lo:0
lo:0 Link encap:Local Loopback
inet addr:10.1.1.240 Mask:0.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
在NginxWebA上操作
[[email protected] ~]# ifconfig lo:0 10.1.1.240/32 up
[[email protected] ~]# ifconfig lo:0
lo:0 Link encap:Local Loopback
inet addr:10.1.1.240 Mask:0.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
2.2.3 瀏覽器測試LVS轉發效果
注意:
在測試時候你會發現重新整理看的都是同一個RS節點
這是因為瀏覽器的快取問題
等一段時間以後,重新整理就會重新負載均衡到新RS節點了
2.2.4 關於DR模式RS節點的ARP抑制的問題
- 因為在DR模式下,RS節點和LVS同處一個區域網網段內。
- 當閘道器通過ARP廣播試圖獲取VIP的MAC地址的時候
- LVS和節點都會接收到ARP廣播並且LVS和節點都綁定了10.1.1.240這個VIP,所以都會去響應閘道器的這個廣播,導致衝突現象。
- 因此,我們需要對RS節點做抑制ARP廣播的措施。
[[email protected] ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[[email protected] ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[[email protected] ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[[email protected] ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
[[email protected] ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[[email protected] ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[[email protected] ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[[email protected] ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
用命令curl做測試
[[email protected]內網Client ~]# echo "10.1.1.240 www.yunjisuan.com" >> /etc/hosts
[[email protected]內網Client ~]# curl www.yunjisuan.com
10.1.1.142 www.yunjisuan.com
[[email protected]內網Client~]# curl www.yunjisuan.com
10.1.1.143 www.yunjisuan.com
實現了負載均衡
[[email protected] ~]# echo "10.1.1.240 www.yunjisuan.com" >> /etc/hosts
但是我們發現讓LVS自己curl自己,就會卡那裡,為什麼??
因為現在是在LVS上,但是DR模式的特點就是不會再回LVS了,所以在LVS那裡是不行的
2.2.5 配置閘道器型防火牆
防火牆的雙網絡卡都不要設定閘道器,因為自己的就是閘道器
ifup eth1
外網Client網絡卡資訊
配置完之後重啟網路服務
service network reload
特別提示:
NginxWebA,NginxWebB,LVS負載均衡器,以及內網Client均將閘道器設定成閘道器型防火牆的eth0:10.1.1.150
2.2.6 配置內網客戶端
內網客戶端用於模擬lvs應用於內網的負載均衡情況
比如lvs資料庫讀負載均衡,比如lvs memcached快取組負載均衡
由於這型別的負載均衡請求都是由內網伺服器發起,因此用內網客戶端來模擬
從上面可以看出,內網客戶端模擬訪問lvs負載均衡器,成功
2.2.7 配置外網客戶端
外網客戶端模擬的是lvs轉發外網使用者訪問需求給RS節點處理的情況
模擬外網客戶端,要求客戶端不能配置任何閘道器
[[email protected] ~]# ifconfig eth0:0 10.1.1.240/24 up
[[email protected] ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.240:http rr
-> 10.1.1.142:http Route 1 0 0
-> 10.1.1.143:http Route 1 0 0
[[email protected] ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.240:80 rr
-> 10.1.1.142:80 Route 1 0 0
-> 10.1.1.143:80 Route 1 0 0
[[email protected] ~]# ifconfig lo:0 10.1.1.240/32 up
[[email protected] ~]# ifconfig lo:0 10.1.1.240/32 up
由於外網客戶端要訪問內網的LVS需要經過閘道器防火牆的跳轉,因此需要在防火牆伺服器上做iptables的DNAT,配置如下:
[[email protected] ~]# iptables -t nat -A PREROUTING -d 192.168.1.200 -p tcp --dport 80 -i eth1 -j DNAT --to-destination 10.1.1.240:80
[[email protected] ~]# vim /etc/sysctl.conf
[[email protected] ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
進行外網客戶端訪問LVS負載均衡器測試
[[email protected]外網Client ~]# echo "192.168.1.200 www.yunjisuan.com" >> /etc/hosts
[[email protected]外網Client ~]# curl www.yunjisuan.com
10.1.1.143 www.yunjisuan.com
[[email protected]外網Client ~]# curl www.yunjisuan.com
10.1.1.142 www.yunjisuan.com
[[email protected]外網Client ~]# curl www.yunjisuan.com
10.1.1.143 www.yunjisuan.com
[[email protected]外網Client ~]# curl www.yunjisuan.com
10.1.1.142 www.yunjisuan.com
訪問防火牆的外網網絡卡IP,經過iptables的跳轉訪問到了內網的LVS排程器,進而返回Web節點處理結果。
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負載均衡器端自動配置指令碼:
2.4.2 RS節點Web伺服器端自動配置指令碼
三,企業LVS負載均衡高可用最優方案(LVS+Keepalived)
3.1 實驗二概述
內部IP(eth0) |
外部IP(eth1) |
角色 |
備註 |
10.1.1.141 |
無 |
LVS負載均衡器(主) |
VIP:10.1.1.240 |
10.1.1.140 |
無 |
LVS負載均衡器(備) |
VIP:10.1.1.250 |
10.1.1.142 |
無 |
Web01節點 |
|
10.1.1.143 |
無 |
Web02節點 |
|
10.1.1.144 |
無 |
內網客戶端 |
3.2 LVS負載均衡器主和備安裝LVS軟體
先給主再新增一個網路介面卡(網絡卡),然後克隆LVS主當做LVS備
[[email protected] ~]# cd /etc/sysconfig/network-scripts/
[[email protected] network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[[email protected] network-scripts]# vim ifcfg-eth1
[[email protected] network-scripts]# ifdown eth1;ifup eth1
[[email protected] network-scripts]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=10.1.1.141
NETMASK=255.255.255.0
GATEWAY=10.1.1.150
[[email protected] network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.1.50
NETMASK=255.255.255.0
[[email protected] network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[[email protected] network-scripts]# vim ifcfg-eth1
[[email protected] network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.1.100
NETMASK=255.255.255.0
[[email protected] network-scripts]# ifdown eth1;ifup eth1
3.3 兩臺Web伺服器安裝Web服務
過程略
3.4 LVS負載均衡器主和備安裝Keepalived軟體
[[email protected] ~]# yum -y install keepalived
3.5 僅實現LVS負載均衡器主和備的keepalived高可用功能
LVS負載均衡器主的keepalived配置檔案內容如下
[[email protected] ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_01
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 55
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.1.240/24 dev eth0 label eth0:240
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth1
virtual_router_id 56
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.1.250/24 dev eth0 label eth0:250
}
}
virtual_server 10.1.1.240 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
real_server 10.1.1.142 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.1.1.143 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 10.1.1.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
real_server 10.1.1.142 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.1.1.143 80 {
weight 1
TCP_CHECK {
connect_timeout 3
&nbs