中小型互联网公司在并发量不高的情况下可以选用软件负载均衡作为代理层,他们通常和更靠外的“接入层”的硬件负载均衡器合作,为用户提供更好的服务。软件负载均衡的特点是并发1-2w,基于操作系统,容易上手,费用较低。
要点
什么是软件负载均衡?(了解)
有哪些流行的软件负载均衡器?(了解)
网络负载均衡的发展与技术选型(熟悉)
软件负载均衡的应用详解(重点)
目录
什么是软件负载均衡?
软件负载均衡是指在一台或多台服务器的操作系统上安装一个或多个软件来实现负载均衡,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。
代理层通常起到承上启下的作用,上连“接入层”下接应用服务器(上游服务器),可以做反向代理,缓存,数据验证,限流。本文会一一为各位介绍。
流行的软件负载均衡器
目前比较流行的有LVS,Nginx 和 HAProxy,逐个看看他们的特点。
LVS(Linux Virtual Server) 是使用Linux内核集群实现的一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。
LVS特点是:
仅作分发之用,即把请求直接分发给应用服务器,因此没有流量的产生,对资源的消耗低。配置简单,能够配置的项目少。工作在第四层(传输层),支持TCP/UDP,对应用的支持广泛。HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。
HAProxy特点是:
支持虚拟主机。支持Session保持,Cookie引导通过指定的url来检测应用服务器的状态。支持TCP/HTTP协议转发。负载均衡策略:roundrobin,轮询,每个应用服务器轮流响应请求;static-rr,对每个应用服务器设置权重,根据权重来响应请求;leastconn,最少连接先处理,连接数最少的服务器优先响应请求;source,根据请求源IP响应请求,同一IP的请求放到Hash表中存储,这样同一IP的请求可以被分发到用一台应用服务器上处理,适合处理session的情况;ri,根据请求的URI,发送到对应的应用服务器;rl_param,根据请求的URl参数,发送到对应的应用服务器;hdr(name),根据HTTP请求头,发送到对应的应用服务器;rdp-cookie(name),把cookie记录到哈希表中,这样同一cookie的请求可以被分发到用一台应用服务器上处理。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。
Nginx特点是:
工作在网络的7层,对http应用做负载均衡策略,如:域名、目录结构。对网络的稳定性依赖小,可以区分内网和外网的访问。安装和配置相对简单。能承受很高负载且稳定,处理的流量依赖于按照Nginx服务器的配置。可以检测服务器的问题,可以对服务器返回的信息进行处理和过滤,避免让无法工作的服务器响应请求。对请求可以进行异步处理。支持HTTP、HTTPs和EMAIL。网络负载均衡的发展与技术选型
发展阶段:企业业务从0到1,从无到有,数据量和访问量都不大。Nginx或HAProxy进行单点的负载均衡就已经足够了。这阶段刚刚采用多台应用服务器、数据库,需要一定的负载均衡做支撑。由于业务量不大,所以没有专业的维护团队来维护,也没有大规模的网站部署的需求。因此Nginx或HAproxy是第一选择,因为其上手快, 配置容易,在七层之上利用HTTP协议就能满足要求了。
扩张阶段:随着业务量增大,用户访问和交易量也在逐步增加。这时单点的Nginx或HAProxy已经无法满足之前的需求了,使用LVS或者硬件负载均衡(F5/Array)就是架构师需要考虑的问题了,Nginx此时就作为LVS或者硬件负载均衡(F5/Array)的节点来处理。软件负载均衡+硬件负载均衡的架构配置在这个阶段就需要考虑了,也是对架构设计者的挑战。
成熟阶段:随着公司业务扩张到达顶峰,之前的网络服务已经升级成主流服务产品,需要考虑在开源产品上进行业务定制,所以开源的LVS,已经成为首选。其在深度定制之后依旧会和硬件负载均衡器配合完成业务服务。
软件负载均衡的应用详解
一提到负载均衡器,大家一定会想到反向代理,其实还有其他的功能,特别是技术发展到今天信息流转的速度越来越快,信息量以指数级的增长充满整个互联网。我们的技术架构也要随之变化,紧跟发展的脚步。这里以当下最流行的Nginx 为例给大家讲讲,如何在互联网架构设计中,把反向代理,缓存,验证,限流这些功能应用起来,让用户的请求得到更快的反馈。
反向代理与负载均衡
先看图,了解一下客户端请求是如何到达服务器端的。
客户端请求URL给DNSDNS将URL转化成对应的IP通过IP找到服务器服务器接受到请求的报文,转交给接入层处理,接入层由于采用了硬件负载均衡器,所以能够扛住大数据量接入层把报文再次转交给代理层(并发在1-2w),代理层的Nignx收到报文再根据反向代理的策略发送给上游服务器(应用服务器)负载均衡的算法
以Nignx 为例,介绍三个算法。
round-robin: 轮询算法,默认算法。对上游的服务器进行挨个轮询,这个算法是可以配合weight(权重)来实现的。ip-hash:这个算法可以根据用户IP进行负载均衡,同以IP的用户请求报文是会被同一台上游服务器响应的。hash key:这个算法是对hash算法的补充,主要是考虑当出现上游服务器增加/删除的情况,请求无法正确的被同一服务器处理。所以对每个请求都设置hash key这样就算服务器发生了变化,key的值没有变,也可以找到对应的服务器。动态负载均衡
一般上游服务器都采用微服务的架构,那么负载均衡会把数据报发给哪个服务呢?如果服务出现了问题如何通知负载均衡器呢?有新的服务注册怎么办呢?
微服务首先会注册到“服务注册发现”中心,这里的实现方式很多有Consul,Eureka,以后会为各位一一讲解。注册中心有所有微服务的信息,Nignx 会定期从这里拉取服务信息。获取微服务信息以后,Nignx 收到数据报的时候就可以根据策略把这些信息传递给对应的服务了。限流
限流的工作可以在接入层用硬件负载均衡器来完成,也可以在代理层来完成。限流的算法也不少,有令牌桶算法,漏桶算法,连接数限制等等,这里我们就介绍两个在实际中的应用。一般实现可以通过Nignx+Lua 来实现,如果大家有兴趣专门开篇给大家讲解。
连接数限流:通过ngx_http_limit_conn_module 模块实现。设置最大的连接数以及共享内存的区域大小,请求的时候判断是否超过了最大连接数,如果超过最大连接数就被限流,否则针对连接数就+1,请求结束以后会将连接数-1.
漏桶算法:通过ngx_http_limit_req_module 模块实现。一个固定容量的桶,数据报按照固定的速度流出。数据报可以按照任意的速度流入桶中,如果数据报的容量超过了桶的容量,再流入的数据报将会被丢弃。按照这个规则,需要设置限流的区域以及桶的容量,以及是否延迟。
缓存
Nignx 做缓存可以利用Nignx 本地缓存机制,先看图。
接入层发送请求,如果能够再Nignx本地缓存命中,直接返回缓存数据,如果没有命中回源到应用服务器。缓存更新服务器定时更新Nignx本地缓存信息。这些需要考虑数据的一致性,合适更新以及何时失效等情况。
还需要需求注意的是,哪些数据可以放在Nignx本地缓存的,一般是更新频率不太高但是访问频率比较高的数据。例如:用户基本信息,以及一些静态信息。一般HTTP HEAD 中都带有一些信息更新的信息。Nignx 也可以通过epires,etag,if-modified-since 来实现浏览器缓存的控制。
超时重试
客户端超时重试DNS超时重试代理超时重试其他
失败重试心跳检测配置上游服务器总结:代理层中软件负载均衡起到的作用,目前市面上有哪些常用的负载均衡器,他们的特点是什么?作为用的比较多的Nignx的功能有哪些,在负载均衡,反向代理,限流,缓存等方面的表现如何。
PS:觉得有用的朋友,帮忙转发,送人鲜花,手留余香。