LVS原理和实现

1、LVS简介linux

    LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最先出现的自由软件项目之一。在linux内存2.6中,它已经成为内核的一部分,在此以前的内核版本则须要从新编译内核。算法

    LVS主要用于多服务器的负载均衡。它工做在网络层,能够实现高性能,高可用的服务器集群技术。可把许多低性能的服务器组合在一块儿造成一个超级服务器,实现容量的扩张和伸缩。配置很是简单,且有多种负载均衡的方法。稳定可靠,即便在集群的服务器中某台服务器没法正常工做,也不影响总体效果。bash


2、LVS组件服务器

    ipvs:是一个框架,工做于内核中,结合netfilter代码上的INPUT钩子函数,根据用户定义的ipvs规则完成转发,使请求不进入用户空间中。网络

    一旦用户请求进入用户空间,就意味着每个用户请求的连接都须要维持一个套接字文件,单主机套接字文件数最多了65535个。因为LVS工做在内核空间中,无需进入用户空间,因此能够突破套接字的限制。session

    ipvsadm:是一个用户空间管理器,用于生成ipvs在INPUT钩子函数中的规则。
负载均衡


3、LVS IP地址命名规范框架

    在LVS集群中,咱们必须基于节点在集群内的角色来区别不一样种类的ip地址,在一个集群内有四种基本的ip地址类型。curl

①、虚拟ip地址(VIP)
tcp

    Director用于向客户端计算机提供服务的ip地址

    用于客户端计算机链接由集群提供的服务的ip地址叫作虚拟ip地址(VIP),VIP是链接Director到常规公共网络的网卡上的ip别名或从属ip地址。LVS VIP很重要,由于它是客户端计算机链接集群时要用到的,客户端计算机从它们的ip地址向VIP地址发送数据包访问集群服务,而后你告诉客户端计算机使用这个VIP地址的服务名(如DNS、DDNS、WINS、LDAP或NIS),这是客户端计算机要使用集群服务常须要知道的惟一名字或地址。(客户端计算机不知道集群内剩下的ip地址)


②、真实ip地址(RIP)

    用在集群节点上的ip地址

    在LVS术语中,向外部世界提供服务的节点叫作真实服务器,所以在真实服务器上使用的ip地址叫作真实ip地址(RIP)。

    RIP地址是分配给链接真实服务器到同一网络上Director的网卡的永久性ip地址,这个网络为集群网络或Director/真实服务器网络(D/RIP网络),Director使用RIP地址在D/RIP网络上进行正常的网络通信,可是只有Director须要知道如何与这个ip地址对话。


③、Director的ip地址(DIP)

    Director用于链接D/RIP网络的ip地址

    Director的ip地址(DIP)用在链接Director到D/RIP网络的网卡上的,在Director的VIP上接收访问集群服务的请求,这些请求经过DIP转发出去抵达各个集群节点,DIP和VIP能够处于同一块网卡上。


④、客户端计算机的ip地址(CIP)

    分配给客户端计算机的ip地址,它用做向集群发送请求的源ip地址

    客户端计算机的ip地址(CIP)多是一个本地的、与VIP在同一网络的私有ip地址,或者是一个因特网上的公共ip地址。

wKioL1YY4hCAw9ORAAK435LtFDk506.jpg

LVS集群简图(LVS/NAT)和各IP分布简图(点击放大查看)



4、LVS的类型

①、LVS/NAT类型

    客户经过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据链接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址 Virtual IP Address 改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在链接 Hash 表中记录这个链接,当这个链接的下一个报文到达时,从链接Hash表中能够获得原选定服务器的地址和端口,进行一样的改写操做,并将报文传给原选定的服务 器。当来自真实服务器的响应报文通过调度器时,调度器将报文的源地址和源端口改成Virtual IP Address和相应的端口,再把报文发给用户。

    当使用VS/NAT方法时,若是有大量的响应数据通过调度器,调度器将成为整个集群的瓶颈

LVS NAT的特性

1.RS的应该使用私有地址

2.RS的网关必须指向DIP

3.RIP和DIP必须在同一网段内

4.请求和响应的报文都得通过Director,在高负载场景中,Director极可能成为性能凭借

5.支持端口映射

6.RS可使用任意支持集群服务的OS


②、LVS/DR类型

    调度器和服务器组都必须在物理上有一个网卡经过不分断的局域网相连,如经过交换机或者高速的HUB相连。VIP地址为调度器和服务器 组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;全部的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是 不可见的,只是用于处理目标地址为VIP的网络请求。在VS/DR中,调度器根据各个服务器的负载状况,动态地选择一台服务器,不修改也不封装IP报文, 而是将数据帧的MAC地址改成选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。由于数据帧的MAC地址是选出的服务器,因此服务 器确定能够收到这个数据帧,从中能够得到该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,而后根据路由表将响应 报文直接返回给客户。

LVS DR类型的特性

1.RS可使用私有地址,还可使用公网地址,此时能够直接经过互联网连入RS,以实现配置、监控等

2.RS的网关必定不能指向DIP

3.RS跟Dirctory要在同一物理网络内(不能有路由器分隔)

4.请求报文通过Directory,但响应报文必定不通过Director

5.不支持端口映射

6.RS可使用大多数的操做系统


③、LVS/TUN类型

    LVS/TUN 的链接调度和管理与 VS/NAT 中的同样,只是它的报文转发方法不一样。调度器根据各个服务器的负载状况,动态地选择一 台服务器,将请求报文封装在另外一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封得到原来目标地址为VIP的报 文,服务器发现VIP地址被配置在本地的IP隧道设备上,因此就处理这个请求,而后根据路由表将响应报文直接返回给客户。


LVS TUN类型(IP隧道)的特性

 1.RIP,DIP,VIP都得是公网地址

 2.RS的网关不会指向也不可能指向DIP

 3.请求报文通过Directory,但响应报文必定不通过Director

 4.不支持端口映射

 5.RS的OS必须得支持隧道功能



5、LVS的调度方法

①、静态方法:仅根据算法自己进行调度

轮叫调度(Round Robin)(简称rr)

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


加权轮叫(Weighted Round Robin)(简称wrr)

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

源地址散列(Source Hashing)(SH)

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


目标地址散列(Destination Hashing)(DH)

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


②、动态方法:根据算法及RS当前的负载状态

    在TCP协议中,某一个连接可能有两种状态,活动连接(Active):正处于数据传输,非活动连接(Inactive):数据传输结束,但连接没有断开



最少连接(Least Connections)(LC)

    调度器经过“最少链接”调度算法动态地将网络请求调度到已创建的连接数最少的服务器上。若是集群系统的真实服务器具备相近的系统性能,采用“最小链接”调度算法能够较好地均衡负载。

    Overhead=Active*256+Inactive,结果中,小的将成为下一个调度对象。


加权最少连接(Weighted Least Connections)(WLC)

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

    Overhead=(Active*256+Inactive)/weight,结果中,小的将成为下一个调度对象。


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

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


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

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


最短的指望的延迟(Shortest Expected Delay Scheduling SED)(SED)

    基于wlc算法。Overhead=(Active+1)*256/weight,结果中,小的将成为下一个调度对象。


最少队列调度(Never Queue Scheduling NQ)(NQ)

    无需队列。若是有台 realserver的链接数=0就直接分配过去,不须要在进行sed运算。所有分配后进行sed算法。


补充:Session持久机制

1.Session绑定:始终将统一请求者的链接定向至统一RS(第一次请求时仍有调度选择):没有容错哦能力,有损均衡效果

2.session复制:在RS之间经过多播或广播同步session,所以,每一个RS持集群中全部的session;对于大服务器集群环境不适用

3.session服务器:利用单独部署的服务器来统一管理session

[root@localhost ~]# grep -C 10 -i "ipvs" /boot/config-2.6.32-573.el6.x86_64 
CONFIG_IP_SET_HASH_IPPORTNET=m
CONFIG_IP_SET_HASH_NET=m
CONFIG_IP_SET_HASH_NETPORT=m
CONFIG_IP_SET_LIST_SET=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12

#
# IPVS transport protocol load balancing support(支持的传输协议)
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

#
# IPVS scheduler(支持的调度算法)
#
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


6、ipvsadm的使用

管理集群服务

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

        -A: 添加一个集群服务

-t:tcp

-u:udp

-f: firewall make。防火墙标记,让ipvs跟iptable的mangle表一块工做,基于防火墙标记来实现集群服务,一般应用于将两个或以上的服务绑定为一个服务进行处理时使用

service-address:-t IP:port。-u ip:port。-f firewall_mark

        -s 调度算法,默认为wlc(最理想的调度方法)

        -p: timeout persistent connection 持久链接

        -E:修改定义过的集群服务


    ipvsadm -D -t|u|f service-address

        -D: 删除指定的集群服务


管理集群服务中的Real Server1

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

        -a:向指定的CS中添加RS

            -t|-u|-f service-address:指明将RS添加至那个Cluster Service 中

   -r:指定RS,能够包含{IP[:port]},只有支持端口映射的LVS类型才容许此处使用跟集群服务中不一样的端口

   -g:Gateway(指定lvs类型为DR,默认值)

   -i:ipip(指定lvs类型为TUN)

   -m:masquerade(指定lvs类型为NAT)

   -w:指定RS权重(省略权重为1)

        -e:修改指定的RS属性


    ipvsadm -d -t|u|f service-address -r server-address

        -d:在指定的集群服务中删除一个指定的RS


清空和查看:

    ipvsadm -C

        清空全部的集群服务


    ipvsadm -L|l [options]

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

        -c: connection,显示ipvs链接;

        --stats:统计数据

        --rate: 速率

        --exact: 精确值

 --timeout:显示tcp、udp、tcpfind会话的超时时长

 --daemon:守护进程的信息

 --sort:对虚拟服务进行排序,默认为升序


保存和重载:

    ipvsadm -R

    ipvsadm -S [-n]


置零计数器:

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


7、LVS/NAT类型实验步骤

①、拓扑图

wKioL1YaA8WBenbJAAGQK08CMNU863.jpg


②、实验步骤

[root@localhost ~]# yum install ipvsadm
#安装ipvsamd管理工具实现对ipvs规则的添加
[root@localhost ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@localhost ~]# ipvsadm -A -t 192.168.0.88:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.0.88:80 -r 172.16.0.8:80 -m
[root@localhost ~]# ipvsadm -a -t 192.168.0.88:80 -r 172.16.0.9:80 -m
[root@localhost ~]# 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.0.88:80 rr
  -> 172.16.0.8:80                Masq    1      0          0         
  -> 172.16.0.9:80                Masq    1      0          0 
#这样就定义好了以rr调度算法的nat类型LVS

③、测试实验结果(这里为了看出实验结果,172.16.0.8首页内容为MY WEB2,172.16.0.9首页内容为MY WEB1):

[root@localhost ~]# curl http://192.168.0.88
MY WEB2
[root@localhost ~]# curl http://192.168.0.88
MY WEB1
[root@localhost ~]# curl http://192.168.0.88
MY WEB2
[root@localhost ~]# curl http://192.168.0.88
MY WEB1
[root@localhost ~]# curl http://192.168.0.88
MY WEB2
[root@localhost ~]# curl http://192.168.0.88
MY WEB1
[root@localhost ~]# 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.0.88:80 rr
  -> 172.16.0.8:80                Masq    1      0          3  
  -> 172.16.0.9:80                Masq    1      0          3
#由于咱们使用了rr调度算法,因此每次访问都会进行轮询

ipvs的机制和netfilter的机制同样,都是运行在内核内存中,因此咱们定义的规则重启服务器后将会消失,因此建议配置、测试没问题后对规则进行导出保存

[root@localhost ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@localhost ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.0.88:http -s rr
-a -t 192.168.0.88:http -r 172.16.0.8:http -m -w 1
-a -t 192.168.0.88:http -r 172.16.0.9:http -m -w 1
[root@localhost ~]# ipvsadm -R < /etc/sysconfig/ipvsadm
#把规则导入到ipvs中


8、LVS/DR类型实验步骤

①、拓扑图

wKioL1YaIFjiMeuQAAFqYeBluxs655.jpg

②、实验步骤

Director服务器上配置

[root@localhost network-scripts]# ifconfig eno16777736:0 192.168.0.8/32 broadcast 192.168.0.8 up
[root@localhost network-scripts]# route add -host 192.168.0.8 dev eno16777736:0
#配置Director的VIP地址,并指定掩码位32为,仅广播给本身
[root@localhost ~]# ipvsadm -A -t 192.168.0.8:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.0.8:80 -r 192.168.0.21 -g
[root@localhost ~]# ipvsadm -a -t 192.168.0.8:80 -r 192.168.0.22 -g
[root@localhost ~]# 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.0.8:80 rr
  -> 192.168.0.21:80              Route   1      0          0         
  -> 192.168.0.22:80              Route   1      0          0

Real server服务器上配置

[root@wlw ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@wlw ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 
[root@wlw ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@wlw ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 
#让其不接受arp广播和不通告arp广播
[root@wlw ~]# ifconfig lo:0 192.168.0.8/32 broadcast 192.168.0.8/32 up
[root@wlw ~]# route add -host 192.168.0.8 dev lo:0

③、测试实验结果(这里为了看出实验结果,192.168.0.21首页内容为MY WEB2,192.168.0.22首页内容为MY WEB1):

[root@localhost ~]# curl http://192.168.0.8
MY WEB2
[root@localhost ~]# curl http://192.168.0.8
MY WEB1
[root@localhost ~]# curl http://192.168.0.8
MY WEB2
[root@localhost ~]# curl http://192.168.0.8
MY WEB1
[root@localhost ~]# curl http://192.168.0.8
MY WEB2
[root@localhost ~]# curl http://192.168.0.8
MY WEB1
[root@localhost ~]# 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.0.88:80 rr
  -> 172.16.0.8:80                Route    1      0          3  
  -> 172.16.0.9:80                Route    1      0          3
相关文章
相关标签/搜索