一、TUN模式集群
在NAT模式中,由于所有的请求及响应的数据包都需要经过LVS调度器,如果后端的服务器数量较大,则调度器就会成为整个集群环境的瓶颈。
而请求包的大小往往小于响应包,因为响应数据包中包含有客户需要的具体数据,所以TUN模式的思路就是将请求与响应分离,让调度器仅处理请求,让真实服务器将响应数据包直接返回给客户端。
在TUN模式中有一个IP隧道,这个IP隧道是一种数据包封装技术,可以将原始数据包封装并添加新的包头(包头内容包括新的源地址和端口,新的目标地址和端口),从而实现将一个目标为调度器VIP地址的数据包封装,通过隧道转发给后端的真实服务器,通过将客户端发往调度器的原始数据封装,并在其基础上添加新的包头(修改目标地址为调度器选择出来的真实服务器的地址及端口),TUN模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据
工作原理
IP隧道是指一种可在两个网络间用网际协议进行通信的通道。在该通道里,会先封装其他网络协议的数据包,之后再传输信息。
在TUN工作模式下,Client向Director(负载均衡器)发送请求报文,报文到达Director内核空间不修改请求报文的ip首部,而是通过在原有ip首部[CIP-VIP]之外,再封装一个ip首部[DIP-RIP],RS收到报文后发现是自己的IP地址,就会将报文接受下来,拆除最外层的IP后,会发现里面还有一层IP首部,而且目标地址是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成滞后,通过lo接口送给ens33网卡,然后向外传递。此时的源IP地址为VIP,目标IP为CIP。
特点
1、RIP、VIP、DIP全是公网地址
2、RS的网关不会也不可能指向DIP(负载均衡服务器IP)
3、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
4、不支持端口映射
5、RS的系统必须支持隧道
优点: 负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点: 隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
二、实战案例
案例需求
部署基于LVS TUN模式的Web集群
实验环境
五台安装CentOS7的虚拟机一台测试机,一台LVS分发器,一台路由器,两台web服务器
注意事项
- 关闭selinux
- 关闭防火墙
- 停止libvirtd.service服务
实验拓扑图
实验步骤
a、配置路由,开启转发
ens33=192.168.1.1
ens160=192.168.2.1
[root@route ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
b、配置客户端
ens33=192.168.1.200
[root@client ~]# route add default gw 192.168.1.1
c、LVS负载均衡器设置
ens33=192.168.2.200
ens37=192.168.2.100(VIP)
[root@lvs ~]# route add default gw 192.168.2.1
[root@lvs ~]# ipvsadm -A -t 192.168.2.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.220:80 -i
[root@lvs ~]# ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.210:80 -i
d、RS1&RS2设置
RS1=192.168.2.220
RS2=192.168.2.210
添加VIP并设置网关,调整内核参数
RS1
[root@rs1 ~]# route add default gw 192.168.2.1
[root@rs1 ~]# ifconfig tunl0 192.168.2.100 netmask 255.255.255.255 up
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs1 ~]# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
RS2
[root@rs2 ~]# route add default gw 192.168.2.1
[root@rs2 ~]# ifconfig tunl0 192.168.2.100 netmask 255.255.255.255 up
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs2 ~]# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
安装web服务,生成测试页面
RS1
[root@rs1 ~]# yum install httpd -y
[root@rs1 ~]# echo "rs1" > /var/www/html/index.html
[root@rs1 ~]# systemctl start httpd.service
RS2
[root@rs2 ~]# yum install httpd -y
[root@rs2 ~]# echo "rs2" > /var/www/html/index.html
[root@rs2 ~]# systemctl start httpd.service
e、客户端测试
[root@client ~]# elinks http://192.168.2.100 --dump
rs2
[root@client ~]# elinks http://192.168.2.100 --dump
rs1
[root@client ~]# elinks http://192.168.2.100 --dump
rs2
[root@client ~]# elinks http://192.168.2.100 --dump
rs1