架構圖:
多目標的DNAT(iptables):它通過修改請求報文的目標IP地址(同時可能會修改目標端口 )至挑選出某RS的RIP地址實現轉發。
(1)RS和DIP應該使用私網地址,且RS的網關要指向DIP;
(2)請求和響應報文都要經由director轉發,極高負載場景中,director可能成爲系統瓶頸。
(3)支持端口映射
(4)RS可以使用任意OS
(5)RS的RIP和Director的DIP必須在同一網段。
NAT模式的使用流程:
1.用戶請求VIP(也可以說是CIP請求VIP)
2.Director Server 收到用戶的請求後,發現源地址爲CIP請求的目標地址爲VIP,那麼Director Server會認爲用戶請求的是一個集羣服務,那麼Director Server 會根據此前設定好的調度算法將用戶請求負載給某臺Real Server。
假如說此時Director Server 根據調度的結果會將請求分攤到RealServer1上去,那麼Director Server 會將用戶的請求報文中的目標地址,從原來的VIP改爲RealServer1的IP,然後再轉發給RealServer1
3.此時RealServer1收到一個源地址爲CIP目標地址爲自己的請求,那麼RealServer1處理好請求後會將一個源地址爲自己目標地址爲CIP的數據包通過Director Server 發出去,
4.當Driector Server收到一個源地址爲RealServer1 的IP 目標地址爲CIP的數據包,此時Driector Server 會將源地址修改爲VIP,然後再將數據包發送給用戶
LVS-NAT的性能瓶頸:
在LVS/NAT的集羣系統中,請求和響應的數據報文都需要通過負載調度器(Director),當真實服務器(RealServer)的數目在10臺和20臺之間時,負載調度器(Director)將成爲整個集羣系統的新瓶頸。
大多數Internet服務都有這樣的特點:請求報文較短而響應報文往往包含大量的數據。如果能將請求和響應分開處理,即在負載調度器(Director)中只負責調度請求而響應直接(RealServer)返回給客戶,將極大地提高整個集羣系統的吞吐量。
機器規劃:
lvs服務器:100.64.227.86(ens33,外網地址),192.168.20.1(ens37,內網地址)
後端服務器1:192.168.20.11(ens33,內網地址)
後端服務器2:192.168.20.12(ens33,內網地址)
部署步驟:
在RealServer上部署httpd服務並測試,兩個節點一致,將頁面內容設置的不一樣,分別爲web1和web2
#安裝nginx服務
yum install nginx -y
echo "web1" > /usr/share/nginx/html/index.html
systemctl start nginx
#測試nginx服務
curl http://lcoalhost
web1
在Director上部署ipvs服務並測試:
[root@LVS ~]# ipvsadm -A -t 100.64.227.86:80 -s rr #定義一個集羣服務
[root@LVS ~]# ipvsadm -a -t 100.64.227.86:80 -r 192.168.20.11 -m #添加RealServer並指派調度算法爲NAT
[root@LVS ~]# ipvsadm -a -t 100.64.227.86:80 -r 192.168.20.11 -m #添加RealServer並指派調度算法爲NAT
[root@LVS ~]# ipvsadm -L -n #查看ipvs定義的規則列表
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 100.64.227.86:80 rr
-> 192.168.20.11:80 Masq 1 0 0
-> 192.168.20.12:80 Masq 1 0 0
[root@LVS ~]# cat /proc/sys/net/ipv4/ip_forward #查看Linux是否開啓路由轉發功能
[root@LVS ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #啓動Linux的路由轉發功能
[root@LVS ~]# cat /proc/sys/net/ipv4/ip_forward
測試訪問http頁面:
[root@LVS ~]# curl http://100.64.227.86/index.html
web1 #第一次是web2
[root@LVS ~]# curl http://100.64.227.86/index.html
web2 #第二次是web1
[root@LVS ~]# curl http://100.64.227.86/index.html
web1 #第三次是web1
[root@LVS ~]# curl http://100.64.227.86/index.html
web2 #第四次是web2
永久保存LVS規則並恢復:
[root@LVS ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.s1
模擬清空ipvsadm規則來恢復:
[root@LVS ~]# ipvsadm -C
[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
[root@LVS ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.s1
[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 100.64.227.86:80 wrr
-> 192.168.20.11:80 Masq 3 0 0
-> 192.168.20.12:80 Masq 1 0 0