【系统架构】三大主流软件负载均衡器(LVS、Nginx、HAproxy) 与商业SLB比较

主流软件负载均衡概要:

1、LVS:

    1. 抗负载能力强,性能高,能达到F5的60%,对内存和CPU资源消耗比较低
    2. 工作在网络4层,通过VRRP协议(仅作代理之用),具体的流量是由linux内核来处理,因此没有流量的产生。
    3. 稳定,可靠性高,自身有完美的热备方案(Keepalived+lvs)
    4. 不支持正则处理,不能做动静分离。
    5. 支持8种负载均衡算法:rr(轮询)、wrr(带权轮询)、lc(最小连接)、wlc(带权最小连接)、 lblc(基于局部性的最少连接调度算法)、lblcr(复杂的基于局部性最少的连接算法)、dh(目标地址散列调度算法 )、sh(源地址散列调度算法 )
    6. 配置相对复杂,对网络依赖比较大,稳定性很高。
    7. LVS工作模式有4种:
        (1) nat 地址转换
        (2) dr 直接路由
        (3) tun 隧道
        (4) full-nat 

2、Nginx:

   1. 工作在网络7层,可以针对http应用做一些分流的策略,比如针对域名,目录结构
    2. Nginx对网络的依赖较小,理论上能ping通就能进行负载功能
    3. Nginx安装配置比较简单,测试起来很方便
    4. 也可以承担较高的负载压力且稳定,nginx是为解决c10k问题而诞生的
    5. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测
    6. Nginx对请求的异步处理可以帮助节点服务器减轻负载压力
    7. Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
    8. 不支持Session的直接保持,但能通过ip_hash来解决。对Big request header的支持不是很好。
    9. Nginx还能做Web服务器即Cache功能。

第6点补充:
    什么是nginx的异步处理:
        squid同步处理:浏览器发起请求,而后请求会立刻被转到后端,于是在浏览器和后台之间就建立了一个通道。从请求发起直到请求完成,这条通道都是一直存在的。
        nginx异步处理:浏览器发起请求,请求不会立刻转到后端,而是请求数据(header)先收到nignx上,然后nginx再把这个请求发到后端,后端处理完成后把数据返回到nginx上,nginx将数据流发到浏览器。

    使用异步处理的好处:
        1. 假设用户执行一个上传文件操作,因为用户网速又比较慢,因此需要花半个小时才能把文件传到服务器。squid的同步代理在用户开始上传后就和后台建立了连接,半小时后文件上传结束,由此可见,后台服务器连接保持了半个小时;而nginx异步代理就是先将此文件收到nginx上,因此仅仅是nginx和用户保持了半小时连接,后台服务器在这半小时内没有为这个请求开启连接,半小时后用户上传结束,nginx才将上传内容发到后台,nginx和后台之间的带宽是很充裕的,所以只花了一秒钟就将请求发送到了后台,由此可见,后台服务器连接保持了一秒。同步传输花了后台服务器半个小时,异步传输只花一秒,可见优化 程度很大。
        2. 在上面这个例子中,假如后台服务器因为种种原因重启了,上传文件就自然中断了,这对用户来说是非常恼火的一件事情,想必各位也有上传文件传到一半被中断的 经历。用nginx代理之后,后台服务器的重启对用户上传的影响减少到了极点,而nginx是非常稳定的并不需要常去重启它,即使需要重启,利用kill -HUP就可以做到不间断重启nginx。
        3. 异步传输可以令负载均衡器更有保障,为什么这么说呢?在其它的均衡器(lvs/haproxy/apache等)里,每个请求都是只有一次机会的,假如用 户发起一个请求,结果该请求分到的后台服务器刚好挂掉了,那么这个请求就失败了;而nginx因为是异步的,所以这个请求可以重新发往下一个后台,下一个 后台返回了正常的数据,于是这个请求就能成功了。还是用用户上传文件这个例子,假如不但用了nginx代理,而且用了负载均衡,nginx把上传文件发往 其中一台后台,但这台服务器突然重启了,nginx收到错误后,会将这个上传文件发到另一台后台,于是用户就不用再花半小时上传一遍。
        4. 假如用户上传一个10GB大小的文件,而后台服务器没有考虑到这个情况,那么后台服务器岂不要崩溃了。用nginx就可以把这些东西都拦在nginx上,通过nginx的上传文件大小限制功能来限制,另外nginx性能非常有保障,就放心的让互联网上那些另类的用户和nginx对抗去吧。
        用异步传输会造成问题:
            后台服务器有提供上传进度的功能的话,用了nginx代理就无法取得进度,这个需要使用nginx的一个第三方模块来实现。

第8点补充:
    Nginx upstream支持的分配策略及原理:
        1. 轮询(默认):每个请求按照顺序逐一分配到不同的后端服务器。如后端服务器down掉,就切换到另一台并剔除down的后端主机
        2. weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
        3. ip_hash:每个请求按照访问ip的hash结果分配,不同ip的请求被分配到后端不同的服务器上,可以解决session的问题。

 

3、HAProxy:

   1. 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
    2. 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
    3. 支持url检测后端的服务器出问题的检测会有很好的帮助。
    4. 更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
    5. 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
    6. HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
    7. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
    8. 不能做Web服务器即Cache。

三大主流软件负载均衡器适用业务场景:
    1. 网站建设初期,可以选用Nginx、HAProxy作为反向代理负载均衡(流量不大时,可以不选用负载均衡),因为其配置简单,性能也能满足一般业务场景。如果考虑到负载均衡器是有单点问题,可以采用Nginx+Keepalived/HAproxy+Keepalived避免负载均衡器自身的单点问题。
    2. 网站并发到达一定程度后,为了提高稳定性和转发效率,可以使用lvs,毕竟lvs比Nginx/HAProxy要更稳定,转发效率也更高。
    注:nginx与HAProxy比较:nginx只支持七层,用户量最大,稳定性比较可靠。Haproxy支持四层和七层,支持更多的负载均衡算法,支持session等。

衡量负载均衡器好坏的几个重要的因素:
    1. 会话率 :单位时间内的处理的请求数
    2. 会话并发能力:并发处理能力
    3. 数据率:处理数据能力

4、 商业SLB:

 
SLB(Server Load Balance)服务通过设置虚拟服务地址(IP),将位于同一地域(Region)的多台云服务器(Elastic Compute Service,简称ECS)资源虚拟成一个高性能、高可用的应用服务池;再根据应用指定的方式,将来自客户端的网络请求分发到云服务器池中。

SLB服务会检查云服务器池中ECS的健康状态,自动隔离异常状态的ECS​​​​​​​,从而解决了单台ECS​​​​​​​的单点问题,同时提高了应用的整体服务能力。在标准的负载均衡功能之外,SLB服务还具备TCP与HTTP抗DDoS攻击的特性,增强了应用服务器的防护能力。
 
SLB服务是ECS面向多机方案的一个配套服务,需要同ECS结合使用。

SLB技术架构

整个SLB系统由3部分构成:四层负载均衡,七层负载均衡 和 控制系统,如下图所示;

  • 四层负载均衡,采用开源软件LVS(linux virtual server),并根据云计算需求对其进行了定制化;该技术已经在阿里巴巴内部业务全面上线应用2年多详见第3节;
  • 七层负载均衡,采用开源软件Tengine;该技术已经在阿里巴巴内部业务全面上线应用3年多;参见第4节;
  • 控制系统,用于 配置和监控 负载均衡系统;

 

LVS技术特点

LVS是全球最流行的四层负载均衡开源软件,由章文嵩博士(当前阿里云产品技术负责人)在1998年5月创立,可以实现LINUX平台下的负载均衡。
 
LVS是 基于linux netfilter框架实现(同iptables)的一个内核模块,名称为ipvs;其钩子函数分别HOOK在LOCAL_IN和FORWARD两个HOOK点,如下图所示;
 
 
在云计算大规模网络环境下,官方LVS存在如下问题;

  • 问题1:LVS支持NAT/DR/TUNNEL三种转发模式,上述模式在多vlan网络环境下部署时,存在网络拓扑复杂,运维成本高的问题;
  • 问题2:和商用负载均衡设备(如,F5)相比,LVS缺少DDOS攻击防御功能;
  • 问题3:LVS采用PC服务器,常用keepalived软件的VRRP心跳协议进行主备部署,其性能无法扩展;
  • 问题4:LVS常用管理软件keepalived的配置和健康检查性能不足;

 

为了解决上述问题,我们在官方LVS基础上进行了定制化;

  • 解决1:新增转发模式FULLNAT,实现LVS-RealServer间跨vlan通讯;
  • 解决2:新增synproxy等攻击TCP标志位DDOS攻击防御功能,;
  • 解决3:采用LVS集群部署方式;
  • 解决4:优化keepalived性能;

注1:ali-LVS开源地址https://github.com/alibaba/LVS;
 

FULLNAT技术

FULLNAT实现主要思想:引入local address(内网ip地址),cip-vip转换为lip->rip,而 lip和rip均为IDC内网ip,可以跨vlan通讯;
 
IN/OUT的数据流全部经过LVS,为了保证带宽,采用万兆(10G)网卡;
 
FULLNAT转发模式,当前仅支持TCP协议;
 

SYNPROXY技术

LVS针对TCP标志位DDOS攻击,采取如下策略;

  1. Synflood攻击,利用synproxy模块进行防御,如下图所示;实现主要思想:参照linux tcp协议栈中syncookies的思想,LVS代理TCP三次握手;代理过程:client发送syn包给LVS,LVS构造特殊seq的synack包给client,client回复ack给LVS,LVS验证ack包中ack_seq是否合法;如果合法,则LVS再和Realserver建立3次握手;
  2. Ack/fin/rstflood攻击,查找连接表,如果不存在,则直接丢弃;

 

集群部署方式

LVS集群部署方式实现的主要思想:LVS和上联交换机间运行OSPF协议,上联交换机通过ECMP等价路由,将数据流分发给LVS集群,LVS集群再转发给业务服务器;
 
健壮性:lvs和交换机间运行ospf心跳,1个vip配置在集群的所有LVS上,当一台LVS down,交换机会自动发现并将其从ECMP等价路由中剔除;
 
可扩展:如果当前LVS集群无法支撑某个vip的流量,LVS集群可以进行水平扩容;
 
集群部署方式极大的保证了异常情况下,负载均衡服务的稳定性;
 

keepalived优化

对LVS管理软件keepalived进行了全面优化;

  1. 优化了网络异步模型,select改为epoll方式;
  2. 优化了reload过程;

综上所述,四层负载均衡产品有如下特点;

  1. 高可用,LVS集群保证了冗余性,无单点;
  2. 安全,LVS自生攻击防御+云盾,提供了近实时防御能力;
  3. 健康检查:对后端ECS进行健康检查,自动屏蔽异常状态的ECS,待该ECS恢复正常后自动解除屏蔽;

Tengine技术特点

Tengine是阿里巴巴发起的web服务器项目,其在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性;Nginx是当前最流行的7层负载均衡开源软件之一;
 
注:Tengine开源地址http://tengine.taobao.org/;

针对云计算场景,tengine定制的主要特性如下;

  1. 继承Nginx-1.4.6的所有特性,100%兼容Nginx的配置;
  2. 动态模块加载(DSO)支持。加入一个模块不再需要重新编译整个Tengine;
  3. 更加强大的负载均衡能力,包括一致性hash模块、会话保持模块,还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线;
  4. 监控系统的负载和资源占用从而对系统进行保护;
  5. 显示对运维人员更友好的出错信息,便于定位出错机器;
  6. 更强大的防攻击(访问速度限制)模块;

采用Tengine作为SLB的基础模块,阿里七层负载均衡产品有如下特点;

  1. 高可用,Tengine集群保证了冗余性,无单点;
  2. 安全,多维度的CC攻击防御能力;;
  3. 健康检查,对后端ECS进行健康检查,自动屏蔽异常状态的ECS,待该ECS恢复正常后自动解除屏蔽;
  4. 支持7层会话保持功能;
  5. 支持一致性hash调度;

技术展望

SLB作为负载均衡设备,其最重要的指标是 稳定性,在进一步提高稳定性方面,主要工作有2点;

  1. 支持集群内部 session同步;
  2. 采用anycast技术实现同城双A;

同时,在功能方面有更多支持;

  1. 白名单访问控制。从SLB层面实现访问控制,用户可以在SLB系统上配置白名单,便于用户灵活限定外部访问请求;
  2. 更多服务协议的支持。如:HTTPS、UDP等;

你可能感兴趣的:(运维工具,云服务,云服务架构)