LVS負(fù)載均衡之NAT模式
目錄
1、LVS的NAT模式介紹
2、LVS的NAT模式部署過程
2.1 配置lvs服務(wù)器為路由器
2.2 web服務(wù)器準(zhǔn)備
2.3 lvs服務(wù)器配置
2.4 keepalived結(jié)合lvs_NAT模式

本文來自我的博客舊文章~
1、LVS的NAT模式介紹
參考自官網(wǎng):http://www.linuxvirtualserver.org/zh/lvs3.html
由于IPv4中IP地址空間的日益緊張和安全方面的原因,很多網(wǎng)絡(luò)使用保留IP地址(10.0.0.0/255.0.0.0、 172.16.0.0/255.128.0.0和192.168.0.0/255.255.0.0)[64, 65, 66]。這些地址不在Internet上使用,而是專門為內(nèi)部網(wǎng)絡(luò)預(yù)留的。當(dāng)內(nèi)部網(wǎng)絡(luò)中的主機(jī)要訪問Internet或被Internet訪問時(shí),就需要 采用網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation, 以下簡稱NAT),將內(nèi)部地址轉(zhuǎn)化為Internets上可用的外部地址。NAT的工作原理是報(bào)文頭(目標(biāo)地址、源地址和端口等)被正確改寫后,客戶相信 它們連接一個(gè)IP地址,而不同IP地址的服務(wù)器組也認(rèn)為它們是與客戶直接相連的。由此,可以用NAT方法將不同IP地址的并行網(wǎng)絡(luò)服務(wù)變成在一個(gè)IP地址 上的一個(gè)虛擬服務(wù)。VS/NAT的體系結(jié)構(gòu)如圖所示。在一組服務(wù)器前有一個(gè)調(diào)度器,它們是通過Switch/HUB相連接的。這些服務(wù)器 提供相同的網(wǎng)絡(luò)服務(wù)、相同的內(nèi)容,即不管請求被發(fā)送到哪一臺服務(wù)器,執(zhí)行結(jié)果是一樣的。服務(wù)的內(nèi)容可以復(fù)制到每臺服務(wù)器的本地硬盤上,可以通過網(wǎng)絡(luò)文件系 統(tǒng)(如NFS)共享,也可以通過一個(gè)分布式文件系統(tǒng)來提供。
客戶通過Virtual IP Address(虛擬服務(wù)的IP地址)訪問網(wǎng)絡(luò)服務(wù)時(shí),請求報(bào)文到達(dá)調(diào)度器,調(diào)度器根據(jù)連接調(diào)度算法從一組真實(shí)服務(wù)器中選出一臺服務(wù)器,將報(bào)文的目標(biāo)地址Virtual IP Address改寫成選定服務(wù)器的地址,報(bào)文的目標(biāo)端口改寫成選定服務(wù)器的相應(yīng)端口,最后將修改后的報(bào)文發(fā)送給選出的服務(wù)器。同時(shí),調(diào)度器在連接Hash 表中記錄這個(gè)連接,當(dāng)這個(gè)連接的下一個(gè)報(bào)文到達(dá)時(shí),從連接Hash表中可以得到原選定服務(wù)器的地址和端口,進(jìn)行同樣的改寫操作,并將報(bào)文傳給原選定的服務(wù) 器。當(dāng)來自真實(shí)服務(wù)器的響應(yīng)報(bào)文經(jīng)過調(diào)度器時(shí),調(diào)度器將報(bào)文的源地址和源端口改為Virtual IP Address和相應(yīng)的端口,再把報(bào)文發(fā)給用戶。我們在連接上引入一個(gè)狀態(tài)機(jī),不同的報(bào)文會(huì)使得連接處于不同的狀態(tài),不同的狀態(tài)有不同的超時(shí)值。在TCP連接中,根據(jù)標(biāo)準(zhǔn)的TCP有限狀態(tài)機(jī)進(jìn)行狀態(tài)遷移,這里我們不一一敘述,請參見W. Richard Stevens的《TCP/IP Illustrated Volume I》;在UDP中,我們只設(shè)置一個(gè)UDP狀態(tài)。不同狀態(tài)的超時(shí)值是可以設(shè)置的,在缺省情況下,SYN狀態(tài)的超時(shí)為1分鐘,ESTABLISHED狀態(tài)的超 時(shí)為15分鐘,FIN狀態(tài)的超時(shí)為1分鐘;UDP狀態(tài)的超時(shí)為5分鐘。當(dāng)連接終止或超時(shí),調(diào)度器將這個(gè)連接從連接Hash表中刪除。
這樣,客戶所看到的只是在Virtual IP Address上提供的服務(wù),而服務(wù)器集群的結(jié)構(gòu)對用戶是透明的。對改寫后的報(bào)文,應(yīng)用增量調(diào)整Checksum的算法調(diào)整TCP Checksum的值,避免了掃描整個(gè)報(bào)文來計(jì)算Checksum的開銷。在一些網(wǎng)絡(luò)服務(wù)中,它們將IP地址或者端口號在報(bào)文的數(shù)據(jù)中傳送,若我們只對報(bào)文頭的IP地址和端口號作轉(zhuǎn)換,這樣就會(huì)出現(xiàn)不一致性,服務(wù)會(huì)中斷。所以,針對這些服務(wù),需要編寫相應(yīng)的應(yīng)用模塊來轉(zhuǎn)換報(bào)文數(shù)據(jù)中的IP地址或者端口號。我們所知道有這個(gè)問題的網(wǎng)絡(luò)服務(wù)有FTP、IRC、H.323、 CUSeeMe、Real Audio、Real Video、Vxtreme / Vosiac、VDOLive、VIVOActive、True Speech、RSTP、PPTP、StreamWorks、NTT AudioLink、NTT SoftwareVision、Yamaha MIDPlug、iChat Pager、Quake和Diablo。簡單來說,這種模式借助iptables的nat表來實(shí)現(xiàn)
用戶的請求到分發(fā)器后,通過預(yù)設(shè)的iptables規(guī)則,把請求的數(shù)據(jù)包轉(zhuǎn)發(fā)到后端的rs上去rs需要設(shè)定網(wǎng)關(guān)為分發(fā)器的內(nèi)網(wǎng)ip用戶請求的數(shù)據(jù)包和返回給用戶的數(shù)據(jù)包全部經(jīng)過分發(fā)器,所以分發(fā)器成為瓶頸
在nat模式中,只需要分發(fā)器有公網(wǎng)ip即可,所以比較節(jié)省公網(wǎng)ip資源
缺點(diǎn):擴(kuò)展性有限。高負(fù)載模式下,director可能成為瓶頸
優(yōu)點(diǎn):支持任意操作系統(tǒng),節(jié)點(diǎn)服務(wù)器使用私有IP地址,與負(fù)載調(diào)度器位于同一個(gè)物理網(wǎng)絡(luò),安全性比DR模式和TUN模式要高。
2、LVS的NAT模式部署過程
環(huán)境:
lvs eth0:10.0.0.3 gateway:10.0.0.254 eth1:192.168.1.3
web01 eth0:192.168.1.7 gateway:192.168.1.3
web02 eth0:192.168.1.8 gateway:192.168.1.3
2.1 配置lvs服務(wù)器為路由器
web01和web02只有內(nèi)網(wǎng)卡,配置lvs為路由器使其上網(wǎng)
[root@lvs ~]# vim /etc/sysctl.conf
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@lvs ~]# iptables -F
[root@lvs ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
2.2 web服務(wù)器準(zhǔn)備
在web服務(wù)器上安裝httpd服務(wù)來進(jìn)行模擬,每臺服務(wù)器的web首頁不同,在負(fù)載均衡測試的時(shí)候以便區(qū)分
web01
[root@web01 ~]# yum install -y httpd
[root@web01 ~]# systemctl start httpd.service
[root@web01 ~]# systemctl enable httpd.service
[root@web01 ~]# echo 'web01'> /var/www/html/index.html
[root@web01 ~]# curl 127.0.0.1
web01
web02
[root@web02 ~]# yum install -y httpd
[root@web02 ~]# systemctl start httpd.service
[root@web02 ~]# systemctl enable httpd.service
[root@web02 ~]# echo 'web02'> /var/www/html/index.html
[root@web02 ~]# curl 127.0.0.1
web02
2.3 lvs服務(wù)器配置
[root@lvs ~]# yum install -y ipvsadm #安裝lvs核心管理軟件包
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 10.0.0.3:80 -s rr
[root@lvs ~]# ipvsadm -a -t 10.0.0.3:80 -r 192.168.1.7 -m
[root@lvs ~]# ipvsadm -a -t 10.0.0.3:80 -r 192.168.1.8 -m
參數(shù)說明:
-C --clear清除內(nèi)核虛擬服務(wù)器表中的所有記錄
-A --add-service在內(nèi)核的虛擬服務(wù)器表中添加一條新的虛擬服務(wù)器記錄
-t --tcp-service service-address說明虛擬服務(wù)器提供的是tcp 的服務(wù)
-s --scheduler scheduler使用的調(diào)度算法,調(diào)度算法可以指定以下8種:rr(輪詢),wrr(權(quán)重),lc(最后連接),wlc(權(quán)重),lblc(本地最后連接),lblcr(帶復(fù)制的本地最后連接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延遲),nq(永不排隊(duì))
-a --add-server在內(nèi)核虛擬服務(wù)器表的一條記錄里添加一條新的真實(shí)服務(wù)器記錄。也就是在一個(gè)虛擬服務(wù)器中增加一臺新的真實(shí)服務(wù)器
-r --real-server server-address指定真實(shí)的服務(wù)器[Real-Server:port]
-m --masquerading指定LVS的工作模式為NAT 模式
調(diào)度測試
[root@lvs ~]# curl 10.0.0.3
web01
[root@lvs ~]# curl 10.0.0.3
web02
[root@lvs ~]# 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.0.0.3:80 rr
-> 192.168.1.7:80 Masq 1 0 0
-> 192.168.1.8:80 Masq 1 0 1
-L --list顯示內(nèi)核虛擬服務(wù)器表
-n 不解析端口使用的協(xié)議
2.4 keepalived結(jié)合lvs_NAT模式
配置keepalived增加虛擬ip,從而管理到lvs,可以進(jìn)一步配置為lvs服務(wù)器的高可用
[root@lvs ~]# yum install keepalived -y
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL #表示keepalived服務(wù)器的一個(gè)標(biāo)識
}
vrrp_instance VI_1 { #定義一個(gè)vrrp組,組名唯一
state MASTER #定義改主機(jī)為keepalived的master主機(jī)
interface eth0 #監(jiān)控eth0號端口
virtual_router_id 51 #虛擬路由id號為51,id號唯一,這個(gè)id決定了多播的MAC地址
priority 100 #節(jié)點(diǎn)優(yōu)先級
advert_int 1 #檢查間隔,默認(rèn)為1秒
authentication {
auth_type PASS #認(rèn)證方式,密碼認(rèn)證
auth_pass 1111 #認(rèn)證密碼
}
virtual_ipaddress {
10.0.0.4 #虛擬ip地址
}
}
virtual_server 10.0.0.4 80 { #虛擬主機(jī)設(shè)置
delay_loop 6 #每隔6秒查詢r(jià)ealserver狀態(tài)
lb_algo rr #lvs的調(diào)度算法
lb_kind NAT #lvs的集群模式
persistence_timeout 50 #同一IP的連接50秒內(nèi)被分配到同一臺realserver
protocol TCP #用TCP協(xié)議檢查realserver狀態(tài)
real_server 192.168.1.7 80 { #后端真實(shí)主機(jī)ip
weight 1 #每臺機(jī)器的權(quán)重,0表示不給該機(jī)器轉(zhuǎn)發(fā)請求,直到它恢復(fù)正常
TCP_CHECK { #以下為健康檢查項(xiàng)目
connect_timeout 3 #連接超時(shí)時(shí)間,單位為秒
nb_get_retry 3 #檢測失敗后的重試次數(shù),如果達(dá)到重試次數(shù)仍然失敗,將后端從服務(wù)器池中移除
delay_before_retry 3 #失敗重試的間隔時(shí)間,單位為秒
connect_port 80 #檢查的連接端口
}
}
real_server 192.168.1.8 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
[root@lvs ~]# systemctl start keepalived.service
[root@lvs ~]# 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.0.0.3:80 rr
-> 192.168.1.7:80 Masq 1 0 0
-> 192.168.1.8:80 Masq 1 0 0
TCP 10.0.0.4:80 rr
-> 192.168.1.7:80 Masq 1 0 0
-> 192.168.1.8:80 Masq 1 0 0
這里keepalived服務(wù)啟動(dòng)后,配置的vip也成功實(shí)現(xiàn)了lvs負(fù)載均衡,還需要做的就是在web服務(wù)器上增加輔助ip10.0.0.33即可
