常见的负载均衡技术

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见的负载均衡技术相关的知识,希望对你有一定的参考价值。

参考技术A 四层负责均衡:主要是指通过判断报文的IP地址和端口并通过一定的负载均衡算法来决定转发到哪个指定目标,主要工作在OSI模型的第四层。四层负载均衡对数据包只是起一个数据转发的作用,并不会干预客户端与服务器之间应用层的通信(如:三次握手等)。所以能对数据所进行的操作也就很少,但相对于七层负载均衡来讲效率会高上很多

七层负载均衡:也被称为“内容交换”,指的是负载均衡设备通过报文中的应用层信息(URL、HTTP头部等信息)和负载均衡算法,选择到达目的的内部服务器。七层负载均衡可以“智能化”地筛选报文中 应用层信息,然后根据不同的信息进行特定的负载均衡调度。这种方式提升了应用系统在网络层上的灵活性,另外也在一定程度上提升了后端系统的安全性。因为像网络常见的DoS攻击,这些攻击在七层负载均衡的环境下通常都在负载均衡设备上就截止了,不会影响到后台服务器的正常运行。

前网络中常见的负载均衡主要分为硬件负载均衡和软件负载均衡。硬件负载均衡比较知名的产品有F5 Big-IP、Cirtix Netscaler等等。而软件负载均衡就有着众多的开源项目,常见的有Haproxy、nginx、lvs等。
Haproxy:

lvs:

nginx:

Haproxy可以做代理服务相对于nginx而言有很多相同之处,统一可以基于mode tcp进行四层代理也可以基于mode http进行七层代理,但不同的是其无法使用location和if等进行匹配判断。突出优势在于有会话绑定,web管理界面,状态统计非常详细。官方推荐只启用一个进程,相对于nginx多进程架构工作并不理想,更多的线程可能会受到系统内存的一些限制。
程序环境:
主程序:/usr/sbin/haproxy
主配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service

查看配置文件

重要的几个参数,及性能调优,多数无需修改

发现日志发送给本机rsyslog的local2的facility,而本机的rsyslog里并没有定义,需要我们自己去配置
所以vim /etc/rsyslog.conf添加一段将local2的所有信息记录在对应日志文件中

由于HAProxy可以工作在七层模型下,因此,要实现HAProxy的强大功能,一定要使用强大灵活的ACL规则,通过ACL规则可以实现基于HAProxy的智能负载均衡系统。HAProxy通过ACL规则完成两种主要的功能,分别是:
1)通过设置的ACL规则检查客户端请求是否合法。如果符合ACL规则要求,那么将放行;如果不符合规则,则直接中断请求。
2)符合ACL规则要求的请求将被提交到后端的backend服务器集群,进而实现基于ACL规则的负载均衡。HAProxy中的ACL规则经常使用在frontend段中,使用方法如下:
acl 自定义的acl 名称 acl 方法 -i [ 匹配的路径或文件] 其中:
·acl:是一个关键字,表示定义ACL规则的开始。后面需要跟上自定义的ACL名称。
·acl方法:这个字段用来定义实现ACL的方法,HAProxy定义了很多ACL方法,经常使用的方法有hdr_reg(host)、hdr_dom(host)、hdr_beg(host)、url_sub、url_dir、path_beg、path_end等。
·-i:表示不区分大小写,后面需要跟上匹配的路径或文件或正则表达式。与ACL规则一起使用的HAProxy参数还有use_backend,use_backend后面需要跟上一个backend实例名,表示在满足ACL规则后去请求哪个backend实例,与use_backend对应的还有default_backend参数,它表示在没有满足ACL条件的时候默认使用哪个后端

这些例子定义了www_policy、bbs_policy、url_policy三个ACL规则,第一条规则表示如果客户端以 www.z.cn 或 z.cn 开头的域名发送请求时,则此规则返回true,同理第二条规则表示如果客户端通过 bbs.z.cn 域名发送请求时,则此规则返回true,而第三条规则表示如果客户端在请求的URL中包含“buy_sid=”字符串时,则此规则返回true。
第四、第五、第六条规则定义了当www_policy、bbs_policy、url_policy三个ACL规则返回true时要调度到哪个后端backend,例如,当用户的请求满足www_policy规则时,那么HAProxy会将用户的请求直接发往名为server_www的后端backend,其他以此类推。而当用户的请求不满足任何一个ACL规则时,HAProxy就会把请求发往由default_backend选项指定的server_cache这个后端backend。

与上面的例子类似,本例中也定义了url_static、host_www和host_static三个ACL规则,其中,第一条规则通过path_end参数定义了如果客户端在请求的URL中以.gif、.png、.jpg、.css或.js结尾时返回true,第二条规则通过hdr_beg(host)参数定义了如果客户端以www开头的域名发送请求时则返回true,同理,第三条规则也是通过hdr_beg(host)参数定义了如果客户端以img.、video.、download.或ftp.开头的域名发送请求时则返回true。
第四、第五条规则定义了当满足ACL规则后要调度到哪个后端backend,例如,当用户的请求同时满足host_static规则与url_static规则,或同时满足host_www和url_static规则时,那么会将用户请求直接发往名为static的后端backend,如果用户请求满足host_www规则,那么请求将被调度到名为www的后端backend,如果不满足所有规则,那么将用户请求默认调度到名为server_cache的这个后端backend。

log:全局的日志配置,local0是日志设备,info表示日志级别。其中日志级别有err、warning、info、debug4种可选。这个配置表示使用127.0.0.1上的rsyslog服务中的local0日志设备,记录日志等级为info。

maxconn:设定每个HAProxy进程可接受的最大并发连接数,此选项等同于Linux命令行选项“ulimit -n”。

user/group:设置运行HAProxy进程的用户和组,也可使用用户和组的uid和gid值来替代。

daemon:设置HAProxy进程进入后台运行。这是推荐的运行模式。

nbproc:设置HAProxy启动时可创建的进程数,此参数要求将HAProxy运行模式设置为daemon,默认只启动一个进程。该值的设置应该小于服务器的CPU核数。创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程崩溃。

pidfile:指定HAProxy进程的pid文件。启动进程的用户必须有访问此文件的权限。

mode:设置HAProxy实例默认的运行模式,有tcp、http、health三个可选值。

retries:设置连接后端服务器的失败重试次数,如果连接失败的次数超过这里设置的值,HAProxy会将对应的后端服务器标记为不可用。此参数也可在后面部分进行设置。

timeout connect:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,但也可以使用其他的时间单位后缀。

timeout client:设置连接客户端发送数据时最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。

timeout server:设置服务器端回应客户端数据发送的最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。

timeout check:设置对后端服务器的检测超时时间,默认单位是毫秒,也可以使用其他的时间单位后缀。

bind:此选项只能在frontend和listen部分进行定义,用于定义一个或几个监听的套接字。bind的使用格式为: bind [<address>:<port_range>] interface <interface>其可以为主机名或IP地址,如果将其设置为“*”或“0.0.0.0”,将监听当前系统的所有IPv4地址。port_range可以是一个特定的TCP端口,也可是一个端口范围,小于1024的端口需要有特定权限的用户才能使用。interface为可选选项,用来指定网络接口的名称,只能在Linux系统上使用。

option httplog:在默认情况下,HAProxy日志是不记录HTTP请求的,这样很不方便HAProxy问题的排查与监控。通过此选项可以启用日志记录HTTP请求。

option forwardfor:如果后端服务器需要获得客户端的真实IP,就需要配置此参数。由于HAProxy工作于反向代理模式,因此发往后端真实服务器的请求中的客户端IP均为HAProxy主机的IP,而非真正访问客户端的地址,这就导致真实服务器端无法记录客户端真正请求来源的IP,而X-Forwarded-For则可用于解决此问题。通过使用forwardfor选项,HAProxy就可以向每个发往后端真实服务器的请求添加X-Forwarded-For记录,这样后端真实服务器日志可以通过“X-Forwarded-For”信息来记录客户端来源IP。

option httpclose:此选项表示在客户端和服务器端完成一次连接请求后,HAProxy将主动关闭此TCP连接。这是对性能非常有帮助的一个参数。

log global:表示使用全局的日志配置,这里的global表示引用在HAProxy配置文件global部分中定义的log选项配置格式。

default_backend:指定默认的后端服务器池,也就是指定一组后端真实服务器,而这些真实服务器组将在backend段进行定义。这里的htmpool就是一个后端服务器组。

option redispatch:此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入cookie中,以保证会话的session持久性。而如果后端的服务器出现故障,客户端的cookie是不会刷新的,这就会出现问题。此时,如果设置此参数,就会将客户的请求强制定向到另外一台健康的后端服务器上,以保证服务正常。

option abortonclose:如果设置了此参数,可以在服务器负载很高的情况下,自动结束当前队列中处理时间比较长的连接。
-balance:此关键字用来定义负载均衡算法。目前HAProxy支持多种负载均衡算法,常用的有如下几种:

cookie:表示允许向cookie插入SERVERID,每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义。

option httpchk:此选项表示启用HTTP的服务状态检测功能。HAProxy作为一个专业的负载均衡器,它支持对backend部分指定的后端服务节点的健康检查,以保证在后端backend中某个节点不能服务时,把从frotend端进来的客户端请求分配至backend中其他健康节点上,从而保证整体服务的可用性。
option httpchk的用法如下: option httpchk <method> <uri> <version> 其中,各个参数的含义如下:

check:表示启用对此后端服务器执行健康状态检查。

inter:设置健康状态检查的时间间隔,单位为毫秒。

rise:设置从故障状态转换至正常状态需要成功检查的次数,例如,“rise 2”表示2次检查正确就认为此服务器可用。

fall:设置后端服务器从正常状态转换为不可用状态需要检查的次数,例如,“fall 3”表示3次检查失败就认为此服务器不可用。

cookie:为指定的后端服务器设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中,其目的在于实现持久连接的功能。上面的“cookie server1”表示web1的serverid为server1。同理,“cookie server2”表示web2的serverid为server2。

weight:设置后端真实服务器的权重,默认为1,最大值为256。设置为0表示不参与负载均衡。

backup:设置后端真实服务器的备份服务器,仅仅在后端所有真实服务器均不可用的情况下才启用。

用nginx反代后端的两台tomcat主机,做动静分离,如果是jsp结尾的就发往后端,否则就交给nginx处理。
在两台tomcat主机上创建应用

nginx配置

则动静分离就实现了,并且我们还基于uri实现了会话粘性

web实现负载均衡的几种实现方式

摘要:

 

负载均衡(Load Balance)是集群技术(Cluster)的一种应用。负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力。目前最常见的负载均衡应用是Web负载均衡。根据实现的原理不同,常见的web负载均衡技术包括:DNS轮询、IP负载均衡和CDN。其中IP负载均衡可以使用硬件设备或软件方式来实现。

 

什么是web负载均衡

 

服务器集群(Cluster)使得多个服务器节点能够协同工作,根据目的的不同,服务器集群可以分为:

  • 高性能集群:将单个重负载的请求分散到多个节点进行处理,最后再将处理结果进行汇总
  • 高可用集群:提高冗余单元,避免单点故障
  • 负载均衡集群:将大量的并发请求分担到多个处理节点。由于单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性。

一般提到的负载均衡(Load Balance),是指实现负载均衡集群。负载均衡实现了横向扩展(Scale Out),避免纵向的升级(Scale Up)换代。

本文中的web负载均衡,特指能够分担web请求(http,https等)的负载均衡技术。

 

基本原理

 

任何的负载均衡技术都要想办法建立某种一对多的映射机制:一个请求的入口映射到多个处理请求的节点,从而实现分而治之(Divide and Conquer)。

这种映射机制使得多个物理存在对外体现为一个虚拟的整体,对服务的请求者屏蔽了内部的结构。

采用不同的机制建立映射关系,可以形成不同的负载均衡技术,常见的包括:

  • DNS轮询
  • CDN
  • IP负载均衡

 

DNS

 

DNS轮询是最简单的负载均衡方式。以域名作为访问入口,通过配置多条DNS A记录使得请求可以分配到不同的服务器。

DNS轮询没有快速的健康检查机制,而且只支持WRR的调度策略导致负载很难“均衡”,通常用于要求不高的场景。并且DNS轮询方式直接将服务器的真实地址暴露给用户,不利于服务器安全。

CDN

CDN(Content Delivery Network,内容分发网络)。通过发布机制将内容同步到大量的缓存节点,并在DNS服务器上进行扩展,找到里用户最近的缓存节点作为服务提供节点。

因为很难自建大量的缓存节点,所以通常使用CDN运营商的服务。目前国内的服务商很少,而且按流量计费,价格也比较昂贵。

 

IP负载均衡

 

IP负载均衡是基于特定的TCP/IP技术实现的负载均衡。比如NAT、DR、Turning等。是最经常使用的方式。关于其原理,可以参考下面另一篇文章:lvs中的负载均衡方式

IP负载均衡可以使用硬件设备,也可以使用软件实现。硬件设备的主要产品是F5-BIG-IP-GTM(简称F5),软件产品主要有LVS、HAProxy、NginX。其中LVS、HAProxy可以工作在4-7层,NginX工作在7层。关于三者的简单对比,可以参考这里

硬件负载均衡设备可以将核心部分做成芯片,性能和稳定性更好,而且商用产品的可管理性、文档和服务都比较好。唯一的问题就是价格。

软件负载均衡通常是开源软件。自由度较高,但学习成本和管理成本会比较大。

 

F5

 

F5的全称是F5-BIG-IP-GTM,是最流行的硬件负载均衡设备,其并发能力达到百万级。F5的主要特性包括:

  1. 多链路的负载均衡和冗余

    可以接入多条ISP链路,在链路之间实现负载均衡和高可用。

  2. 防火墙负载均衡

    F5具有异构防火墙的负载均衡与故障自动排除能力。

  3. 服务器负载均衡

    这是F5最主要的功能,F5可以配置针对所有的对外提供服务的服务器配置Virtual Server实现负载均衡、健康检查、回话保持等。

  4. 高可用

    F5设备自身的冗余设计能够保证99.999%的正常运行时间,双机F5的故障切换时间为毫秒级。

    使用F5可以配置整个集群的链路冗余和服务器冗余,提高可靠的健康检查机制,以保证高可用。

  5. 安全性

    与防火墙类似,F5采用缺省拒绝策略,可以为任何站点增加额外的安全保护,防御普通网络攻击,包括DDoS、IP欺骗、SYN攻击、teartop和land攻击、ICMP攻击等。

  6. 易于管理

    F5提供HTTPS、SSH、Telnet、SNMP等多种管理方式,包含详尽的实时报告和历史纪录报告。同时还提供二次开发包(i-Control)。

  7. 其他

    F5还提供了SSL加速、软件升级、IP地址过滤、带宽控制等辅助功能。

 

LVS

 

LVS(Linux Virtual Server, Linux虚拟服务器),是章文嵩博士开发的开放软件,目前已经集成到Linux内核中。

基于不同的网络技术,LVS支持多种负载均衡机制。包括:VS/NAT(基于网络地址转换技术)、VS/TUN(基于IP隧道技术)和VS/DR(基于直接路由技术)。

此外,为了适应不同的需要,淘宝开发了VS/FULLNAT,从本质上来说也是基于网络地址转换技术。最近还有一个基于VS/FULLNAT的DNAT模块。

不管使用哪种机制,LVS都不直接处理请求,而是将请求转发到后面真正的服务器(Real Server)。不同的机制,决定了响应包如何返回到客户端。

 

VS/NAT

 

NAT(Network Address Translation,网络地址转换)也叫做网络掩蔽或者IP掩蔽,是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程。

NAT能够将私有(保留)地址转化为合法IP地址,通常用于一个公共IP地址和多个内部私有IP地址直接的映射,广泛应用于各种类型Internet接入方式和各种类型的网络中。

通过使用NAT将目的地址转换到多个服务器的方式,可以实现负载均衡,同时能够隐藏并保护内部服务器,避免来自网络外部的攻击。商用负载均衡设备如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector都是基于NAT方法。

VS/NAT(Virtual Server via Network Address Translation)是基于NAT技术实现负载均衡的方法。其架构如下图所示:

技术分享

 

  1. 客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器
  2. 调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。

  3. 真实的服务器处理请求,并将响应报文发到调度器。

  4. 调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口
  5. 调度器将修改过的报文发给用户

 

在VS/NAT的集群系统中,请求和响应的数据报文都需要通过负载调度器,当真实服务器的数目在10台和20台之间时,负载调度器将成为整个集群系统的新瓶颈。大多数Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直接返回给客户,将极大地提高整个集群系统的吞吐量。比如IP隧道技术。

 

VS/TUN

 

IP Tunneling(IP隧道)技术,又称为IP封装技术(IP encapsulation),是一种在网络之间传递数据的方式。可以将一个IP报文封装到另一个IP报文(可能是不同的协议)中,并转发到另一个IP地址。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。

VS/TUN(Virtual Server via IP Tunneling)是基于隧道技术实现负载均衡的方法。其架构如下图所示:

技术分享

VS/TUN与VS/NAT的工作机制大体上相同,区别在于:

  1. 调度器转发报文的时候进行了协议的二次封装,真实的服务器接收到请求后先进行解包。过程如下图所示:

    技术分享

  2. 响应报文从后端服务器直接返回给客户,不需要经过调度器。

 

 

VS/DR

 

DR(Direct Routing, 直接路由), 路由器学习路由的方法之一。路由器对于自己的网络接口所直连的网络之间的通信,可以自动维护路由表,而且不需要进行路由计算。

直接路由通常用在一个三层交换机连接几个VLAN的情况,只要设置直接路由VLAN之间就可以通信,不需要设置其他的路由方式。

VS/DR(Virtual Server via Direct Routing)是基于直接路由实现负载均衡的方法。其架构如下图所示:

技术分享

 

跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。

VS/DR要求调度器和服务器组都必须在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的HUB相连,中间没有隔有路由器。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。

VS/DR的整个过程与VS/TUN非常类似,不同之处在于调度器不对请求包进行二次封装,只是将目标MAC地址更改为经过调度算法选出的目标服务器的MAC地址。如下图:

技术分享

 

 

三种方法的优缺点比较

 

VS/NAT

  • 优点

    • 对后端服务器的操作系统无要求
    • 只需要一个IP地址配置在调度器上,服务器组可以用私有的IP地址。
    • 支持端口映射
  • 缺点

    • 请求和响应报文都需要通过调度器,伸缩能力有限(10+)
    • 要求服务器和调度器在同一个VLAN
    • 需要将服务器的默认网关指向调度器
    • 对于那些将IP地址或者端口号在报文数据中传送的网络服务,需要编写相应的应用模块来转换报文数据中的IP地址或者端口号

VS/TUN

  • 优点

    • 不需要调度应答报文,性能高
    • 服务器和调度器可以不在同一个VLAN
    • 支持广域负载均衡
  • 缺点

    • 所有的服务器必须支持“IP Tunneling”协议,要安装内核模块(比如IPIP等),配置复杂
    • 有建立IP隧道的开销
    • 服务器上直接绑定虚拟IP(Virtaul IP),风险很大
    • 服务器需要联通外网
    • 不支持端口映射

VS/DR

  • 优点

    • 与VS/TUN相比,没有IP隧道的开销,性能最好
  • 缺点

    • 要求调度器与服务器都有一块网卡连在同一物理网段(同一个VLAN)上
    • 要求服务器网络设备(或者设备别名)不作ARP响应,或者能将报文重定向(Redirect)到本地的Socket端口上
    • 服务器上直接绑定虚拟IP(Virtaul IP),风险很大
    • 不支持端口映射

 

VS/FULLNAT

 

如上节所述,前面三种传统的负载均衡机制各自存在一些不足。

VS/FULLNAT是为了解决这些不足而新开发的一种转发模式。VS/FULLNAT的特点是:

  1. 调度器和服务器可以跨VLAN通信,不需要配置在同一个网段
  2. 请求和应答报文都经过调度器,服务器不需要绑定虚拟IP

VS/FULLNAT这两个特点可以简化网络拓扑,降低运维成本和风险。

 

如何选择

 

    1. 如果人少钱多,不在乎性能的损耗愿意多买服务器,同时希望最大程度较少运维的工作量,可以选择FULLNAT
    2. 很大众的方式是用DR,没有太多的优点但也没有太多的缺点
    3. 如果要搞广域网负载均衡,那就用TUN吧
    4. 个人感觉NAT不是为了互联网用的。小并发的实验性应用或者用在非web场合,比如mysql集群等。当然,如果需要端口映射,必须使用NAT方式

以上是关于常见的负载均衡技术的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud中常见负载均衡实现技术

亿级Web系统负载均衡几种实现方式

Web负载均衡实现方式(转)

Web负载均衡的几种方式

web实现负载均衡的几种实现方式

负载均衡架构