文章目录
1.什么是负载均衡
为了提升web应用的各方面能力,我们一般会把多台机器组成一个集群对外提供服务。然而,我们的网站对外提供的访问入口都是一个的,比如www.baidu.com,那么当用户在浏览器输入www.baidu.com的时候如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡在做的事情。
负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障 (高可用),扩展性(水平伸缩)的终极解决方案。
负载均衡服务器在决定将请求转发到具体哪台真实服务器的时候,是通过负载均衡算法来实现的。
负载均衡算法是一个负载均衡服务器的核心。
负载均衡算法可以分为两类:
- 静态负载均衡算法
- 动态负载均衡算法
静态负载均衡算法包括:轮询,比率,优先权
动态负载均衡算法包括: 最少连接数,最快响应速度,观察方法,预测法,动态性能分配,动态服务器补充,服务质量,服务类型,规则模式。
2.负载均衡的分类
想要实现负载均衡,其实有很多种做法,在深入介绍负载均衡之前,要先介绍一个概念,那就是OSI七层网络模型
OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范
OSI模型有7层结构,每层都可以有几个子层。 OSI的7层从上到下分别是
- 7、应用层;
- 6、表示层;
- 5、会话层;
- 4、传输层;
- 3、网络层;
- 2.数据链路层;
- 1.物理层;
其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流。
在这七层模型种,高层次都是依赖于低层次的。层次越高,使用起来越方便
- telnet、HTTP、FTP、NFS、SMTP、DNS等属于第七层应用层的概念
- TCP、UDP、SPX等属于第四层传输层的概念。
- IP、IPX等属于第三层网络层的概念。
- ATM、FDDI等属于第二层数据链路层的概念
了解了网络协议的七层模型以后,再来看看负载均衡。我们可以很明确的一点是,负载均衡是要在网络传输中做文章的。而要在网络传输过程搞事情,那么这七层模型就势必躲不开。
所以,根据负载均衡技术实现在OSI七层模型的不同层次,是可以给负载均衡分类的。
常见的实现方式中,主要可以在应用层、传输层、网络层和数据传输层做文章。
所以,工作在应用层的负载均衡我们通常称之为七层负载均衡、工作在传输层的我们称之为四层负载均衡。
大致可以分为以下几种,其中最常用的是四层和七层负载均衡:
2.1 二层负载均衡
负载均衡服务器对外依然提供一个VIP (虚IP),集群中不同的机器采用相同IP地址,但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡。
2.2 三层负载均衡
和二层负载均衡类似,负载均衡服务器对外依然提供一个VIP(虚IP),但是集群中不同的机器采用不同的IP地址,当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器。
2.3 四层负载均衡
四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还句含源端口号及目的端口号。
四层负载均衡服务器在接受到客户端请求后,以后通过修改数据句的地址信息 (IP+端口号)将流量转发到应用服务器
2.4 七层负载均衡
七层负载均衡工作在OS模型的应用层,应用层协议较多,常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。
3.负载均衡工具
市面上有很多开源的负载均衡的工具或软件,基本都是基于前面提到的方案实现的,大多数是工作在第七层和第四层的。Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件。
3.1 LVS
LVS (Linux Virtual Server),也就是Linux虚拟服务器。
使用LVS技术要达到的目标是: 通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
LVS主要用来做四层负载均衡
3.2 Nginx
Nginx (发音同engine x) 是一个网页服务器,它能反向代理HTTP,HTTPS,SMTP,POP3,IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。
Nginx主要用来做七层负载均衡.
3.3 HAProxy
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy主要用来做七层负载均衡
4.常见负载均衡算法
负载均衡服务器在决定将请求转发到具体哪台真实服务器的时候,是通过负载均衡算法来实现的。负载均衡算法是一个负载均衡服务器的核心。
负载均衡算法可以分为两类:静态负载均衡算法和动态负载均衡算法
静态负载均衡算法包括:轮询,比率,优先权
动态负载均衡算法包括: 最少连接数,最快响应速度,观察方法,预测法,动态性能分配,动态服务器补充,服务质量,服务类型,规则模式
- 轮询(Round Robin): 顺序循环将请求一次顺序循环地连接每个服务器。当其中某个服务器发生第二到第7层的故障,BIG-IP 就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常。
- 比率(Ratio): 给每个服务器分配一个加权值为比例,根据这个比例,把用户的请求分配到每个服务器。当其中某个服务器发生第二到第7 层的故障,BIG-P 就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
- 优先权 (Priority): 给所有服务器分组,给每个组定义优先权,BIG-P 用户的请求,分配给优先级最高的服务器组(在同一组内,采用轮询或比率算法,分配用户的请求);当最高优先级中所有服务器出现故障,BIG-IP才将请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。
- 最少的连接方式(Least Connection): 传递新的连接给那些进行最少连接处理的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配。直到其恢复正常。
- 最快模式(Fastest):传递连接给那些响应最快的服务器。当其中某个服务器发生第二到第7 层的故障BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
- 观察模式 (Observed): 连接数目和响应时间以这两项的最佳平衡为依据为新的请求选择服务器。当其中某个服务器发生第二到第7层的故障,BIG-IP就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常
- 预测模式 (Predictive): BIG-P利用收集到的服务器当前的性能指标,进行预测分析,选择一台服务器在下一个时间片内,其性能将达到最佳的服务器相应用户的请求。(被BIG-IP 进行检测)
- 动态性能分配(Dynamic Ratio-APM):BIG-IP 收集到的应用程序和应用服务器的各项性能参数,动态调整流量分配。
- 动态服务器补充(Dynamic Server Act.):当主服务器群中因故障导致数量减少时,动态地将备份服务器补充至主服务器群。
- 服务质量(QOS) :按不同的优先级对数据流进行分配
- 服务类型(ToS): 按不同的服务类型 (在Type of Field中标识)负载均衡对数据流进行分配
- 规则模式: 针对不同的数据流设置导向规则,用户可自行。
5.面试回答模板
负载均衡主要是将用户的请求均匀的分配到多台机器上,避免单台服务器过载,按照层次划分,负载均衡主要分为四层和七层,其中四层主要在网络传输层,由于网络传输层只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还句含源端口号及目的端口号,所以其负载均衡是基于IP和端口实现,像LVS它只看请求的 IP 和端口(比如 TCP/UDP 协议),适合处理简单的流量分发,比如数据库连接、视频流媒体。而七层的网络协议主要在应用层,比如 Nginx、HAProxy,它能识别 HTTP 请求中的 URL、Host、Cookie 等内容,适合更复杂的路由规则,比如用户访问 /api/v1 的接口,负载均衡器可以识别到这是 API 请求,直接转发到专门的 API 服务器;而访问 /static/ 的静态资源,就转发到 CDN 或静态服务器。负载均衡的转发策略主要基于负载均衡算法实现,如轮询、权重、随机、最小连接数等策略。