linux负载均衡服务器LVS学习笔记

一、概述
    LVS是一套集成在Linux内核中的负载均衡服务。LVS通过部署负载均衡服务器在网络层截获并修改报文并依据一定规则分发给服务器集群中服务器来实现负载均衡。LVS集群的体系图如下图所示:

    它主要由三部分组成:
    负载调度器:它是集群中面向客户的服务器。它把自己伪装成客户要请求的服务器,并截获客户的报文,按照一定的规则将报文转发至它背后的真实服务器(real server)。它拥有一个对外服务的地址Virtual Address,所有的客户都会认为这个地址就是web服务器的唯一地址,它们会将请求发送至这个地址。负载调度器收到用户的报文后再根据调度算法将报文转发给背后的真实服务器。真实服务器和负载调度器之间可以是通过LAN或者WAN相连。
    服务器集群:这是由若干台真正向客户提供服务的真实服务器组成的集群。它们接受并处理来自负载调度器的客户请求报文。集群中的服务器可以动态的增减,这也是LVS的强大可伸缩性的体现。
    后端存储:为服务器集群提供一个共享的存储区。通常是通过分布式存储技术实现,让多个服务器共享一块巨大的存储空间。
    Graphic Monitor:用于监控整个集群的运行状态。
    负载调度器采用基于IP和基于内容调度结合的方式。即为每个连接分配一个服务器,属于同一个连接的数据会被分配到同一个服务器。
    LVS有着非常高的可用性,LVS会采用心跳检测(HearBeat Deamon)来检测服务器集群的状态,如果有服务器失效,LVS会立刻将该服务器移出服务器列表并不再将数据转发至该服务器。对于负载调取服务器本身,LVS可以实现两台负载调度器形成主备,如果主调度器失效,可以立刻切换至备调度器。
二、负载调度器的实现(三种负载均衡方法)
    LVS的核心就在于负载调度器的实现。LVS的负载调度器主要使用IPVS(IP虚拟服务器)实现,即基于IP包对数据进行调度。LVS中主要有三种负载均衡技术:
    1、通过NAT实现虚拟服务器(VS/NAT)
    这种情况下负载调度器收到用户的数据后,会通过NAT技术把数据包的目的地址和端口号改成某台真实服务器的地址和端口号并转发给真实服务器。真实服务器处理请求后将响应返回给负载调度器,并由调取器进行再次NAT后发给用户。同时,当有一个请求到来后,负载调度器会在连接hash表中记录这个连接,当这个连接的下一个报文到达后,直接从hash表中取出选好的服务器地址和端口号进行更写,以保证同一个请求的数据总是到达同一个服务器。
    这种方案是LVS中最简单可行的一种方案,但是这种方案下所有的请求、响应数据都要经过负载调度器,这容易使负载调度器成为系统的瓶颈。
    2、通过IP隧道实现虚拟服务器(VS/TUN)
    该方案下真实服务器可以直接将响应发给客户而不必经过负载调度器,负载调取器只负责转发请求包,这就大大减轻了负载调度器的负担。该方案下负载调度器将请求报文通过隧道封装后发给真实服务器,封装后的报文的目的地址变为真实服务器,同时内层报文包含目的地址为Virtual Address的报头。真实服务器将报头解开处理后直接将响应的源地址设为Virtual Address(而非真实服务器自己的实际地址)并发给客户。这样客户会以为与自己通信的一直是一台服务器。
    3、通过直接路由实现虚拟服务器(VS/DR)
    类似于TUN,这种方案下负载调度器也是只负责转发请求包。但是区别在于负载调度器不再对数据进行隧道封装,而是会直接把数据包的MAC地址改为真实服务器的MAC地址并转发给真实服务器。但是由于是通过修改MAC地址转发,所以负载调度器必须和真实服务器集群位于同一个个网段。
    三种方法的比较如下:

    三种方法中DR的效率最高但是对环境有要求,NAT的效率最低但是实现最简单方便。TUN的效率也非常高,但是需要集群的服务器支持隧道封装技术。
三、负载调度算法  
    1、内核中的调度算法
    IPVS在内核中的调度算法主要是以连接为粒度的。同一个连接的所有数据都会被发往同一个服务器,同一个用户的不同连接的数据则可能会发往不同的服务器。目前主要有以下八种调度算法:
    轮叫调度:到来每个连接轮流分配给各个服务器。即每次调度执行i = (i + 1) mod n选择第i台服务器。适合各个服务器能力均等的情况。
    加权轮叫调度:在轮叫调度的基础上对每个服务器引入权重。
    最小连接调度:把新连接分配到活跃连接数最小的服务器上。需要监控每个服务器的活跃连接数。该算法可以避免处理时间长的请求集中在一台服务器上。但是由于TCP协议2分钟TIME-WAIT状态的存在,这个算法的效率不见得理想。
    加权最小连接调度:在最小连接调度算法的基础上引入权重。
    基于局部性的最小连接:将相同目的IP的数据调度到同一服务器,通常用于cache集群(cache集群中请求的目的IP常变)
    带复制的基于局部性的最小连接:与上一个的不同在于映射到一组服务器而非一个
    目标地址散列调度:通过Hash函数将目的IP映射到一台服务器上进行服务。
    源地址散列调度:用源地址进行映射
    2.动态反馈负载均衡算法
    在调度的同时考虑服务器的实时负载和响应情况,动态调整每个服务器的处理比例。
四、IPVS的实现
    IPVS的实现主要是通过Linux的Netfilter模块。IPVS通过在Netfilter模块中的LOCAL_IN和FORWARD两个钩子处挂接处理函数来截获数据包并对数据包进行响应修改以实现调度功能

你可能感兴趣的:(负载均衡,负载均衡)