以下实验的实操都是在redhat7.3上
一、LVS/NAT基本原理
1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
3.IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
4. POSTROUTING链通过选路,将数据包发送给Real Server 5. Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP 6. Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为调度器的vip
二、NAT模式优缺点
VS/NAT 的优点是服务器可以运行任何支持 TCP/IP 的操作系统,它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址。
缺点是它的伸缩能力有限, 当服务器结点数目升到 20 时,调度器本身有可能成为系统的新瓶颈,因为在 VS/NAT 中请求和响应报文都需要通过负载调度器。
三、LVS/NAT模式工作流程
NAT模型:地址转换类型,主要是做地址转换,类似于iptables的DNAT类型,它通过多目标地址转换,来实现负载均衡, 一个Director最多负载提供10个Real Server主机
1、client发送request到LVS的VIP上,VIP选择一个Real-server,并记录连接信息到hash表中,然后修改client 的request的目的IP地址为Real-server的地址,将请求发给Real-server;
2、 Real-server收到request包后,发现目的IP是自己的IP,于是处理请求,然后发送reply给LVS;
3、LVS收到reply包后,修改reply包的的源地址为VIP,发送给client;
4、从client来的属于本次连接的包,查hash表,然后发给对应的Real-server。
5、 当client发送完毕,此次连接结束或者连接超时,那么LVS自动从hash表中删除此条记录。
四、LVS/NAT(c client ->DS -> RS->DS->client)实验环境
一台调度器server1,两台后端服务器server2和server3,一台客户端172.25.70.250(私有ip)
第一种方法:如果只有一块网卡可用以下方式:
1.调度器(server1)两个ip;
第二种方法:Load Balance(负载均衡) 双网卡 eth0: 172.25.70.1(对内) eth1: 172.25.0.1 (对外)
以下实验采用的是第二种情况:
环境配置
服务名称 | 作用 |
---|---|
Load Balance(172.25.0.1) /## 对内:172.25.0.1## / 对外(虚拟ip):172.25.70.1 /网关:172.25.70.250 | vs调度器 |
server2(172.25.0.2)/网关:172.25.0.1 | rs真实后端服务器 |
server3(172.25.0.2)/网关:172.25.0.1 | rs真实后端服务器 |
客户端(172.25.70.250) | 测试 |
在server1(调度器)上
添加网卡:
[root@server1 ~]#cd /etc/sysconfig/network-scripts
[root@server1 ~]#vim ifcfg-eth1 #配置ip和网关
[root@server1 ~]#vim ifcfg-ens3
[root@server1 ~]# systemctl restart network
[root@server1 ~]# ip addr show
[root@server1 ~]# vim /etc/sysctl.conf #将路由转换功能打开
net.ipv4.ip_forward = 1
[root@server1 ~]# sysctl -p #生效
net.ipv4.ip_forward = 1
[root@server1 ~]# modprobe iptable_nat #加载nat模块
`注`:如果不加载此模块,也可以在第一次访问时成功,但是会在再次访问时出现延迟过长,或访问超时现象
[root@server1 ~]# ipvsadm -A -t 172.25.70.1:80 -s rr #添加轮询算法
[root@server1 ~]# ipvsadm -a -t 172.25.70.1:80 -r 172.25.0.2:80 -m
[root@server1 ~]# ipvsadm -a -t 172.25.70.1:80 -r 172.25.0.3:80 -m
[root@server1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.70.1:80rr
-> 172.25.0.2:80 Masq 1 0 0
-> 172.25.0.3:80 Masq 1 0 0
[root@server1 ~]# ipvsadm-save services #保存规则
-A -t server1:http -s rr
-a -t server1:http -r 172.25.0.2:http -m -w 1
-a -t server1:http -r 172.25.0.3:http -m -w 1
在server2(后端服务器):
[root@server2 ~]# cd /etc/sysconfig/network-scripts
[root@server2 ~]# vim ifcfg-ens3 #配置ip和网关
[root@server2 ~]# systemctl restart network #配置完网络,重启服务
[root@server2 ~]# systemctl restart httpd #重启httpd
[root@server2 ~]# netstat -tnlp #查看80端口是否打开
在server3(后端服务器)上:
[root@server3 ~]# cd /etc/sysconfig/network-scripts
[root@server3 ~]# vim ifcfg-ens3 #配置ip和网关
[root@server3 ~]# systemctl restart network #配置完网络,重启服务
[root@server3 ~]# systemctl restart httpd #重启httpd
[root@server3 ~]# netstat -tnlp #查看80端口是否打开
测试
server2和server3进行轮询
[root@foundation70 ~]# curl 172.25.70.1
server3-www-vhost.example.com
[root@foundation70 ~]# curl 172.25.70.1
server2.example.com
[root@foundation70 ~]# curl 172.25.70.1
server3-www-vhost.example.com
[root@foundation70 ~]# curl 172.25.70.1
server2.example.com
[root@foundation70 ~]#
在server1上查看:
[root@server1 ~]# ipvsadm -ln #查看server2和server3都被调用了两次