1、什么是LVS
LVS是linux virtual server的简写linux虚拟服务器,是一个虚拟的服务器集群系统,可以在unix/linux平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立。LVS是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
2、LVS的三层结构
当客户端发起请求时,请求直接发给Director Server(调度器),这时会根据设定的调度算法,将请求按照算法的规定智能的分发到真正的后台服务器。以达到将压力均摊。
- **第一层:**负载调度器(load balancer/ Director),它是整个集群的总代理,它有两个网卡,一个网卡面对访问网站的客户端,一个网卡面对整个集群的内部。负责将客户端的请求发送到一组服务器上执行,而客户也认为服务是来自这台主的。
- **第二层:**服务器池(server pool/ Realserver),是一组真正执行客户请求的服务器,可以当做WEB服务器。
- **第三层:**共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
3、LVS的实现原理
lvs的原理其实就是利用了Iptables的功能。了解防火墙的都知道四表五链。防火墙不仅仅有放火的功能还有转发,地址伪装,限流等等功能。
报文流转过程如下:
- 首先,客户端向调度器(Director Server)发起一个请求,调度器将这个请求发送至内核。
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链。
- 当请求达到INPUT链上,调度器判断报文中的目标端口来确定这个访问是不是要访问集群服务,如果是访问的集群服务,那么就会强制修改这个包的目标IP。
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。
4、工作原理
了解下专业术语:
- **DS:**Director Server。指的是前端负载均衡器。
- **RS:**Real Server。后端真实的工作服务器。
- **VIP:**向外部直接面向用户请求,作为用户请求的目标的IP地址。
- **DIP:**Director Server IP,主要用于和内部主机通讯的IP地址。
- **RIP:**Real Server IP,后端服务器的IP地址。
- **CIP:**Client IP,访问客户端的IP地址。
4.1、NAT工作模式
流转过程如下:
- 客户端请求数据,目标IP为VIP
- 请求数据到达服务器,DS根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
- 数据包从DS服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是DS,然后将数据返回给LB服务器。
- 收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从DS出发到达客户端。
- 客户端收到的就只能看到VIP\DIP信息。
4.2、NAT结构图
NAT模式的优缺点:
- NAT技术将请求的报文和响应的报文都需要通过DS进行地址改写,因此网站访问量比较大的时候DS负载均衡调度器有比较大的瓶颈。
- 很好配置,原理简单易懂。
4.3、TUN模式
IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。
流转过程如下:
- 客户请求数据包,目标地址VIP发送到LB上。
- LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
- RS节点机器根据IP Tunnel包头信息收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
- 响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。
注意事项:
- RIP、VIP、DIP全是公网地址。
- RS的网关不会也不可能指向DIP。
- 不支持端口映射。
- RS的系统必须支持隧道。
4.4、DR模式
DR模式也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。
流转过程如下:
- 当用户请求到达DS, 此时报文的源IP为CIP,目标IP为VIP.
- DS检查发现数据包的目标IP是本机.
- IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址.
- 由于DS和RS在同一个网络中,所以是通过二层来传输。检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server.
- 响应报文最终送达至客户端.
注意事项:
- 在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server
arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在网卡接口的别名上,并限制其不能响应对VIP地址解析请求。 - RS可以使用私有地址;但也可以使用公网地址,此时可以直接通过互联网连入RS以实现配置、监控等;
- RS的网关一定不能指向DIP;
- RS跟Dirctory要在同一物理网络内(不能由路由器分隔);
- 不支持端口映射;
- RS可以使用大多数的操作系统;
4.5、方案比较
- NAT模式-网络地址转换
VS/NAT 的优点是服务器可以运行任何支持TCP/IP的操作系统,它只需要一个IP地址配置在调度器上,服务器组可以用私有的IP地址。缺点是它的伸缩能力有限,当服务器结点数目升到20时,调度器本身有可能成为系统的新瓶颈,因为在VS/NAT中请求和响应报文都需要通过负载调度器。如果负载调度器成为系统新的瓶颈。 - TUN模式-IP隧道模式
在TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样负载调度器就可以处理大量的请求,它甚至可以调度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有100Mbps的全双工网卡,整个系统的最大吞吐量可超过 1Gbps。所以,VS/TUN可以极大地增加负载调度器调度的服务器数量。VS/TUN调度器可以调度上百台服务器,而它本身不会成为系统的瓶颈,可以用来构建高性能的超级服务器。 - DR模式
跟VS/TUN方法一样,VS/DR调度器只处理客户到服务器端的连接,响应数据可以直接从独立的网络路由返回给客户。这可以极大地提高LVS集群系统的伸缩性。跟VS/TUN相比,这种方法没有IP隧道的开销,但是要求负载调度器与实际服务器都有一块网卡连在同一物理网段上,服务器网络设备(或者设备别名)不作ARP响应,或者能将报文重定向(Redirect)到本地的Socket端口上。

5、负载均衡算法

6、DR模式实验
主机 | IP | 功能 |
---|---|---|
LVS | 10.0.41.82 | 调度器 |
快传1 | 10.0.41.196 | 服务器 |
快传2 | 10.0.41.247 | 服务器 |
DS节点运行脚本内容:
#!/bin/bash
VIP=10.0.41.93
RIP1=10.0.41.175
RIP2=10.0.41.247
case "$1" in
start)
echo "start LVS of DirectorServer DR"
/sbin/iptables -F
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.0 up
/sbin/ipvsadm -A -t $VIP:8092 -s rr
/sbin/ipvsadm -a -t $VIP:8092 -r $RIP1 -g
/sbin/ipvsadm -a -t $VIP:8092 -r $RIP2 -g
#tcp端口
#/sbin/ipvsadm -A -t $VIP:2443 -s rr
#/sbin/ipvsadm -a -t $VIP:2443 -r $RIP1 -g
#/sbin/ipvsadm -A -t $VIP:2442 -s rr
#/sbin/ipvsadm -a -t $VIP:2442 -r $RIP1 -g
#udp端口
/sbin/ipvsadm -A -u $VIP:32001 -s rr
/sbin/ipvsadm -a -u $VIP:32001 -r $RIP1 -g
/sbin/ipvsadm -a -u $VIP:32001 -r $RIP2 -g
#nginx服务
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g
#2480端口
/sbin/ipvsadm -A -t $VIP:2480 -s rr
/sbin/ipvsadm -a -t $VIP:2480 -r $RIP1 -g
/sbin/ipvsadm -a -t $VIP:2480 -r $RIP2 -g
#tomcat服务
#/sbin/ipvsadm -a -t $VIP:8090 -r $RIP2 -g
/sbin/ipvsadm -ln
;;
stop)
echo "stop LVS of DirectorServer DR"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 down
;;
*)
echo "argements error"
;;
esac
#!/bin/bash
#DR server
VIP=10.0.41.93
case "$1" in
start)
echo "start LVS of DR"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
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
;;
stop)
echo "stop LVS of DR"
/sbin/ifconfig lo:0 down
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage:$0 {start|stop}"
esac
exit 1
部署结果:
