LVS介绍

Linux集群

Linux集群(cluster)就是一组Linux计算机,它们作为一个整体向用户提供一组网络资源,这些单个的计算机系统就是集群的节点(node)。一个理想的集群,用户是不会意识到集群系统底层的节点的,在他们看来,集群是一个系统,而非多个计算机系统,并且集群系统的管理员可以随意增加和删改集群系统的节点。
  Linux集群系统的优点主要有4方面:
1、易于扩展,管理员可很方便的增加或删除集群系统中的节点。
2、高可用性,当集群中某一个节点失效时,其负责的任务可以传递给其他节点,有效避免单点故障。
3、高性能,负载均衡的集群系统能够承担极大的并发客户请求。
4、高性价比,可以使用相对廉价的硬件构造出高性能的系统。
  常见的Linux集群类型包括:
1、LB:Load Balancing,负载均衡集群
负载均衡集群中有调度器(Director),它处在多台内部服务器的上层,根据定义的调度方式从下层的服务器组中选择一台来响应客户端发送的请求。
2、HA:High Availability,高可用性集群
顾名思义就是服务的可用性比较高,当某台服务器故障后不会造成所提供的服务中断,集群自动将客户的访问请求转交给一个正常工作的服务器。
3、HP:Hight Performance,高性能
高性能的集群是当某一项任务计算量非常大的时候,由一个计算机集群共同来完成这项任务,这种 处理方式我们称为并行处理机制。一般高性能集群用于科研工作方面。
  常见的Linux集群扩展类型(组建方式)有:
1、scale up(纵向扩展):通过增加硬件资源,即增加更好的设备来满足性能消耗的需求。但是此方式性价比很低。
2、scale out(横向扩展):通过硬件或软件的方式,将由单一服务器负责的业务需求转为一组节点服务器来进行处理,此种方式易于扩展且性价比高。

LVS,Linux Virtual Server

初步认识Linux Cluster后,我们进一步介绍负载均衡集群技术LVS(Linux Virtual Server)。

  LVS是章文嵩博士发起的自由软件项目,它的官方站点是http://www.linuxvirtualserver.org。LVS工作在内核空间,实现TCP/IP协议群的四层路由,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但从Linux2.4内核以后已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
  LVS采用三层结构:调度器、服务器池、共享存储,结构如下图:


负载调度器(load balancer/Director):由一台或多台负载调度器组成,主要作用类似一个路由器,将用户请求分发给服务器池上的real server;
服务器池(server pool/Realserver):一组真正执行客户请求的服务器,执行的服务一般有WEB、MAIL、FTP和DNS等。
共享存储(shared storage):为服务器池提供一个共享的存储区,能使得服务器池拥有相同的内容,提供相同的服务。

  LVS需要在内核的TCP/IP协议栈对数据流进行过滤筛选,这就需要有内核的模块来支持,而这样的过滤转发规则又是由用户进行定义的,我们可以认为LVS是两段式的架构,在内核空间中工作的是”ipvs”,而在用户空间中工作的,用来定义集群服务规则的是”ipvsadm”。

  LVS集群类型相关术语:

      

  LVS集群的类型:

  lvs-nat:修改请求报文的目标IP;MASQUERADE类型
  lvs-dr(direct routing):重新封装新的MAC地址,默认使用的类型; GATEWAY类型
  lvs-tun(ip tunneling):在原请求IP报文之外新加一个IP首部;IPIP类型
  lvs-fullnat:修改请求报文的源和目标IP

lvs-nat
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT来实现转发。
实现要点:
(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;
(2)请求报文和响应报文都必须经由Director转发;极高负载的场景中,Director可能成为系统瓶颈;
(3)支持端口映射,可修改请求报文的目标PORT;
(4)VS必须是Linux系统,RS可以是任意系统
图解:

     

1、客户端访问集群的VIP,请求WEB资源(请求报文:源地址为CIP,目标地址为VIP);
2、Director收到客户端的请求报文,会修改请求报文中的目标地址(VIP)为RIP,并且将请求根据相应的调度算法送往后端WEB服务器(请求报文:源地址CIP,目标地址为RIP);
3、WEB服务器收到请求,检查报文是访问自己的而自己也提供WEB服务,就会响应这个请求报文,并发送给Director(响应报文:源地址RIP,目标地址CIP);
4、Director收到WEB服务器的响应报文,会根据自己内部的追踪机制,判断出用户访问的是VIP,此时会修改源地址为VIP并响应客户端请求(响应报文:源地址VIP,目标地址CIP)。

 nat模型优劣势:
  优势:节点服务器使用私有IP地址,与负载调度器位于同一个物理网络,安全性比DR模式和TUN模式要高。
  劣势:调度器位于客户端和集群节点之间,并负责处理进出的所有通信(压力大的根本原因),大规模应用场景中,调度器容易成为系统瓶颈。

lvs-dr:lvs的默认模式
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
要点:
(1)Director和各RS都得配置使用VIP;
(2)确保前端路由器将目标IP为VIP的请求报文发往Director:通过在RS上修改内核参数以限制arp通告及应答级别(arp_announce及arp_ignore);
(3)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;VIP配置在DR上的时候,应该是在eth0:0上,在RS上配置VIP的时候,就必须是lo:0了,否则达不到让RS不响应VIP的ARP通告的效果。
(4)RS跟Director要在同一个物理网络即同一广播域;
(5)请求报文要经由Director,但响应不能经由Director,而是由RS通过网关直接发往Client;
(6)不支持端口映射
图解:

      

1、客户端CIP的请求发送给Director调度器的VIP;
2、Director调度器收到客户端的请求包后,将数据包的MAC地址改成Director调度器选择的某一台RS的MAC地址,并通过交换机(数据链路层)发送给RS服务器(因为MAC地址是RS的MAC地址,所以,RS可以接收到该数据报),注意:此时数据包的目的及源IP地址没有发生任何改变;
3、 (1) RS的数据链路层收到发送来的数据报文请求后,会从链路层往上传给IP层,此时IP层需要验证请求的目标IP地址。因为包的目标IP(即VIP)并不是像常规数据报那样为RS的本地IP,而仅仅目的MAC地址是RS的。所以,在RS上需要配置一个VIP的LoopbackDevice,是因为LoopbackDevice是服务器本地使用的网络接口,对外是不可见的,不会跟Director的VIP冲突;
(2) RS处理数据包完成后,将应答直接返回给客户端(源IP为VIP,目标IP为CIP),响应的数据报不再经过Director调度器。因此如果对外提供LVS负载均衡服务,则RS需要连上互联网才能将应答包返回给客户端。RS最好为带公网IP的服务器,这样可以不经过网关直接回应客户;如果多个RS使用了同一网关出口,网关会成为LVS架构的瓶颈,会大大降低LVS的性能。

 dr模型优劣势:
  优势:负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端,大大提高了服务器并发能力。
  劣势:(1) LVS-RS间必须在同一个VLAN; (2) RS上绑定VIP,风险大。

lvs-tun:
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)。
要点:
(1)DIP,VIP,RIP都应该是公网地址;
(2)RS的网关不能,也不可能指向DIP,在RS的lo别名网卡上配置vip地址;
(3)请求报文要经由Director,但响应不能经由Director;
(4)不支持端口映射;
(5)RS的OS得支持隧道功能
图解:

      

1、用户发送请求到Director的VIP请求服务;
2、当用户请求到达Director的时候,根据调度算法选择一台RS进行转发,这时使用隧道(tun)封装两个IP首部,此时源IP是DIP,目标IP是RIP;
3、当RS接收到数据报后,看到外层的IP首部,目标地址是自己,就会拆开封装,解析完毕后,发送响应报文,源IP是VIP,目标IP是CIP。

 tun模型优劣势:

  优势:实现了异地容灾,避免了一个机房故障导致网站无法访问。
  劣势:RS配置复杂。

lvs-fullnat:
通过同时修改请求报文的源IP地址和目标IP地址进行转发
要点:
(1)VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;
(2)RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client;
(3)请求和响应报文都经由Director;
(4)支持端口映射;
(5)lvs-fullnat型lvs默认不支持需更换支持的内核
图解:

       

1、客户端将请求发送给Director的VIP请求服务;
2、VIP通过调度算法,将请求发送给后端的RS,这个时候源地址改成DIP,目标地址改成RIP;
3、RS接收到请求后,由于源地址是DIP,则一定会对DIP进行回应;
4、Director收到RS的响应后,修改数据报的源地址为VIP,目标地址为CIP进行响应。

注意:此调度方式还没有正式被Linux官方录入系统标准库,所以如果向使用此模式,需要去lvs官网下载源码,并且需要重新编译系统内核才可使用。

  LVS的调度算法:

静态调度算法:根据算法本身进行调度
rr:roundrobin,轮询,调度器将外部请求轮流分配到集群中的节点中;
wrr:Weighted RR,加权轮询,调度器根据事先设置的权重来分配外部请求到集群中的节点;
sh:Source Hashing,实现session sticky,源IP地址hash,将来自同一个IP的请求始终发往第一次挑中的真实服务器IP,从而实现会话绑定;
dh:Destination Hashing,目标地址hash,将发往同一个目标地址的请求始终转发至第一次挑中的真实服务器IP,典型使用场景是正向代理缓存场景中的负载均衡

动态调度算法:根据真实服务器当前的负载状态及调度算法进行调度
lc:least connections,调度器通过lc调度算法动态地将网络请求调度到已建立连接最少的服务器上;
wlc:Weighted Least Connections,调度器通过wlc调度算法根据事先设置的权重优化负载均衡调度,具有较高权重的服务器将承受较大比例的连接请求;
sed:Shortest Expection Delay,在wlc基础上改进,Overhead=(activeconns+1)*256/权重;
nq:Never Queue Scheduling,如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空闲;
lblc:locality-based least-connection,基于地址的最小连接数调度,将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑;
lblcr:Locality-Based Least Connections with Replication,带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与lblc算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而lblc算法维护从一个目标IP地址到一台服务器的映射。
posted @ 2018-07-19 17:43  Mr_Walker  阅读(1911)  评论(0编辑  收藏