玩转LVS之NAT,DR,TUN模型

来源:互联网 发布:prime输入法知乎 编辑:程序博客网 时间:2024/05/16 09:08
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://leejia.blog.51cto.com/4356849/834223

 首先,我们先来了解一下LVS吧!

LVS的全称Linux vitual system,是由目前阿里巴巴的著名工程师章文嵩博士开发的一款开源软件。LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的realserver(真正提供服务的主机),从而实现集群环境中的负载均衡。
LVS的核心组件ipvs工作在kernel中,是真正的用于实现根据定义的集群转发规则把客户端的请求转发到特定的realserver。而另一个组件ipvsadm是工作在用户空间的一个让用户定义ipvs规则的工具。故我们只要在server上装了ipvsadm软件包就可以定义ipvs规则,而在linux kernel的2.6版本之后kernel是直接支持ipvs的。
注:由于ipvs是接受netfilter五个钩子函数的中的local_in函数控制的。故ipvs不能和netfilter的一些控制规则同时使用。
 
好了,进入正题,以下是今天所分享的主要内容:
LVS三种模型LVS-NAT2,LVS-DR,LVS-TUN的工作原理及环境搭建。
 
实验环境:redhat enterprise 5.4+ipvsadm+httpd(用于提供web服务)
 
这些为LVS环境搭建中的一些专业名词:
RIP:realserver的ip地址
DIP:director的ip地址
CIP:用户客户端的ip地址
VIP:虚拟ip地址(这个ip地址是用户请求的提供服务的ip地址)
 
一,LVS-NAT
工作原理图: 

工作原理:基于NAT机制实现。当用户请求到达director之后,director将请求报文的目标地址(即VIP)改成选定的realserver地址,同时将报文的目标端口也改成选定的realserver的相应端口,最后将报文请求发送到指定的realserver。在服务器端得到数据后,realserver将数据返给director,而director将报文的源地址和源端口改成VIP和相应端口,然后把数据发送给用户,完成整个负载调度过程。
特点:
1,所有的realserver和director要在同一个网段内
2,VIP生产环境为公网ip,而DIP用于和rs通信
3,director同时处理请求和应答数据包
4,realserver的网关要指向DIP
5,可以实现端口映射
6,realserver可以是任意操作系统
7,director很可能成为系统性能瓶颈
 
实验拓扑:

Director这台server为双网卡eth0用于客户端的请求,而eth1用于和realserver通信。
客户端通过请求172.16.30.1提供web服务。请根据拓扑配置好网络。
 
1,rs1上的配置:
配置好rs1上的yum源,可以指向我们的系统安装光盘。
rs1是作为一台realserver使用,故需要安装httpd提供web服务:
# yum -y install httpd
 
添加测试页:
# cd /var/www/html
# vim index.html
添加如下内容:
jia's server1
 
启动httpd服务:
# service httpd start
 
测试rs1上的web服务:

路由的配置:
# route add default gw 192.168.1.1
 
 
2,rs2上的配置:
配置好rs2上的yum源,可以指向我们的系统安装光盘。
rs2是作为一台realserver使用,故需要安装httpd提供web服务:
# yum -y install httpd
 
添加测试页:
# cd /var/www/html
# vim index.html
添加如下内容:
jia's server2
 
启动httpd服务:
# service httpd start
 
测试rs2上的web服务:

路由的配置:
# route add default gw 192.168.1.1
 
3,director上的配置:
安装ipvsadm软件包:(ipvsadm在安装光盘的Cluster目录中,请确认yum源指向)
# yum -y install ipvsadm
 
打开本机的路由转发功能:
先查看路由转发是否打开:
# cat /proc/sys/net/ipv4/ip_forward 
如果显示值为1,则打开,可以跳过此步骤。如果值为0,则开启此功能。
开启路由转发:
# sysctl -w net.ipv4.ip_forward=1  (临时生效)
可以修改配置文件使其永久生效:
# vim /etc/sysctl.conf
修改net.ipv4.ip_forward = 0此行为net.ipv4.ip_forward = 1即可
 
使用ipvsadm对ipvs进行配置,由于ipvs的十种算法中,wlc算法是最优算法,也是默认算法,故我们仅以此为例进行配置:
# ipvsadm -A -t 172.16.30.1:80 -s wlc
# ipvsadm -a -t 172.16.30.1:80 -r 192.168.1.10 –m –w 3
# ipvsadm -a -t 172.16.30.1:80 -r 192.168.1.11 –m –w 1
查看配置是否生效:
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.30.1:80 wlc
  -> 192.168.1.11:80              Masq    1      0          0         
  -> 192.168.1.10:80              Masq    3      0          0
 
ok,我们的LSV-NAT配置好了,下面我们来对其进行测试:
我们可以多刷新页面获取效果或换个浏览器。
 

为了更好的演示效果,我们可以用另一台server对httpd服务进行压力测试:
# ab -c 100 -n 10000 http://172.16.30.1/index.html  (ab工具是apache自带压力测试工具)
 
在director上查看请求响应结果:
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.30.1:80 wlc
  -> 192.168.1.11:80              Masq    1      16         4194      
  -> 192.168.1.10:80              Masq    3      62         3997
由于我们使用的是wlc算法,且权重比为3:1,故活动连接数的比几乎也为3:1。使用不同的调度算法,显示的结果是不一样的。
 
 
二,LVS-DR(生产环境下应用最为广泛)
工作原理图:

 
工作原理:基于直接路由来实现。当一个client发送一个WEB请求到VIP,LVS服务器根据VIP选择对应的real-server的Pool,根据算法,在Pool中选择一台 Real-server,LVS在hash表中记录该次连接,然后将client的请求包发给选择的Real-server,最后选择的Real- server把应答包直接传给client;当client继续发包过来时,LVS根据更才记录的hash表的信息,将属于此次连接的请求直接发到刚才选 择的Real-server上;当连接中止或者超时,hash表中的记录将被删除。DR模式在转发client的包时,只修改了包目的MAC地址为选定的Real-server的mac地址,所以如果LVS和Real-server在不同的广播域内,那么Real-server就没办法接收到转发的包。这个方式是三种调度中性能最好的,也是我们生产环境中使用最多的。 
特点:
1,集群节点和director必须在一个物理网络内
2,RIP可以使用公网地址或私有地址
3,director仅处理入站请求
4,集群节点网关不指向director,故出站不经过director
5,不支持端口映射
6,大多数操作系统可以作为realserver,要支持隔离arp广播
7,director服务器的压力比较小
 
实验拓扑:

 
director只需要一个网卡eth0即可,把VIP配置在eth0的别名eth0:0上即可。我们通过VIP地址192.168.1.1给用户提供web服务。
注:生产环境下VIP应该是一个公网ip地址
 
1,rs1上的配置:
配置好rs1上的yum源,可以指向我们的系统安装光盘。
rs1是作为一台realserver使用,故需要安装httpd提供web服务:
# yum -y install httpd
 
添加测试页:
# cd /var/www/html
# vim index.html
添加如下内容:
jia's server1
 
启动httpd服务:
# service httpd start
 
由于DR模型在内网中基于mac地址进行转发请求数据包,并且我们的director和realserver都配有一个VIP地址,故我们要限制realserver的arp通告和arp响应级别,以保证我们数据包能到达director指定要发送的realserver。而我们的linux系统提供了这样的功能,通过修改kernel的两个参数来控制arp的级别。
arp_announce = 2 表示不使用ip包的源地址来设置ARP请求的源地址,,而由系统来选择最好的接口来发送。
arp_ignore = 1 表示如果arp请求的目的地址,不是该arp请求包进入的接口的ip地址,那么不回应。
配置如下:
# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
 
配置lo别名,并且定义lo:0的广播域为本网卡,使VIP不能向网络内发送广播,以防止网络出现混乱:
# ifconfig lo:0 192.168.1.1 broadcast 192.168.1.1 netmask 255.255.255.255
 
 
测试rs1上的web服务:

 
rs2上的配置:
和rs1上的配置完全一样,这里不再阐述。
测试rs2的web服务:

 
 
director上的配置:
配置好yum源,安装ipvsadm 
# yum install ipvsadm
# ifconfig eth0:0 192.168.1.1 broadcast 192.168.1.1 netmask 255.255.255.255
# route add -host 192.168.1.1 dev eth0:0
# echo 1 > /proc/sys/net/ipv4/ip_forward
以上的配置我们上边已经阐述配置理由
 
配置ipvs集群服务:
# ipvsadm -A -t 192.168.1.1:80 -s wlc
# ipvsadm -a -t 192.168.1.1:80 -r 192.168.1.10 –g –w 10
# ipvsadm -a -t 192.168.1.1:80 -r 192.168.1.11 –g –w 5
 
查看:
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.1:80 wlc
  -> 192.168.1.11:80              Route   5      0          0         
  -> 192.168.1.10:80              Route   10     0          0    
 
好了,LVS-DR模型搭建好了,我们来测试一下:
由于我们制定的调度算法和权重不同,故我们多刷新几次就有效果了。

 
我们同样可以用apache的压力测试工具ab来测试httpd,从而得到调度算法的效果,方法和LVS-NAT的一样,不在阐述。
 
 
三,LVS-TUN
由于LVS-TUN的模型用的不广泛,如果网络不好会有很多瓶颈,一般没有企业使用,故这里不在探讨它的配置过程,只说一下它的工作原理。
 
工作原理图:

  
工作原理:这种方法通过ip隧道技术实现虚拟服务器。
1> client 发送request包到LVS服务器的VIP上。
2> VIP按照算法选择后端的一个Real-server,并将记录一条消息到hash表中,然后将client的request包封装到一个新的IP包里,新IP包的目的IP是Real-server的IP,然后转发给Real-server。
3> Real-server收到包后,解封装,取出client的request包,发现他的目的地址是VIP,而Real-server发现在自己的 lo:0口上有这个IP地址,于是处理client的请求,然后将relpy这个request包直接发给client。
4> 该client的后面的request包,LVS直接按照hash表中的记录直接转发给Real-server,当传输完毕或者连接超时,那么将删除hash表中的记录。
由于通过IP Tunneling 封装后,封装后的IP包的目的地址为Real-server的IP地址,那么只要Real-server的地址能路由可达,Real-server在什么 网络里都可以,这样可以减少对于公网IP地址的消耗,但是因为要处理IP Tunneling封装和解封装的开销,那么效率不如DR模式。
特点:
1,realserver和director可以不在一个物理网络中
2,director要有到realserver的路由
3,director仅处理入站请求
4,realserver的网关不能指向DIP
5,不支持端口映射
6,支持ip隧道功能的操作系统才能作为realserver
 
 
由于需要Real-server支持IP Tunneling,所以设置与DR模式不太一样,LVS不需要设置tunl设备,LVS本身可以进行封装
rs的配置:
只需要配置VIP在tunl设备上即可:(vip:172.16.1.1)
# ifconfig tunl0 172.16.1.1 netmask 255.255.255.255
# ifconfig tunl0
tunl0 Link encap:IPIP Tunnel HWaddr
inet addr:172.16.1.1 Mask:255.255.255.255
UP RUNNING NOARP MTU:1480 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
 
 
 

 

本文出自 “佳” 博客,请务必保留此出处http://leejia.blog.51cto.com/4356849/834223

原创粉丝点击