集群服务器原理: 负载均衡LB LVS 3个模式8算法

负载均衡,英文全称Load Balance,主要用于高并发的请求情况下;我们试想一个web应用并发达到了一万,而一台web服务器能够承受的并发是1000,那么我们是否需要10台web服务器来承担所有的并发请求呢?这就需要LB来实现啦。
那么,我们常用的LB应用有哪些呢?软件层的开源项目有nginx、lvs、keepalived, 商业级的硬件负载设备有F5、Netscale。其中nginx是基于网络分层中的7层, 也就是基于请求URL的。lvs、keepalived都是基于4层HTTP:port的。keepalived自带高可用HA特性,可以结合LVS一起使用。
LB是集群的一种,我们先从集群概念入手来了解吧!

集群概念

集群架构图

首先,我们看一看LB的工作原理。

load balance工作原理
load balance负载均衡原理架构图

用户通过互联网请求了一个IP资源,这个IP请求是直接到一个分发服务器(Director Server)上。DS根据预先设置好的算法,智能均衡将用户请求分发给真正的后端服务器(real server)。那么,这个时候有一个问题,如果分发给不同的机器,是不是意味着数据可能不同呢?那岂不是不同的用户可能看到不同的资源?所以,LB的底部引入了一个共享存储,这样就保证了所有经过分发的不同后端都享用一致的数据。

集群的特点

    高性能performance。一些需要很强的运算处理能力比如天气预报,核试验等。这就不是几台计算机能够搞定的。这需要上千台一起来完成这个工作的。
  1. 价格有效性:通常一套系统集群架构,只需要几台或数十台服务器主机即可,与动则上百王的专用超级计算机具有更高的性价比。
  2. 可伸缩性:当服务器负载压力增长的时候,系统能够扩展来满足需求,且不降低服务质量。
  3. 高可用性:尽管部分硬件和软件发生故障,整个系统的服务必须是7*24小时运行的。

集群的优势

  1. 透明性:如果一部分服务器宕机了业务不受影响,一般耦合度没有那么高,依赖关系没有那么高。比如NFS服务器宕机了其他就挂载不了了,这样依赖性太强。
  2. 高性能:访问量增加,能够轻松扩展。
  3. 可管理性:整个系统可能在物理上很大,但很容易管理。
  4. 4)可编程性: 在集群系统上,容易开发应用程序,门户网站会要求这个。

集群分类及不同分类的特点

计算机集群架构按照功能和结构一般分成以下几类:

  1. 负载均衡集群(Loadbalancingclusters)简称LBC
  2. 高可用性集群(High-availabilityclusters)简称HAC
  3. 高性能计算集群(High-perfomanceclusters)简称HPC
  4. 网格计算(Gridcomputing)

网络上面一般认为是有三个,负载均衡和高可用集群式我们互联网行业常用的集群架构。

负载均衡集群

负载均衡集群为企业提供了更为实用,性价比更高的系统架构解决方案。负载均衡集群把很多客户集中访问的请求负载压力可能尽可能平均的分摊到计算机集群中处理。客户请求负载通常包括应用程度处理负载和网络流量负载。这样的系统非常适合向使用同一组应用程序为大量用户提供服务。每个节点都可以承担一定的访问请求负载压力,并且可以实现访问请求在各节点之间动态分配,以实现负载均衡。多数用于提高并发连接,分担流量压力。

负载均衡运行时,一般通过一个或多个前端负载均衡器将客户访问请求分发到后端一组服务器上,从而达到整个系统的高性能和高可用性。这样计算机集群有时也被称为服务器群。一般高可用性集群和负载均衡集群会使用类似的技术,或同时具有高可用性与负载均衡的特点。

高可用集群(BEARTBEAT实现HA示例)一般是指当集群中的任意一个节点失效的情况下,节点上的所有任务自动转移到其他正常的节点上,并且此过程不影响整个集群的运行,不影响业务的提供。

类似是集群中运行着两个或两个以上的一样的节点,当某个主节点出现故障的时候,那么其他作为从 节点的节点就会接替主节点上面的任务。从节点可以接管主节点的资源(IP地址,架构身份等),此时用户不会发现提供服务的对象从主节点转移到从节点。

高可用性集群的作用:当一个机器宕机另一台进行接管。比较常用的高可用集群开源软件有:keepalive,heardbeat。

高性能计算集群

高性能计算集群采用将计算任务分配到集群的不同计算节点儿提高计算能力,因而主要应用在科学计算领域。比较流行的HPC采用Linux操作系统和其它一些免费软件来完成并行运算。这一集群配置通常被称为Beowulf集群。这类集群通常运行特定的程序以发挥HPCcluster的并行能力。这类程序一般应用特定的运行库, 比如专为科学计算设计的MPI库。

HPC集群特别适合于在计算中各计算节点之间发生大量数据通讯的计算作业,比如一个节点的中间结果或影响到其它节点计算结果的情况。

常用开源集群软件有:lvs,keepalived,haproxy,nginx,apache,heartbeat

常用商业集群硬件有:F5,Netscaler,Radware,A10等

LVS负载均衡集群介绍

负载均衡集群的作用:提供一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载带宽、增加吞吐量,加强网络数据处理能力、提高网络的灵活性和可用性。

  1. 把单台计算机无法承受的大规模的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间,提升用户体验。
  2. 单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。
  3. 7*24小时的服务保证,任意一个或多个设备节点设备宕机,不能影响到业务。在负载均衡集群中,所有计算机节点都应该提供相同的服务,集群负载均衡获取所有对该服务的如站请求。

了解了负债均衡的架构原理(开篇那张图其实就是LVS的基本工作架构),我们看一看LVS的三种工作模式以及8种调度算法。

LVS三种工作模式详解

LVS一共有3种工作模式,他们分别是NAT/TUN/DR。我们下面一一来看一看。

LVS NAT工作模式

在NAT模式下,调度器将请求的目标IP即VIP地址改为Real Server的IP,返回的数据也是经过调度器的,这个时候调度器再把源地址修改为VIP。 它其实是通过iptables的NAT转发实现的。

LVS NAT工作流程
LVS NAT工作流程

原理图流程简述:

  1. 客户端请求数据,目标IP为虚拟IP(VIP)
  2. 请求数据到达LB服务器(调度器),LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
  3. 数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。
  4. 收到RS返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。
  5. 客户端收到的就只能看到VIP\DIP信息。
NAT模式的优缺点
  • NAT技术将请求的报文和响应的报文都需要通过LB进行地址改写,因此网站访问量比较大的时候LB负载均衡调度器有比较大的瓶颈,一般要求最多只能10-20台节点。
  • 只需要在LB上配置一个公网IP地址就可以了。
  • 每台内部的节点服务器的网关地址必须是调度器LB的内网地址。
  • NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。

TUN模式

IP Tunneling模式下,调度器将请求来的数据包封装加密通过ip隧道转发到后端的RS上,而RS会直接将数据反馈给前端请求用户,而不再经过调度器。显然,它主要为了解决NAT模式下请求和响应的频繁发包(调度器每次都要地址重写负担重)。TUN工作模式下集群系统的最大吞吐量可以提升10倍。

首先要知道,互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项。

LVS IP Tunneling工作模式
LVS IP Tunneling工作模式

Tunneling工作流程如下
  1. 客户请求数据包,目标地址VIP发送到LB上。
  2. LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
  3. RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
  4. 响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。

负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

IP隧道模式的RS节点都需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。

DR模式(Virtual server via direct routing直接路由模式)

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真是服务器响应后的处理结果直接返回给客户端前端用户。 同Tunneling模式一样,DR模式可以缓解调度器的I/O压力,同样提升了集群系统的伸缩性。

况且走路由的模式,DR模式就没有必须IP协议隧道的要求,这样带来的好处是RS服务器可以跨操作系统。但是调度器LB与真实服务器RS都有一块网卡连接在同一个物理网段上,即同一个LAN局域网。由于出色的性能,DR模式是使用比较多的。

负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上。

LVS工作模式DR
LVS工作模式之Direct Routing

DR工作模式过程

根据上图的传输过程,我们可以看出,它的链接调度和管理与NAT/TUN一样,但是报文转发方法就不同了。它直接将报文路由给目标真实服务器。调度器根据各个真实服务器的负载情况,例如连接数等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不会封装报文,而是将请求报文的数据帧目标MAC地址直接修改成为真实服务器的MAC地址,然后再将修改的数据帧在服务器组所处局域网上发送。

可想而知,因为数据帧的MAC地址就是真实服务器MAC地址,又处于同一局域网,那么根据局域网通讯原理,这种真实复位是一定能够收到由LB发出的数据包的。真实服务器接收都请求数据包的时候,解开IP包头查看的目标IP是VIP,紧接着真实服务器请求响应,根据自己的路由信息将数据包直接反馈给前端客户机,并且源IP仍然是VIP。

上面的过程有一个地方需要注意的:真实服务器接收数据包报文的时候,只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口ARP响应关闭掉。

按部就班的过程如下:

  1. 通过在调度器机器上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。
  2. 请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
  3. 因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
  4. RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。
  5. RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
  6. 由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。

三种模式对比 – 官方

工作模式 VS/NAT VS/TUN VS/DR
Real server Config dr gw Tunneling Non-arp device/tie vip
Server Network Private LAN/WAN LAN
Server number Low 10-20 High 100 High 100
Real server gateway Load balance Own router Own router
优点 地址和端口转换 Wan环境加密数据 性能最高
缺点 效率低 需要隧道支持 不能跨域LAN

LVS三种工作模式基本介绍完毕,大家可以参考更加权威的官方文档http://www.linuxvirtualserver.org/zh/lvs3.html

LVS八种连接调度算法

除了负载分发三种IP均衡技术,我们还需要了解调度器分发时候的是如何来决定RS的。那么,这就牵涉到LVS调度的八种算法啦。 我们先简单列举如下:

  1. 轮询算法(RR – Round Robin Scheduling)就是按依次循环的方式将请求调度到不同的服务器上[i=(i+1) mod n],该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器。这是一种无状态调度。实际应用中,我们可以将一个服务器权重设0,从而移出。
  2. 加权轮询算法(WRR – Weighted Round-Robin Scheduling)主要是对轮询算法RR的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。WRR解决了各个RS性能不一致的问题。
  3. 最小连接调度算法(LC – Least-Connection Scheduling)将把请求调度到连续数量最小的服务器上。这是一种有状态的动态算法。
  4. 加权最小连接算法(WLC – Locality-Based Least Connections Scheduling)则是给每台服务器一个权值,调度器会尽可能保持服务器连接数量与权值之间的平衡
  5. 基于局部性的最少连接调度算法(LBLC)是请求数据包的目标IP地址的一种调度算法,该算法先根据请求的目标IP地址寻找最近的该目标IP地址所有使用的服务器,如果这台服务器依然可用,并且用能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其他可行的服务器。这个算法主要用于有缓存机制的集群中,有效解决了局部和主存Cache的命中率
  6. 带复杂的基于局部性最少的连接算法(LBLCR – Locality-Based Least Connections with Replication Scheduling)激励的不是一个目标IP与一台服务器之间的连接记录,他会维护一个目标IP到一组服务器之间的映射关系,防止单点服务器负责过高。LBLCR同样用于Cache集群系统,与LBLC算法不同之处是LBLC只是目标IP和RS的一对一单点映射。
  7. 目标地址散列调度算法(DH – Destination Hashing Scheduling)也是根据目标IP地址通过散列函数将目标IP与服务器建立映射关系,这是一种静态映射算法,通过一个散列HASH函数将一个目标IP映射到一台服务器。 优先分发HASH KEY对应的静态散列表中对应的服务器。如果该服务器可用且未超载,请求被分发到该服务器。
  8. 源地址散列调度算法(SH = Source Hashing Scheduling)与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源

前4中相对较为简单容易理解,LBLC和LBLCR用于Cache集群,而DH和SH则多见于防火墙集群中(两者结合使用)。另外,不难看出RR、WRR、DH、SH是固定调度算法,而WLC、LC、LBLC、LBLCR则为动态调度算法。
八大调度算法的官方文档见http://www.linuxvirtualserver.org/zh/lvs4.html