LinuxCluster

Posted by Mathew on 2017-02-11

Linux Cluster

  目前来讲,系统的扩展方式有如下两种:

  • scale up:向上扩展,提升服务器的硬件性能来应对性能不足的问题
  • scale out:向外扩展,新增服务器和现有服务器组成集群来应对性能不足的问题

集群类型

  • LB:负载均衡集群,Load Banlancing
  • HA:高可用集群,High Availability
  • HP:高性能集群,High Performancing

LB集群的实现:

硬件层实现:

  • F5 BIG-IP
  • Citrix NetScaler
  • A10 A10
  • Array
  • RedWare

软件层实现:

  • lvs
  • haproxy
  • nginx
  • ats (apache traffic server)
  • perbal

基于工作的协议层次划分:

  • 传输层:
    • lvs,haproxy(mode tcp)
  • 应用层:
    • haproxy,nginx,ats,perbal

LVS工作模型和调度算法详解

什么是LVS

  由之前就职于与淘宝的 章文嵩 博士(花名:正明)所研发一款开源软件。 LVS(Linux Virtual Server
  为更好的理解LVS,我们先来解释下相关的术语:

  • Director:负载均衡器,负责在前端接受用户请求根据指定的算法转发到后端的Real Server
  • Real Server:后端提供服务的服务器
  • VIP:Director接受用户请求的IP地址
  • DIP:Director和Real Server 联系的IP地址
  • RIP:Real Server的IP地址
  • CIP:Client IP,客户端的IP地址

LVS的结构

  LVS由前端的负载均衡器(Load Banlancing,LB)和后端的真实服务器(Read Server,RS)组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS集群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。

LVS内核模型

1. 当客户端的请求到达负载均衡器的内核空间时候,首先会到达PREROUTING链。
2. 当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
3. LVS由内核空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口号没有在规则里面,那么这条数据包将被放行至用户空间中。
4. 如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
5. 最后经由POSTROUTING链发往后端服务器。

LVS其实由两个组件构成,用户空间的ipvsadm和内核空间的ipvs,ipvs工作在INPUT链上,如果有请求报文被ipvs事先定义,就会将请求报文直接截取下根据其特定的模型修改请求报文,再转发至 POSTROUTING 链上送出TCP/IP协议栈

LVS的包转发模型

NAT 模型

(1). 当客户端将请求发往前端的负载均衡器时,请求报文源地址是CIP(客户端IP),目标地址是VIP(负载均衡前端地址,后面统称为VIP)。
(2). 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
(3). 报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将相应报文返还给LVS。
(4). 然后LVS将此报文的源地址修改为本机并发送给客户端。注意:NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端。

	实现NAT模型有几点需要注意的:
		1、RS和Director IP应该使用私网地址
		2、RS的网关必须指向DIP
		3、可以实现端口映射
		4、请求报文和响应报文都要经由director转发;极高负载的场景中,director可能会成为系统瓶颈
		5、RS可以是任意OS
		6、DIP和RIP必须在同一IP网络

DR模型

DR模型实现原理

  DR(Direct routing)模型是一个较为复杂的模型. DR模型比较诡异, 因为VIP在Director和每一个RS上都存在, 客户端对VIP(Director)请求时, Director接收到请求, 会将请求报文的源MAC地址和目标MAC地址修改为本机DIP所在网卡的MAC地址和指定的RS的RIP所在网卡的MAC地址, RS接收到请求报文后直接对CIP发出响应报文, 而不需要通过Director 。

DR模型工作流程
(1). 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址是VIP
(2). 负载均衡器收到报文后,发现请求的是规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己的DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
(3). RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

实现DR模型需要注意的

1、RS和Director可以不在统一IP网段中,但是一定要在同一物理网络中
2、请求报文经由Director调度,但是响应报文一定不能通过Director
3、RS的网关不能指向Director(DIP)
4、不支持端口映射
5、RS可以是大部分操作系统
6、DIP和RIP可以是公网地址
7、保证前端路由器将目标IP为VIP的请求报文发送给director

TUN模型

TUN模型实现原理
    TUN模型通过隧道的方式在公网中实现请求报文的转发,客户端请求VIP(Director),Director不修改请求报文的源IP和目标IP,而是在IP首部前附加DIP和对应的RIP的地址并转发到RIP上,RS收到请求报文,本地的接口上也有VIP,于是直接响应报文给CIP。

TUN的工作流程
(1). 客户端将请求发往前端负载均衡器,请求报文源地址是CIP,目标地址为VIP。
(2). 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
(3). RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理此请求报文,并将响应报文通过lo接口送给eth0网卡直接送给客户端。

FULLNAT模型

FULLNAT实现原理
   FULLNAT是近几年才出现的,客户端请求VIP(Director),Director修改请求报文的源地址(DIP)和目标地址(RIP)并转发给RS,FULLNAT模型一般是Director和RS处在复杂的内网环境中的实现。
FULLNAT工作流程
(1). 客户端请求VIP
(2). Director接受到请求,通过调度算法得出转发的RS,将源地址修改为DIP,目标地址修改为对应的RIP,转发给RS
(3). RS接收到请求后,响应请求给DIP,DIP将响应报文源地址改为VIP,目标地址改为CIP,响应给CIP

LVS调度算法

LVS调度方法分为静态和动态两类

  1. 静态(4种):只根据算法本身进行调度,而不考虑后端服务器的实际连接情况和负载情况

    (1) RR:轮叫调度(Round Robin)
    	 调度器通过”轮叫“调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
    (2) WRR:加权轮叫(Weight RR)
          调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态的调整其权值。
    (3) DH:目标地址 hash(Destination Hash)
          目标地址散列:根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
    (4) SH:源地址 hash(Source Hash)
    	   源地址散列:调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
    
  2. 动态算法(6种):根据算法及各RS的当前负载状态进行调度

    (1) LC:最少链接(Least Connections)
      调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
    (2) WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
      在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
    (3) SED:最短延迟调度(Shortest Expected Delay )
      在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
    (4) NQ永不排队/最少队列调度(Never Queue Scheduling NQ)
      无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。
    
    (5) LBLC:基于局部性的最少链接(locality-Based Least Connections)
      基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
    (6) LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
    	带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
    

本文简单介绍了LVS的工作模型和调度算法,纯理论,下面几篇博客会介绍LVS的应用。