1、LVS简介前端
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最先出现的自由软件项目之一。node
负载均衡集群(Load Balancing,简称为LB)从工做在协议层来划分为TCP和应用层;TCP协议层是根据请求的目标地址和端口进行调度;应用层协议是根据请求的内容进行调度,并且此种调度为“代理”方式,即反向代理。算法
2、LVS组成后端
LVS软件由ipvs和ipvsadm两个程序组成,ipvs是工做在内核中的;ipvsadm是工做在用户空间,将为工做在内核空间的ipvs定义集群服务,做出调度决策算法的功能的一种工具,从功能上来看相似于netfilt.浏览器
2.1 LVS工做原理安全
ipvs工做于netfilter的INPUT链上;ipvsadm用于在ipvs上定义集群服务:同时也得定义此集群服务对应于有哪一个后端主机可用;根据所指定的调度方法(算法)做出调度决策;bash
当用户的请求到达本机时,首先经由PREROUTING链,到达PREROUTING链后进行路由判断,经路由判断后发现是送往本机的,将用户请求送往INPUT连接中,此时ipvs将检查INPUT链上的全部通过的报文,判断是否是请求的集群服务,若是请求的是集群服务,ipvs将“拦下”服务,通过调度算法挑选出一个时先定义好的主机,并将用户请求服务转发出去,经由网络将用户请求送日后端主机并为用户提供服务响应。服务器
2.2 LVS常见术语约定网络
为用户提供挑选后端服务器的主机称为调度器(Director);后端提供服务的主机称为Real Server (简写为RS)。架构
客户端(Client)的IP称为CIP;被DNS域名解析后的IP称为VIP(Director Virtual IP);调度器面向后方的集群的IP称为DIP(Director IP);Real Server服务器上的IP称为RIP(Real Server)。
2.3 LVS的类型
LVS的类型分为lvs-nat、lvs-dr、lvs-tun、lvs-fullnat。
3、lvs-nat
lvs-nat很是相似于DNAT,支持多目标转发,它是经过修改请求报文的目标地址并根据调度算法所挑选出的某RS的RIP来进行转发。
当用户请求报文到达Director时,源地址为CIP目标地址为VIP,Director通过内部路由后发现是送往本机的,就送往INPUT链,ipvs将检查在INPUT链发现对CIP请求的是集群服务,根据在ipvs中指明的RS1和RS2,并根据内部的调度算法,挑选出一台RS为本次请求服务,此时更改请求报文中的目标地址改成挑选出的RS的IP地址如“CIP:RIP1”,并经由forward链转发出去,在报文到达RS1服务器是源地址是CIP目标地址是RS1的IP地址(即本机的IP地址),本机运行着有用户请求服务,RS1进行报文响应,响应报文的源地址是RIP1,目标地址是CIP,即“RIP1:CIP”;到响应报文达到Director时,Director根据内部的NAT追踪机制,发现用户访问的是CIP,所以Director将进行修改源地址为VIP,报文格式“VIP:CIP”。
lvs-nat架构特性:
(1) RS应该使用私有地址,即RIP应该为私有地址;各RS的网关必须指向DIP;
(2) 请求和响应报文都经由Director转发;高负载场景中,Director易于成为系统瓶颈;
(3) 支持端口映射;
(4) RS可使用任意类型的OS;
(5) RS的RIP必须与Director的DIP在同一网络;
4、lvs-dr
lvs-dr模型即为直接路由;Director在实现转发时不修改请求的IP首部,而是经过直接封装MAC首部完成转发;目标MAC是Director根据调度方法挑选出某RS的MAC地址;拓扑结构有别有NAT类型;
当用户请求到达路由器,路由器通过路由到达交换机,并把用户请求交给Director,Director通过调度至RS服务器,RS服务器在响应是并不通过Director,而是直接经交换机-->路由器送往用户。
在Director服务器的网卡上配置DIP,在网卡别名上配置VIP;在RS服务器上的网卡配置RIP,把VIP配置到RS服务器内部的lo网卡的别名上如lo:1。当用户请求到达时,首先到达路由器,路由器经过路由送往另外一个接口,此接口通过ARP广播,解析到内网中VIP的MAC地址。此时路由器会收到三个VIP的MAC地址,显然这不是咱们但愿获得的结果,咱们得想办法让RS服务器不能响应路由器ARP广播请求解析获得VIP的MAC地址,或者响应了不让响应请求出去;这样就能保证只有Director的VIP会响应ARP广播请求解析VIP的MAC地址。当路由器获得VIP的MAC地址时,路由器会进行封装报文帧,在源报文的基础上加上本身的MAC地址和ARP广播请求解析VIP的MAC地址,而后报文到达Director服务器,Director发现请求的报文是本机的地址,把报文送往INPUT链,ipvs发现这是一个请求的集群服务,根据调度算法挑选出一个RS如RS1,并ARP广播请求解析RS1的RIP地址的MAC获得RS1的RIP地址的MAC地址,源IP地址和目标IP没有变,只是修改源MAC和目标MAC地址变成了Director的和RS1的RIP的Mac地址。当报文送往RS1服务器,RS1服务器判断源IP和目标IP是本身本机上,并响应服务封装报文,源IP是VIP,目标IP是CIP,将报文发送给RS1设置的网关地址路由器接口。
此时会有一个问题,在Linux中由哪块网卡发送出去目标IP就是哪块网卡的IP地址,这里能够要求强求报文必须由lo出去,但lo出不去的,能够经过forward链转发出去的。
架构特性:
(1) 保证前端路由器将目标地址为VIP的请求报文经过ARP地址解析后送往Director;
解决方案:
静态绑定:在前端路由直接将VIP对应的目标MAC静态配置为Director的MAC地址;
arptables:在各RS上,经过arptables规则拒绝其响应对VIP的ARP广播请求;
内核参数:在RS上修改内核参数,并结合地址的配置方式实现拒绝响应对VIP的ARP广播请求;
(2) RS的RIP可使用私有地址;但也可使用公网地址,此时可经过互联网上的主机直接对此RS发起管理操做(不安全);
(3) 请求报文必须经由Director调度,但响应报文必须不能经由Director;
(4) 各RIP必须与DIP在同一个物理网络中;
(5) 不支持端口映射;
(6) RS可使用大多数的OS;
(7) RS的网关必定不能指向Director;
5、lvs-tun
lvs-tun不修改请求报文IP首部,而是经过IP隧道机制在原有的IP报文以外再封装IP首部,经由互联网把请求报文交给选定的RS;
架构特性:
(1) RIP, DIP, VIP都是公网地址;
(2) RS的网关不能,也不可能指向DIP;
(3) 请求报文由Director分发,但响应报文直接由RS响应给Client;
(4) 不支持端口映射;
(5) RS的OS必须得支持IP隧道;
6、lvs-fullnat
lvs-fullnat并非LVS官方的模型,这是由淘宝开发团队开发的一种模型,并无被官方收录至LVS中,要使用lvs-fullnat模型须要从新经内核打补丁,并从新编译内核。
lvs-fullnat:经过请求报文的源地址为DIP,目标为RIP来实现转发;对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发;
架构特性:
(1) RIP,DIP可使用私有地址;
(2) RIP和DIP能够不在同一个网络中,且RIP的网关未必须要指向DIP;
(3) 支持端口映射;
(4) RS的OS可使用任意类型;
(5) 请求报文经由Director,响应报文经由Director;
7、LVS调度算法
类型 | 算法 |
说明 |
静态方法 | RR |
round-robin, 轮询; |
WRR | weighted round-robin, 加权轮询;Overhead=conn/weight | |
SH | Source ip Hashing,源地址哈希;把来自同一个地址请求,通通定向至此前选定的RS; | |
DH | Destination ip Hashing, 目标地址哈希;把访问同一个目标地址的请求,通通定向至此前选定的某RS; | |
动态方法 | LC | least connection:最小链接,Overhead=Active*256+Inactive |
WLC | weighted least connection:加权最小链接,Overhead=(Active*256+Inactive)/weight;默认的调度算法 | |
SED | Shorted Expection Delay:最短时间望延迟,Overhead=(Active+1)*256/weight | |
NQ | Never Queue:永不排序 | |
LBLC | Local-Based Least Connection,基于本地的最小链接:动态方式的DH算法 | |
LBLCR | Replicated LBLC:带复制的LBLCR |
8、LVS-NAT实现
经过前面的原理介绍,这里来实现一下lvs-nat模型,将要使用三台虚拟机,客户端就用物理机来访问;RS-1和RS-2的网卡要使用Vmware Workstation中的仅主机模式,Director要使用两张网卡,一个用于当VIP一个用于当DIP,DIP网卡要使用仅主机模式与后端RS使用一个私有网络地址;
Real Server分别开启Web服务器用于测试,页面就是种RealServer的名称,使用rr调度算法进行轮询,这样更容易看出效果。
8.1 RealServer的配置
(1)配置IP地址及网关
ifconfig 192.168.190.81/24 up #设置IP地址,若是你已经设置好了,此步能够省略的
route add default gw 192.168.190.100 设置默认网关
[root@RS-1 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.190.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.190.100 0.0.0.0 UG 0 0 0 eth0
(2)启动httpd服务
# service httpd start
8.2 Director的配置
(1)配置IP地址
若是你已经设置好了,此步能够省略;
ifconfigeth0 172.16.9.100/16 up ifconfigeth1 192.168.190.100/24 up
(2)开启路由间转发
echo 1 > /proc/sys/net/ipv4/ip_forward [root@LVS ~]# cat/proc/sys/net/ipv4/ip_forward
1
(3)配置LVS
若是你没有安装ipvsadm,须要在配置好yum源以后直接yum install ipvsadm便可;
ipvsadm -C ipvsadm -A -t 172.16.9.100:80 -s rr ipvsadm -a -t 172.16.9.100:80 -r192.168.190.81:80 -m ipvsadm -a -t 172.16.9.100:80 -r192.168.190.82:80 -m
#-C:表示清空ipvsadm中的全部定义的集群服务
#-A:定义集群服务
#-t:承载的应用层协议为基于TCP协议提供服务的协议;其service-address的格式为“VIP:PORT”,如“172.16.100.6:80”;
#-s:指定调度算法,默认为wlc
#-a:建立集群服务上的RS
#-r:指明RS,server-address格式通常为“IP[:PORT]”;注意,只支持端口映射的lvs类型中才应该显式定义此处端口
#-m:指明LVS的类型为nat
[root@LVS ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.9.100:80 rr -> 192.168.190.81:80 Masq 1 0 0 -> 192.168.190.82:80 Masq 1 0 0
(4)在浏览器中访问测试
在浏览器中输入VIP的地址,不断的刷新将会出现轮询的效果。
9、LVS-DR实现
Real Server分别开启Web服务器用于测试,页面就是种RealServer的名称,使用rr调度算法进行轮询,这样更容易看出效果。
9.1 Real Server的配置
各Real Server的配置都是同样的,这们就介绍一个Real Server的配置便可。
(1)抵制ARP对VIP的请求
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
(2)配置VIP地址及路由
ifconfig lo:0 172.16.9.100 netmask255.255.255.255 broadcast 172.16.9.100 up route add -host 172.16.9.100 dev lo:0
(3)启动HTTP服务
service httpd start
(4)在浏览器中访问测试
9.2 Director上的配置
(1)配置VIP
ifconfig eth0:0 172.16.9.100 netmask255.255.255.255 broadcast 172.16.9.100 up route add -host 172.16.9.100 dev eth0:0
(2)配置ipvs服务
ipvsadm-A -t 172.16.9.100:80 -s rr ipvsadm -a -t 172.16.9.100:80 -r 172.16.9.81-g ipvsadm -a -t 172.16.9.100:80 -r 172.16.9.82-g
(3)检查ipvs配置信息
[root@node-03 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.9.100:80 rr -> 17.16.9.81:80 Route 1 0 0 -> 17.16.9.82:80 Route 1 0 0
(4)在浏览器中浏览
不断的刷新将会出现轮询的效果。
完