LVS简介
LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统。该项目由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
负载均衡技术有很多实现方案,如基于DNS域名轮流解析的方法、基于客户端调度访问的方法、基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的就是IP负载均衡技术。
LVS的IP负载均衡技术是通过ipvs内核模块来实现的,ipvs是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问集群服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是ipvs实现的重点技术,ipvs实现负载均衡机制有四种,分别是NAT、TUN和DR以及后来经淘宝开发的FullNat。
LVS的工作机制
lvs分为两个部件:ipvs和ipvsadm
ipvs:工作于内核空间,主要用于使用户定义的策略生效
ipvsadm:工作于用户空间,管理集群服务的命令行
如上图所示,ipvs工作于内核空间的INPUT链上,当收到用户的请求为某集群服务时,通过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。
LVS的三种工作类型
LVS有三种工作类型:
NAT:地址转换
DR:直接路由
TUN:隧道
各类术语介绍:CIP为客户端IP,VIP为虚拟ip,DIP为Director的ip,RIP为后端服务器的ip
LVS的NAT模型
此模型中,DR需要配置两个网卡分别为vip(公网地址:114.100.80.10)和Dip(私网地址:101.0.0.10),VIP只需要配置到DR上,而DIP需设置为后端服务器的网关地址。
它的工作机制:
①用户发出访问请求,此时源地址:CIP(200.10.10.1),目标地址为VIP(114.100.80.10);
②当DR收到用户的请求,并发现该请求为集群服务请求,则运用LVS调度算法选择后端一台服务器进行响应,并将请求报文目标地址(vip:114.100.80.10)转换成经调度算法计算得出的后端主机IP(RIP:10.0.0.1)地址。此时源地址为CIP(200.10.10.1),目标地址转换为RIP(10.0.0.1);
③后端主机(RIP:10.0.0.1)收到请求后,对该请求进行响应,并发送报文至DR,此时源地址为RIP(10.0.0.1),目标地址为CIP(200.10.10.1);
④由于响应的目标地址为CIP(200.10.10.1),后端服务器无法直接响应client,需要DR将源地址(RIP:10.0.0.1)转换成VIP(114.100.80.10)的地址进行发送响应报文,转换后源地址为VIP(114.100.80.10),目标地址为CIP(200.10.10.1);
NAT的特性:
1> RS应该使用私有地址;
2> RS的网关的必须指向DIP;
3> RIP和DIP必须在同一网段内;
4> 请求和响应的报文都得经过Director;在高负载场景中,Director很可能成为系统性能瓶颈;
5> 支持端口映射;
6> RS可以使用任意支持集群服务的OS;
LVS的DR模型
该类型中,DR上依旧配置有DIP和VIP,VIP配置在网卡别名上。每个RS都有自己的RIP以及在回环别名网卡中配置VIP,但是RS的vip隐藏起来,并不接收任何请求,只有在响应客户端请求时作为源地址使用。
1)client(200.10.10.1)向目标VIP(114.100.80.10)发出请求,通过ARP协议进行广播,找到DR,Director接收。此时源地址为CIP(200.10.10.1),目标地址为VIP(114.100.80.10);
2)DR接受请求后,发现该请求为集群服务,LVS根据负载均衡算法选择一台active的RS,并通过ARP协议进行广播获取RS的MAC(00:0c:29:d2),而后将原来的MAC首部拆除重新封装,将选中的RS的网卡的mac地址作为目标mac地址。此时源地址为CIP,目标地址VIP,但VIP的MAC地址已经更改为RS的MAC地址。
3)RS在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文.随后重新封装报文,发送给客户端.此时源地址为RS中的VIP,目标地址为CIP。
当我们分析上面两个网络模型的数据报时会发现一些问题:
1)由于vip需要在每台主机中配置,如何保证ARP请求报文不会被交换机或其它网络设备知道?
2)如何保证ARP通告报文不被交换机或其它网络设备知道?
3)由于RS只有一个网络接口,而linux内核默认情况下包封装时是从哪个网口出去那个网口就是源地址,如何确保RS转发出来的报文源IP是VIP,而不是RIP?
4)因为DR与RS都配置有相同的VIP,如何避免各主机VIP广播,造成无法通信?
解决办法:
1)Linux内核有两个关于ARP对待请回报文与通告报文的参数(arp_announce/arp_ignore),可以设定相应的级别来规避上述问题中的1、2两点;
2)对于问题3,我们可以在数据报封装后指定路由经lo别名上的接口发送出去然后再通过eth0网卡转发出去;
3)对于问题4,我们只需要设定vip的广播地址为它自己即可;
DR的特性:
1> 集群节点跟Director必须在同一个物理网络中;
2> RIP可以为公网地址,实现远程管理;
3> DR只负责入站请求,响应报文由RS直接发送给客户端;
4> RS不能将网关指向DIP;
5> 不支持端口映射;
6> RS可以使用任意支持集群服务的OS;
LVS-TUN
在数据包必须传递到另一个网络或因特网上时,可以使用ip隧道,ip隧道能够将数据包从一个子网或虚拟局域网(VLAN)转发到另一个子网或虚拟局域网(VLAN),建立ip隧道是Linux内核功能的一部分,LVS-TUN转发方法允许你将集群节点放在与Director不同的网络上。
请留意DR将数据包转发给RS时的IP数据报文;由于DR,RS都不在同一局域网内,而DR要将client请求报文转发给RS时,DR是直接在数据包中直接添加IP首部(源IP:DR和目标IP:RS),这样就是隧道技术了。
同样,该模型下RS都将配置VIP地址,且不能被外界所获知VIP存在于RS上;
参考:http://junwang.blog.51cto.com/5050337/1439428