架构图:
多目标的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