LVS集群(Linux Virtual Server)

LVS集群(Linux Virtual Server)

官方文档:

http://www.linuxvirtualserver.org/zh/lvs1.html
http://www.linuxvirtualserver.org/zh/lvs2.html
http://www.linuxvirtualserver.org/zh/lvs3.html
http://www.linuxvirtualserver.org/zh/lvs4.html

第一部分:LVS原理详解

第01节:LVS内核模型

这里写图片描述

  1. 当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
  2. 当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
  3. LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。
  4. 如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
  5. 最后经由POSTROUTING链发往后端服务器。

第02节: LVS的包转发模型

术语 解释
Load balancer或director 负载调度器
RS或Real Server 真实服务器,提供服务的服务器
VIP 虚拟IP地址,客户端访问集群的地址
RIP 集群所提供应用程序的地址(HTTP,FTP)
DIP 调度器的真实地址

- Virtual Server via NAT 方法使用了报文双向重写的方法
- Virtual Server via IP Tunneling 采用的是报文单向重写的策略
- Virtual Server via Direct Routing 采用的是报文转发策略

1.NAT模型:

这里写图片描述

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。

③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。

④.然后lvs将此报文的源地址修改为本机并发送给客户端。

注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端。

2.DR模型:

这里写图片描述

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。

③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

注意:需要设置lo接口的VIP不能响应本地网络内的arp请求。

3.TUN模型:

这里写图片描述

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。

注意:需要设置lo接口的VIP不能在共网上出现

4.Lvs-fullnat

说明:此调度方式还没有正式被Linux官方录入系统标准库,所以如果向使用此模式,需要去lvs官网下载源码,并且需要重新编译系统内核才可使用。

第03节: LVS的调度算法

LVS的调度算法分为静态与动态两类。查看当前系统支持的调度方法:

> grep -i 'IPVS SCHEDULER' -A 12 /boot/config-2.6.32-504.el6.x86_64
# IPVSscheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m

1. 静态算法(4种):只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况

①.RR:轮叫调度(Round Robin)
调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

②.WRR:加权轮叫(Weight RR)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

③.DH:目标地址散列调度(Destination Hash )
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

主要作用:对于同一个请求,发往同一个服务器(缓存服务器)

④.SH:源地址 hash(Source Hash)
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

主要作用:源地址hash(一定时间内,相同的源地址发往相同的主机)session affinity、 session sharing

2. 动态算法(6种):前端的调度器会根据后端真实服务器的实际连接情况来分配请求(默认为wlc)

①.LC:最少链接(Least Connections)
  调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。

②.WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
  在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

③.SED:最短延迟调度(Shortest Expected Delay )
  在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。

④.NQ永不排队/最少队列调度(Never Queue Scheduling NQ)
  无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。

⑤.LBLC:基于局部性的最少链接(locality-Based Least Connections)
  基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

⑥. LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
  带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

第二部分:LVS实战

第01节:ipvsadm命令

1、管理集群服务
1.添加:-A ipvsadm -A|E -t|u|f service-address
          -t:tcp协议集群 -u:udp协议集群 -f:防火墙标记集群
2.修改:-E
3.删除:-D ipvsadm -D -t|u|f service-address

2、管理集群服务中的RealServer
1.添加:-a ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m][-w weight]
          -r:RS的地址,NAT模型中,可用IP:PORT实现端口映射
          -g:DR模型 -i:TUN模型 -m:NAT模型 -w:权重
2.修改:-e
3.删除:-d ipvsadm -d -t|u|f service-address -r server-address

3.管理集群服务的查看
1.ipvsadm -L|l [options]
          options:-n:数字格式显示
              –stats 统计信息
              –rate:统计速率
              –timeout:显示tcp、tcpinfo、udp的会话超时时长
              -c:连接客户端数量

4.情况计数器:ipvsadm -Z [-t|u|f service-address]

5.清除所有规则:ipvsadm -C

6.保存规则
        1.ipvsadm -S > /path/to/somefile
        2.ipvsadm-save > /path/to/somefile
        3.ipvsadm-restore < /path/to/somefile 恢复虚拟服务器规则

第02节:NAT模式

在此模式下,只需配置调度服务器LVS,不需要配置后端的真机服务器。但是必须要保证后端的服务器网关地址是LVS服务器。

调度服务器的配置如下:

> vim /etc/sysctl.conf
net.ipv4.ip_forward = 1   #必须要打开路由功能
> sysctl -p
> yum install ipvsadm     #安装
#配置
> ipvsadm -A -t 172.16.10.111:80 -s rr
> ipvsadm -a -t 172.16.10.111:80 -r 10.0.0.11:80 -m
> ipvsadm -a -t 172.16.10.111:80 -r 10.0.0.12:80 -m
> ipvsadm -a -t 172.16.10.111:80 -r 10.0.0.13:80 -m
> service ipvsadm save

第03节:DR模式

第一种模式:分发器不作网关(单网卡)

注意:以下方法是修改web服务器上的arp不响应。另外一种方法是修改交换机或路由器上的arp绑定。

1、调度服务器不需要打开路由功能。但是要添加1个IP,作为vip,此vip与后端服务器的lo口上的vip地址一致。

> cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
HWADDR=02:00:C0:A8:0A:9A
TYPE=Ethernet
UUID=ac508aa3-62a7-4f63-8b6a-3919f9ac9780
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR1=192.168.10.154
PREFIX1=24
IPADDR2=192.168.10.254    #添加vip
PREFIX2=24                #添加vip
GATEWAY=192.168.10.1
DNS1=114.114.114.114

2、后端的回环接口lo口配置VIP。为什么要把vip绑定在lo接口上?

> cat /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.10.254     #添加vip
NETMASK=255.255.255.255
ONBOOT=yes

3、后端所有服务器禁用接收arp回应配置。(不用禁用arp也可以,因为vip在lo接口上)

> vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
> sysctl -p   #使配置生效

# arp_ignore(接受到arp请求时的响应级别,默认0)
#   1) 0:只要本地配置有相应的地址,给予响应
#   2) 1:仅在请求的目标地址配置请求到达的接口上的时候,才给于响应 (不接受arp广播)

# arp_announce(将自己地址向外通告时的通告级别,默认0)
#   1) 0:将本地任何接口上的任何地址向外通告
#   2) 1:试图仅向目标网络通告语气网络匹配的地址
#   3) 2:仅向与本地接口上地址匹配的网络进行通告

或者

yum install arptables_jf
arptables -A IN -d 172.16.10.100 -j DROP  #阻止vip对arp响应

第二种方式:分发器作为网关(双网卡)

#设置防火墙规则
> iptables -t mangle -A PREROUTING -d 192.168.0.119 -p tcp --dport 80 -j MARK --set-mark 1 
> iptables -t mangle -A PREROUTING -d 192.168.0.119 -p tcp --dport 443 -j MARK --set-mark 1 

#设置分发规则
> ipvsadm -A -f 1 -s wrr -p 3600 
> ipvsadm -a -f 1 -r 192.168.0.121 -w 10 -g 
> ipvsadm -a -f 1 -r 192.168.0.122 -w 20 -g 

第04节:压力测试

> ab -n 500 -c 500 http://192.168.0.119 
> watch -n 1 "ipvsadm -L -n --stats"

第三部分:session问题

  • ipvsadm -p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。

  • 如果这台persistent的服务器坏了怎么办?这就是集群中的session复制问题。

  • Lvs中并没有类似tomcat采用的集群节点广播复制,jboss采用的配对复制等session状态复制策略。

  • 设计上解决—应用无状态,怎样做到应用无状态?

    1. cookie
    2. 集中式session管理来完成,说具体点就是多个无状态的应用节点连接一个session服务器,session服务器将session保存到缓存中,session服务器后端再配有底层持久性数据源,比如数据库,文件系统等等。

第四部分:管理lvs的工具

piranha(略)

猜你喜欢

转载自blog.csdn.net/caodenghua/article/details/80059444