LVS(Linux Virtual Server)即Linux虚拟服务器,linux内核2.6.X之后的版本默认已集成了LVS模块(内核模块名为:ipvs),实现了基于传输层的请求负载均衡调度方案,LVS支持的工作模式:NAT模式、TUN模式、DR模式及FULLNAT模式。
yum install ipvsadm
大部分命令可采用keepalived的配置策略来实现,常用的用于维护的主要命令:
ipvsadm -Ln // 显示转发策略
[root@node1 keepalived]# 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.200.2:22 wrr
-> 192.168.0.44:22 Masq 1000 1 0
ipvsadm -lnc // 查看当前ipvs模块中记录的连接
[root@node1 keepalived]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 14:50 ESTABLISHED 192.168.200.5:13645 192.168.200.2:22 192.168.0.44:22
ipvsadm -Ln --stats // 显示统计信息
[root@node1 keepalived]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.200.2:22 3 295 300 28082 46370
-> 192.168.0.44:22 3 295 300 28082 46370
ipvsadm -C //清楚策略
ipvsadm --help 可以得到支持的详细命令:
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
ipvsadm --stop-daemon state
ipvsadm -h
Commands:
Either long or short options are allowed.
--add-service -A add virtual service with options
--edit-service -E edit virtual service with options
--delete-service -D delete virtual service
--clear -C clear the whole table
--restore -R restore rules from stdin
--save -S save rules to stdout
--add-server -a add real server with options
--edit-server -e edit real server with options
--delete-server -d delete real server
--list -L|-l list the table
--zero -Z zero counters in a service or all services
--set tcp tcpfin udp set connection timeout values
--start-daemon start connection sync daemon
--stop-daemon stop connection sync daemon
--help -h display this help message
Options:
--tcp-service -t service-address service-address is host[:port]
--udp-service -u service-address service-address is host[:port]
--fwmark-service -f fwmark fwmark is an integer greater than zero
--ipv6 -6 fwmark entry uses IPv6
--scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
the default scheduler is wlc.
--pe engine alternate persistence engine may be sip,
not set by default.
--persistent -p [timeout] persistent service
--netmask -M netmask persistent granularity mask
--real-server -r server-address server-address is host (and port)
--gatewaying -g gatewaying (direct routing) (default)
--ipip -i ipip encapsulation (tunneling)
--masquerading -m masquerading (NAT)
--weight -w weight capacity of real server
--u-threshold -x uthreshold upper threshold of connections
--l-threshold -y lthreshold lower threshold of connections
--mcast-interface interface multicast interface for connection sync
--syncid sid syncid for connection sync (default=255)
--connection -c output of current IPVS connections
--timeout output of timeout (tcp tcpfin udp)
--daemon output of daemon information
--stats output of statistics information
--rate output of rate information
--exact expand numbers (display exact values)
--thresholds output of thresholds information
--persistent-conn output of persistent connection info
--nosort disable sorting output of service/server entries
--sort does nothing, for backwards compatibility
--ops -o one-packet scheduling
--numeric -n numeric output of addresses and ports
--sched-flags -b flags scheduler flags (comma-separated)
如:
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m //添加真实服务器,指定传输模式为NAT
ipvsadm -A -t 207.175.44.110:80 -s rr //添加地址为207.175.44.110:80的虚拟服务,指定调度算法为轮转
Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP(Virtual Router RedundancyProtocol(虚拟路由器冗余协议))功能,解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
详见之后的文档。
LVS在将数据包(NAT到)转发到Real Server(RS服务器)服务器, 跟我们熟知的网络NAT模式不一样:NAT模式转发时源IP地址不变,即源ip地址仍然是客户端那端的ip地址。
该模式部署简单,因为请求响应数据包都要经过LVS服务器,因此性能很差。
跟NAT模式不同在于:LVS在将数据包转发到RS服务器时,源IP地址变为LVS的内网地址。这种模式也就是我们熟知的网络NAT模式(外网进公司内网路由器的NAT模式)。
该模式性能上同NAT模式。
linux内核集成的版本默认不支持该种方式,需要而外软件的支持: lvs-fullnat-synproxy.tar.gz
已验证: CentOS Linux release 7.4.1708 (Core) Linux version 3.10.0-693.el7.x86_64 这个版本是不支持 FULLNAT模式。
DR模式是在LVS服务器通过只改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。要求LVS服务器与真实服务器都有一块网卡连接在同一局域网内。
该模式性能最好。
在LVS服务器和真实服务器之间的传输不用改写IP地址。而是把客户请求包封装在一个IP tunnel里面,然后发送给真实服务器节点服务器,真实服务器接收到之后解开IP tunnel后,进行响应处理。并且绕过LVS服务器直接把包发送给客户端。
该模式性能基本能达到DR模式的性能。
静态调度算法(4种):
轮询调度rr
轮询调度(Round Robin)算法就是按依次循环的方式将请求调度到不同的服务器上,轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。
加权轮询wrr
加权轮询(Weight Round Robin)算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
源地址散列调度算法sh
源地址散列调(Source Hashing)算法先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似。
目标地址散列调度算法dh
目标地址散列调度(Destination Hashing)算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。
动态调度算法(6种):
最少链接lc
最小连接调度(Least Connections)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。
(集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)
加权最少链接wlc
加权最少连接(Weight Least Connections)算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
基于局部性的最少连接调度算法lblc
基于局部的最少连接调度(Locality-Based Least Connections)算法是针对请求报文的目标IP地址的 负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用’最少连接’的原则选出一个可用的服务器,将请求发送到服务器。
带复制的基于局部性的最少连接lblcr
带复制的基于局部性的最少连接(Locality-Based Least Connections with Replication)算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与LBLC算法不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。按’最小连接’原则从该服务器组中选出一一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按’最小连接’原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
最少期望延迟sed
最短的期望的延迟调度(Shortest Expected Delay)算法基于WLC算法。举个例子吧,ABC三台服务器的权重分别为1、2、3 。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用SED算法后会进行一个运算
A:(1+1)/1=2 B:(1+2)/2=3/2 C:(1+3)/3=4/3 就把请求交给得出运算结果最小的服务器。
最少队列调度nq
最少队列调度(Never Queue)算法,无需队列。如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算。