负载均衡架构

Posted 技术前沿

tags:

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

1       负载均衡介绍

负载均衡(Load Balance)是集群技术(Cluster)的一种应用。负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力。根据实现的原理不同,常见的负载均衡技术包括:DNS轮询、IP负载均衡。其中IP负载均衡可以使用硬件设备或软件方式来实现。
服务器集群使得多个服务器节点能够协同工作,根据目的的不同,服务器集群可以分为:
1)   高性能集群:将单个重负载的请求分散到多个节点进行处理,最后再将处理结果进行汇总
2)   高可用集群:提高冗余单元,避免单点故障
3)   负载均衡集群:将大量的并发请求分担到多个处理节点。由于单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性。


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


任何的负载均衡技术都要想办法建立某种一对多的映射机制:一个请求的入口映射到多个处理请求的节点,从而实现分而治之(Divide and Conquer)。这种映射机制使得多个物理存在对外体现为一个虚拟的整体,对服务的请求者屏蔽了内部的结构。采用不同的机制建立映射关系,可以形成不同的负载均衡技术,常见的包括:
1)   DNS轮询
DNS轮询是最简单的负载均衡方式。以域名作为访问入口,通过配置多条DNS使得请求可以分配到不同的服务器。DNS轮询没有快速的健康检查机制,通常用于要求不高的场景或与其它负载均衡结合使用。
2)   IP负载均衡
IP负载均衡是基于特定的TCP/IP技术实现的负载均衡。比如NAT、DR、Turning等。IP负载均衡是最经常使用的方式。IP负载均衡可以使用硬件设备,也可以使用软件实现。硬件设备的主要产品是F5-BIG-IP-GTM(简称F5),软件产品主要有LVS、HAProxy、nginx。其中LVS、HAProxy可以工作在4-7层,NginX工作在7层。硬件负载均衡设备可以将核心部分做成芯片,性能和稳定性更好,而且商用产品的可管理性、文档和服务都比较好。唯一的问题就是价格。软件负载均衡通常是开源软件。自由度较高,但学习成本和管理成本会比较大。


2       软件负载均衡


2.1 LVS


LVS简介

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器。是一个由曾在阿里任职的章文嵩博士发起的开源软件项目,现在LVS已经是Linux内核标准的一部分。
使用LVS可以达到的技术目标是:通过LVS达到的负载均衡技术和Linux操作系统实现一个高性能、高可用的Linux服务器群集,它具有良好的可靠性,可拓展性和可操作性。从而以低廉的成本实现最优的性能。
LVS从1998年开始,发展到现在已经是一个比较成熟的项目了。利用LVS技术可以实现高性能,高可压缩的网路服务,例如WWW服务,FTP服务,MAIL服务等。

使用LVS架设的服务器集群系统有三个部分组成:

l  最前端的负载均衡层(Loader Balancer);

l  中间的服务器群组层,用Server Array表示;

l  最底层的数据共享存储层,用Shared Storage表示。

在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

LVS的体系架构如图:

负载均衡架构


LVS的各个层次的介绍:
Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。
Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。
Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数 据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
从整个LVS结构可以看出,Director Server是整个LVS的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为 Director Server的应用还不是很多,性能也不是很好。对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
 

LVS的高可用方案

从以上架构可以发现,LVS的Director Server存在单点故障问题,当Director Server出现故障时,整个LVS接入将会失效,为了提高系统的可用性,我们将采用LVS+keepalived的方式, Keepalived 是运行在LVS之上,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换,提高系统的可用性。Keepalived的作用是保证“负载调度器(Director Server)”高可用,主备Director Server故障切换。
 

LVS的扩展方案


LVS的性能和特性

1)高性能:一套LVS负载均衡器(主备两台)能支持10~20万的连接能力,能同时兼容支持长连接和短连接方式。
2)高可用性:LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。
3)高可靠性:LVS已经是Linux标准内核的一部分,LVS负载均衡集群软件已经在企业、学校等行业得到了很好的普及应用,国内外很多大型的、关键性的web站点也都采用了LVS集群软件,所以它的可靠性在实践中得到了很好的证实。有很多以LVS做的负载均衡系统,运行很长时间,从未做过重新启动。这些都说明了LVS的高稳定性和高可靠性。
4)适用环境:LVS对前端Director Server目前仅支持Linux和FreeBSD系统,但是支持大多数的TCP和UDP协议,支持TCP协议的应用有:HTTP,HTTPS ,FTP,SMTP,POP3,IMAP4,PROXY,LDAP,SSMTP等等。支持UDP协议的应用有:DNS,NTP,ICP,视频、音频流播放协议等。LVS对Real Server的操作系统没有任何限制,Real Server可运行在任何支持TCP/IP的操作系统上,包括Linux,各种Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows等。
5)开源软件:LVS集群软件是按GPL(GNU Public License)许可证发行的自由软件,因此,使用者可以得到软件的源代码,并且可以根据自己的需要进行各种修改,但是修改必须是以GPL方式发行。
6)可扩展性:结合DNS轮询,可实现横向扩展。


2.2 Nginx


Nginx简介

Nginx 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,它能反向代理 HTTP、HTTPS、SMTP、POP3、IMAP 的协议链接。同时,Nginx 也可以作为负载均衡使用,Nginx 主要用来做七层负载均衡。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。反向代理方式实际上就是一台负责转发的代理服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的数据。
Nginx不单可以作为强大的web服务器、反向代理服务器,而且Nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。


Nginx的特点:
l  模块化设计:良好的扩展性,可以通过模块方式进行功能扩展。
l  高可靠性:主控进程和 worker 是同步实现的,一个 worker 出现问题,会立刻启动另一个 worker。
l  内存消耗低:一万个长连接(keep-alive),仅消耗 2.5MB 内存。
l  支持热部署:不用停止服务器,实现更新配置文件,更换日志文件、更新服务器程序版本。
l  并发能力强:官方数据每秒支持 5 万并发。
l  功能丰富:优秀的反向代理功能和灵活的负载均衡策略。
 
Nginx 的基本工作模式如下图:

负载均衡架构

一个 master 进程,生成一个或者多个 worker 进程。但这里 master 是使用 root 身份启动的,因为 Nginx 要工作在 80 端口。而只有管理员才有权限启动小于低于 1023 的端口。master 主要负责的作用只是启动 worker,加载配置文件,负责系统的平滑升级。其他的工作是交给 worker。
那当 worker 被启动之后,也只是负责一些 Web 最简单的工作,而其他的工作都是由 worker 中调用的模块来实现的。模块之间是以流水线的方式实现功能的。流水线,指的是一个用户请求,由多个模块组合各自的功能依次实现完成的。比如:第一个模块只负责分析请求首部,第二个模块只负责查找数据,第三个模块只负责压缩数据,依次完成各自工作来实现整个工作的完成。
它们是如何实现热部署的呢?我们前面说 master 不负责具体的工作,而是调用 worker 工作,它只是负责读取配置文件。因此当一个模块修改或者配置文件发生变化,是由 master 进行读取,此时不会影响到 worker 工作。在 master 进行读取配置文件之后,不会立即把修改的配置文件告知 worker。而是让被修改的 worker 继续使用老的配置文件工作,当 worker 工作完毕之后,直接宕掉这个子进程,更换新的子进程,使用新的规则。


Nginx的扩展方案

Nginx支持水平扩展,可以根据负载情况,在不影响现有业务的情况下,增加或减少服务器。


Nginx的性能

官方支持每秒 5 万并发,实际国内一般到每秒 2 万并发,有优化到每秒 10 万并发的,具体性能看应用场景。


2.3  HAProxy

HAProxy 也是使用较多的一款负载均衡软件。HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,是免费、快速并且可靠的一种解决方案。
它特别适用于那些负载特大的 Web 站点。运行模式使得它可以很简单安全的整合到当前的架构中,同时可以保护你的 Web 服务器不被暴露到网络上。
HAProxy 是一个使用 C 语言编写的自由及开放源代码软件,它提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理。HAProxy 主要用来做七层负载均衡。



3       负载均衡方案演进


3.1   无负载均衡--单机架构

负载均衡架构

无负载均衡的架构图如上:
1)浏览器通过DNS-server,域名解析到ip
2)浏览器通过ip访问web-server
 
缺点:
1)非高可用,web-server挂了整个系统就挂了
2)扩展性差,当吞吐量达到web-server上限时,无法扩容
 
注:单机不涉及负载均衡的问题


3.2   简易扩容方案--DNS轮询

假设tomcat的吞吐量是1000次每秒,当系统总吞吐量达到3000时,如何扩容是首先要解决的问题,DNS轮询是一个很容易想到的方案:

负载均衡架构

此时的架构图如上:
1)   多部署几份web-server,1个tomcat分担1000,部署3个tomcat就能分担3000
2)   在DNS-server层面,域名每次解析到不同的ip
 
优点:
1)   零成本:在DNS-server上多配几个ip即可,功能也不收费
2)   部署简单:多部署几个web-server即可,原系统架构不需要做任何改造
3)   负载均衡:变成了多机,但负载基本是均衡的
 
缺点:
1)   非高可用:DNS-server只负责域名解析ip,这个ip对应的服务是否可用,DNS-server是不保证的,假设有一个web-server挂了,部分服务会受到影响
2)   扩容非实时:DNS解析有一个生效周期
3)   暴露了太多的外网ip


3.3   简易扩容方案--nginx

tomcat的性能较差,但nginx作为反向代理的性能就强多了,假设线上跑到1w,就比tomcat高了10倍,可以利用这个特性来做扩容:

负载均衡架构

此时的架构图如上:
1)   站点层与浏览器层之间加入了一个反向代理层,利用高性能的nginx来做反向代理
2)   nginx将http请求分发给后端多个web-server
 
优点:
1)   DNS-server不需要动
2)   负载均衡:通过nginx来保证
3)   只暴露一个外网ip,nginx->tomcat之间使用内网访问
4)   扩容实时:nginx内部可控,随时增加web-server随时实时扩容
5)   能够保证站点层的可用性:任何一台tomcat挂了,nginx可以将流量迁移到其他tomcat
 
缺点:
1)   时延增加+架构更复杂了:中间多加了一个反向代理层
2)   反向代理层成了单点,非高可用:tomcat挂了不影响服务,nginx挂了怎么办?


3.4   高可用方案--keepalived+nginx

为了解决高可用的问题,keepalived出场了

负载均衡架构

此时:
1)   做两台nginx组成一个集群,分别部署上keepalived,设置成相同的虚IP,保证nginx的高可用
2)   当一台nginx挂了,keepalived能够探测到,并将流量自动迁移到另一台nginx上,整个过程对调用方透明:

负载均衡架构

优点:
1)   解决了高可用的问题
 
缺点:
2)   资源利用率只有50%
3)   nginx仍然是接入单点,如果接入吞吐量超过的nginx的性能上限怎么办,例如qps达到了50000呢?


3.5  scale up扩容方案--keepalived+LVS+nginx

nginx毕竟是软件,性能比tomcat好,但总有个上限,超出了上限,还是扛不住。
lvs就不一样了,它实施在操作系统层面;它们性能比nginx好很多,例如lvs每秒可以抗10w,这样可以利用他们来扩容,常见的架构图如下:


此时:
1)   如果通过nginx可以扩展多个tomcat一样,可以通过lvs来扩展多个nginx
2)   通过keepalived+VIP的方案可以保证可用性
 
大部分的应用到这一步基本就能解决接入层高可用、扩展性、负载均衡的问题。但是lvs是scale up的方案,根本上,lvs还是会有性能上限,假设lvs每秒能处理10w的请求,一天也只能处理80亿的请求(10w秒吞吐量*8w秒),那万一系统的日PV超过80亿怎么办呢?(虽然大部分应用不需要考虑)


3.6   scale out扩容方案--LVS+DNS轮询

如前面所述,水平扩展,才是解决性能问题的根本方案,能够通过加机器扩充性能的方案才具备最好的扩展性。
facebook,google,baidu的PV是不是超过80亿呢,它们的域名只对应一个ip么,终点又是起点,还是得通过DNS轮询来进行扩容:


此时:
1)   通过DNS轮询来线性扩展入口lvs层的性能
2)   通过keepalived来保证高可用
3)   通过lvs来扩展多个nginx
4)   通过nginx来做负载均衡,业务七层路由

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

大型网站架构系列:负载均衡详解

工业软件负载均衡与分布式架构

负载均衡架构

高性能负载均衡是如何架构的?

大型网站--负载均衡架构

大型网站--负载均衡架构