LVS.md

LVS 概述

简介

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,官方站点。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

作用

LVS主要用于服务器集群的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

术语

  • vs:Virtual Server 虚拟服务,可称为Director、Dispatcher分发器、Balancer负载均衡器

  • rs:Real Server 真实服务器

  • CIP:Client IP 客户端IP

  • VIP:Director Virtual IP 等同于FIP(流动IP),负载均衡器虚拟IP

  • DIP:Director IP 调度IP(第二张网卡IP地址)

  • RIP:Real Server IP 真实服务器IP

LVS 详细说明

工作模型

lvs-nat

通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
说明
(1) RIP和DIP应该使用私网地址,RS的网状应该指向DIP;
(2) 请求和响应报文都要经由director转发;极高负载的场景中,Director可能会成为系统瓶颈;
(3) 支持端口映射;
(4) VS必须为Linux,RS可以是任意的OS;
(5) RS的RIP与Director的DIP必须在同一IP网络;
工作流量

 


 

 

传送门:http://www.cnblogs.com/edisonchou/p/4281978.html

lvs-dr

VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。

 


 

 

说明
(1) 确保前端路由器将目标IP为VIP的请求报文一定会发送给Director;实际使用中是修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应;
(2) RS的RIP可以使用私有地址,也可以使用公网地址;
(3) RS跟Director必须在同一物理网络中;
(4) 请求报文必须由Director调度,但响应报文必须不能经由Director;
(5) 不支持端口映射;
(6) 各RS可以使用大多数的OS;

lvs-tun

采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

说明
(1) RIP,DIP,VIP全得是公网地址;
(2) RS的网关不能也不可能指向DIP;
(3) 请求报文经由Director调度,但响应报文将直接发给CIP;
(4) 不支持端口映射;
(5) RS的OS必须支持IP隧道功能;

调度算法

轮叫(Round Robin)

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

加权轮叫(Weighted Round Robin)

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

最少链接(Least Connections)

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

加权最少链接(Weighted Least Connections)

在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

基于局部性的最少链接(Locality-Based Least Connections)

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

带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

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

目标地址散列(Destination Hashing)

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

源地址散列(Source Hashing)

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

ipvsadm 命令

用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;

 # yum install -y ipvsadm

管理集群服务

ipvsadm  -A|E -t|u|f  service-address  [-s scheduler][-p [timeout]]
ipvsadm  -D -t|u|f service-address

说明

  • -A:添加

  • -E:修改

  • -D:删除

  • service-address:服务地址和 -t|u|f 结合使用

  • -t, tcp, vip:port:TCP的ip和port

  • -u, udp, vip:port:UDP的ip和port

  • -f, fwm, MARK:防火墙标记

  • -s scheduler:默认为WLC调度算法,可省;

  • -p [timeout] :超出时长,持久连接相关,默认时长为300秒

  • --set tcp tcpfin udp 设置连接超时值

管理集群服务上的RS

ipvsadm-a|e  -t|u|f service-address -rserver-address [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -rserver-address

说明

  • -a:添加一个RS

  • -e:修改一个RS

  • -d:删除一个RS

  • server-address指的是rip[:port],端口可省表示与之前的service-address相同,只有nat模式支持端口映射才会使用

  • -g:GATEWAY (默认),lvs-dr模型

  • -i: IPIP, lvs-tun隧道模型

  • -m: MASQUERADE,lvs-nat模型

查看

ipvsadm -L|l[options]

说明

  • -n:numeric,数字格式显示地址和端口;

  • -c:connection,显示ipvs连接;

  • --stats:统计自该条转发规则生效以来的;

  • --rate:速率

  • --exact:精确值,不经过单位换算的数值
    应用举例

[test@LVS ~]$ sudo /sbin/ipvsadm -l 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.1.17.10:http wlc
  -> 10.2.4.35:http            Route   100    25095      18542     
  -> 10.2.4.31:http            Route   100    25097      17657     
  -> 10.2.4.30:http            Route   100    25123      18953     
  -> 10.2.4.29:http            Route   100    25091      18727     
  -> 10.2.4.24:http            Route   100    25075      17703     
  -> 10.2.4.23:http            Route   100    25086      17465     
  -> 10.2.4.22:http            Route   100    25124      17628  

InActConn 指非活跃连接数,我们将处于 TCP ESTABLISH 状态以外的连接都称为不活跃连接。例如处于 SYN_RECV 状态的连接,处于 TIME_WAIT 状态的连接等。

[test@LVS ~]$ sudo /sbin/ipvsadm -l --rate 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.1.17.10:http               2438    16241        0  6385560        0
  -> 10.2.4.35:http                 146      965        0   372714        0
  -> 10.2.4.34:http                 164     1089        0   423347        0
  -> 10.2.4.28:http                 152     1035        0   406658        0
  -> 10.2.4.27:http                 157     1031        0   411744        0
  -> 10.2.4.22:http                 160     1078        0   425447        0
  -> 10.2.4.21:http                 159     1078        0   423759        0

CPS (current connection rate) 每秒连接数
InPPS (current in packet rate) 每秒的入包个数
OutPPS (current out packet rate) 每秒的出包个数
InBPS (current in byte rate) 每秒入流量(字节)
OutBPS (current out byte rate) 每秒入流量(字节)

[test@LVS ~]$ sudo /sbin/ipvsadm -l --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP 192.1.17.10:http            326629K    3588M        0   22517G        0
  -> 10.2.4.23:http             584349K    3896M        0    1469G        0
  -> 10.2.4.34:http             597422K    3956M        0    1501G        0
  -> 10.2.4.28:http             631106K    4198M        0    1592G        0
  -> 10.2.4.27:http             578297K    3850M        0    1459G        0
  -> 10.2.4.22:http             580208K    3859M        0    1463G        0
  -> 10.2.4.21:http             685758K  283146K        0    1737G        0

Conns (connections scheduled) 已经转发过的连接数
InPkts (incoming packets) 入包个数
OutPkts (outgoing packets) 出包个数
InBytes (incoming bytes) 入流量(字节)
OutBytes (outgoing bytes) 出流量(字节)

清空规则

ipvsadm  -C

数器清零

ipvsadm  -Z [-t|u|f service-address]

保存和重载

保存

ipvsadm -S  > /PATH/TO/SOME_RULE_FILE
ipvsadm-save  > /PATH/TO/SOME_RULE_FILE

重载

ipvsadm  -R < /PATH/FROM/SOME_RULE_FILE
ipvsadm-restore< /PATH/FROM/SOME_RULE_FILE

其他

修改 LVS 表中的 fin_timeout 使用指令如下

ipvsadm --set 900 60 300

中间的 60 就是 tcp 的 fin_timeout 时间
查看默认的值使用如下命令:

$ sudo /sbin/ipvsadm -Ln --timeout 
Timeout (tcp tcpfin udp): 900 60 300

参考1
参考2

使用举例

lvs-nat模型构建

环境说明

vs DIP:192.168.182.190 VIP:192.168.5.190
rs1 192.168.182.193
rs2 192.168.182.194

上面中vs机器需要安装ipvsadm,而后端的rs全部安装httpd做测试使用。

# curl 192.168.182.193
192.168.182.193
# curl 192.168.182.194
192.168.182.194

rs主机配置

测试页面

# curl http://192.168.182.193
192.168.182.193
# curl http://192.168.182.194
192.168.182.194

网络配置

# route add default gw 192.168.182.190
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.182.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         192.168.182.190 0.0.0.0         UG    0      0        0 eth1

注意两台rs 都需要将默认网关指向vs的DIP。

vs主机配置

安装ipvsadm

# yum install -y ipvsadm

启动网卡间核心转发功能

# sysctl -w net.ipv4.ip_forward=1
# cat /proc/sys/net/ipv4/ip_forward
1

注意:上面的修改只是临时生效,如果想永久有效则需要修改配置文件:/etc/sysctl.conf。
定义ipvsadm负载均衡集群规则

# ipvsadm -A -t 192.168.5.190:80 -s rr
# ipvsadm -a -t 192.168.5.190:80 -r 192.168.182.193:80 -m
# ipvsadm -a -t 192.168.5.190:80 -r 192.168.182.194:80 -m

测试

# curl http://192.168.5.190
192.168.182.193
# curl http://192.168.5.190
192.168.182.194

扩展学习

保存规则

# ipvsadm-save -n > /tmp/ipvsadm.bak
# cat /tmp/ipvsadm.bak
-A -t 192.168.5.190:80 -s rr
-a -t 192.168.5.190:80 -r 192.168.182.193:80 -m -w 1
-a -t 192.168.5.190:80 -r 192.168.182.194:80 -m -w 1

删除并还原

# ipvsadm -C
# curl http://192.168.5.190
curl: (7) couldn't connect to host
# ipvsadm-restore < /tmp/ipvsadm.bak
# 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.5.190:80 rr
  -> 192.168.182.193:80           Masq    1      0          1         
  -> 192.168.182.194:80           Masq    1      0          2 
# curl http://192.168.5.190
192.168.182.194

修改调度算法

# ipvsadm -E -t 192.168.5.190:80 -s wrr
# ipvsadm -e -t 192.168.5.190:80 -r 192.168.182.193:80 -m -w 2
# 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.5.190:80 wrr
  -> 192.168.182.193:80           Masq    2      0          0         
  -> 192.168.182.194:80           Masq    1      0          0
# curl http://192.168.5.190
192.168.182.193
# curl http://192.168.5.190
192.168.182.193
# curl http://192.168.5.190
192.168.182.194

显示lvs目前的连接

# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:06  TIME_WAIT   192.168.5.190:52413 192.168.5.190:80   192.168.182.193:80
TCP 01:07  TIME_WAIT   192.168.5.190:52414 192.168.5.190:80   192.168.182.194:80
TCP 01:08  TIME_WAIT   192.168.5.190:52415 192.168.5.190:80   192.168.182.193:80
TCP 01:09  TIME_WAIT   192.168.5.190:52416 192.168.5.190:80   192.168.182.193:80
TCP 01:11  TIME_WAIT   192.168.5.190:52417 192.168.5.190:80   192.168.182.194:80

lvs-dr模型构建

环境说明

vs VIP:192.168.5.188
rs1 192.168.5.229
rs2 192.168.5.230
测试页面

# curl 192.168.5.229
192.168.5.229
# curl 192.168.5.230
192.168.5.230

vs配置

# ifconfig eth0:0 192.168.5.188 netmask 255.255.255.255 broadcast 192.168.5.188 up
# ifconfig eth0:0
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:1A:0A:84  
          inet addr:192.168.5.188  Bcast:192.168.5.188  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

rs配置

rs1:

# ifconfig lo:0 192.168.5.188/32 broadcast 192.168.5.188 up
# route add -host 192.168.5.188 dev lo:0
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# ifconfig lo:0
lo:0      Link encap:Local Loopback  
          inet addr:192.168.5.188  Mask:0.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.5.188   0.0.0.0         255.255.255.255 UH    0      0        0 lo
192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.5.1     0.0.0.0         UG    0      0        0 eth0          

rs2:
和上面的配置相同。
内核参数说明
arp_annouce定义通告级别:

  • 0:默认级别,将本地的任何接口上的配置的地址都在网络中通告

  • 1:尽量避免向本主机上的其他网卡进行网络通信,特殊情况下其他接口也可以

  • 2:总是使用最佳网络地址接口(仅使用定义的网卡接口在同网络通信)

arp_ignore定义响应级别(0-8九个级别),响应时忽略方式

  • 0:都全都响应

  • 1:只对从本接口进入的请求响应,且本接口地址是个网络地址

注释:一般使用arp_annouce=2,arp_ignore=1

vs主机ipvsadm配置

# ipvsadm -A -t 192.168.5.188:80 -s rr
# ipvsadm -a -t 192.168.5.188:80 -r 192.168.5.229:80 -g
# ipvsadm -a -t 192.168.5.188:80 -r 192.168.5.230:80 -g
# 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.5.188:80 rr
  -> 192.168.5.229:80             Route   1      0          0         
  -> 192.168.5.230:80             Route   1      0          0  

测试

注意:测试的客户端不要在vs 主机上。

# curl 192.168.5.188
192.168.5.229
# curl 192.168.5.188
192.168.5.230

通过防火墙标记来定义lvs

FWM防火墙标记功能

防火墙标记可以实现多个集群服务绑定为同一个,实现统一调度;将共享一组RS的集群服务统一进行定义FWM基于iptables的mangle表实现防护墙标记功能,定义标记做策略路。

FWM定义集群的步骤

在director上netfilter的mangle表的PREROUTING定义用于"打标"的规则

# iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $serviceport -j MARK --set-mark #

定义集群服务

# ipvsadm -A -f # [-s scheduler]

举例

# iptables -t mangle -A PREROUTING -d 172.16.50.50 -p tcp --dport 80 -j MARK --set-mark 5
# ipvsadm -A -f 5 -s rr
# ipvsadm -a -f 5 -r 172.16.200.10 -g
# ipvsadm -a -f 5 -r 172.16.200.11 -g

LVS持久连接功能

lvs persistence

无论ipvs使用何种scheduler,其都能够实现在指定时间范围内始终将来自同一个ip地址的请求发往同一个RS;实现方式和lvs调度的十种算法无关,通过lvs持久连接模板(hash表)实现,当超过自定义的可持节连接时长候再根据LVS算法本身进行调度。
ipvsadm命令中-p选项实现,在-p后不指定具体数字(单位:秒),默认为300,到时候会自动延长2分钟,对于web本身就是15秒

每端口持久(PPC)

客户端对同一服务端口发起请求,会基于该服务的端口实现请求在一段时间内对同一RS服务器持久连接;
例如:有两台主机做为RS服务器做http和hssh的两种服务的集群,仅http做每端口持久,Client请求会实现绑定在,但是22号端口请求不会绑定在同一台RS
举例

# ipvsadm -C
# ipvsadm -A -t 192.168.1.88:0 -s rr -p 120
# ipvsadm -a -t 192.168.1.88:0 -r 192.168.1.9 -g
# ipvsadm -a -t 192.168.1.88:0 -r 192.168.1.10 -g
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.88:0 rr persistent 120
  -> 192.168.1.9:0                Route   1      0          0         
  -> 192.168.1.10:0               Route   1      0          0

每客户端持久(PCC)

director会将用户的任何请求都识别为集群服务,并向RS进行调度;同一客户端的请求任何端口都发往同一台第一次选定的RS服务器
举例

# ipvsadm -A -t 192.168.1.88:80 -s rr -p 120 
# ipvsadm -a -t 192.168.1.88:80 -r 192.168.1.9 -g
# ipvsadm -a -t 192.168.1.88:80 -r 192.168.1.10 -g

每防火墙标记持久(PFWMC)

将两个或两个以上服务通过防火墙打标绑定在一起,这些服务的请求实现同时定向与同一台RS服务器,服务绑定同一RS
举例
lvs-dr模式下以rr算法绑定http和https服务

~]#iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j MARK--set-mark 99
~]#iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 443 -j MARK--set-mark 99
~]#ipvsadm -A -f 99 -s rr -p
~]#ipvsadm -a -f 99 -r 172.16.100.68 -g
~]#ipvsadm -a -f 99 -r 172.16.100.69 -g

LVS-DR类型RS脚本示例

#!/bin/bash
#
vip=172.16.50.50
interface="lo:0"
case$1 in
start)
echo1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig$interface $vip broadcast $vip netmask 255.255.255.255 up
routeadd -host $vip dev $interface
;;
stop)
echo0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo0 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig$interface down
;;
status)
ififconfig lo:0 |grep $vip &> /dev/null; then
echo"ipvs is running."
else
echo"ipvs is stopped."
fi
;;
*)
echo"Usage: `basename $0` {start|stop|status}"
exit1
esac

扩展学习:
http://xuding.blog.51cto.com/4890434/1740228
http://www.cnblogs.com/edisonchou/p/4281978.html

原文地址:https://www.cnblogs.com/cuchadanfan/p/6491787.html