LVS
背景
应用服务器应该设计成无状态的,即应用服务器不存储请求上下文信息,如果将部署有相同应用的服务器组成一个集群,每次用户请求都可以发送到集群中任意一台服务器上去处理,任何一台服务器的处理结果都是相同的。这样只要能将用户请求按照某种规则分发到集群的不同服务器上,就可以构成一个应用服务器集群,每个用户的每个请求都可能落在不同的服务器上。
提出问题
是什么
如果设备或机器可以感知或可以配置集群的服务器数量,可以及时发现集群中新上线或下线的服务器,并能够向新上线的服务器分发请求,停止向已下线的服务器分发请求,那么就实现了应用服务器集群的伸缩性。
而这种设备或机器就被称为负载均衡服务器。
分类
- HTTP重定向负载均衡。
- DNS域名解析负载均衡。
- 反向代理负载均衡。
- IP负载均衡。
- 数据链路层负载均衡。
- 负载均衡算法。
应用
适用性
有什么功能。为什么存在(解决了什么问题)。
缺陷
应用场景
概述
HTTP重定向负载均衡
HTTP重定向服务器是一台普通的应用服务器,其唯一的功能就是根据用户的HTTP请求计算一台真实的Web服务器地址,并将该Web服务器的地址写入HTTP重定向响应中返回给用户浏览器。
- 用户请求负载均衡服务器的IP地址。
- HTTP重定向负载均衡服务器根据某种负载均衡算法获得一台实际物理服务器的地址,构造一个包含该实际物理服务器地址的重定向响应返回给浏览器。
- 浏览器自动重新请求实际物理服务器的IP地址。
优点
- 简单,容易实现。
缺陷
- 浏览器需要两次请求服务器才能完成一次访问,性能较差。
- 重定向服务器自身的处理能力有可能称为瓶颈,整个集群的伸缩性规模有限。
- 使用302响应码重定向,可能使搜索引擎判断为SEO作弊,降低搜索排名。
DNS域名解析负载均衡
- 在DNS服务器中配置多个A记录,如
www.mysite.com IN A 114.100.80.1、www.mysite.com IN A 114.100.80.2、www.mysite.com IN A 114.100.80.3
。 - 每次域名解析请求都会根据负载均衡算法计算一个不同的IP地址返回,因此A记录中配置的多个服务器就构成一个集群。
优点
- 将负载均衡的工作交给了DNS,省掉了网站管理维护负载均衡服务器的麻烦。
- 同时许多DNS还支持基于地理位置的域名解析,即会将域名解析为距离用户地理最近的一个服务器地址,可以加快用户访问速度。
缺点
- DNS是多级解析,每一级DNS都可能缓存了A记录,当下线某台服务器后,即使修改了DNS的A记录,要使其生效也需要较长时间,此时会导致用户访问失败。
- DNS负载均衡的控制权在域名服务商那里,网站无法对其做更多改善和管理。
应用
- 大型网站总是部分使用DNS域名解析,利用域名解析作为第一级负载均衡手段,即域名解析得到的一组服务器并不是实际提供Web服务的物理服务器,而是同样提供负载均衡服务的内部服务器。
反向代理负载均衡
反向代理服务器位于Web服务器前面,这样才可能缓存Web响应,加速访问。这个位置刚好也是负载均衡服务器的位置,因此大多数反向代理服务器同时提供负载均衡的功能,管理一组Web服务器,将请求根据负载均衡算法转发到不同Web服务器上。
Web服务器处理完成的响应也需要通过反向代理服务器返回给用户,由于Web服务器不直接对外提供范文,因此Web服务器不需要使用外部IP地址,而反向代理服务器则需要配置双网卡和内部外部两套IP地址。
由于反向代理服务器转发请求在HTTP协议层面,因此也叫应用层负载均衡。
优点
- 与反向代理服务器功能集成在一起,部署简单。
缺陷
- 反向代理服务器是所有请求和响应的中转站,性能可能成为瓶颈。
IP负载均衡
在网络层通过修改请求目标地址进行负载均衡。
- 用户请求数据包到达负载均衡服务器。
- 负载均衡服务器在OS内核进程获取网络数据包,根据负载均衡算法计算得到一台真实Web服务器。
- 将数据报的IP地址修改为10.0.0.1,不需要用户进程处理。
需要解决的问题:
- 真实的Web服务器响应数据包如何返回给负载均衡服务器。
- 方案1:负载均衡服务器在修改目的IP地址的同时修改源地址,将数据包的源地址设为自身的IP,即源地址转换SNAT,这样Web服务器的响应会再回负载均衡服务器。
- 方案2:将负载均衡服务器同时作为真实物理服务器集群的网关服务器,这样所有响应数据都会到达负载均衡服务器。
优点
- IP负载均衡在内核进程完成数据分发,比反向代理负载均衡有更好的处理性能。
缺陷
- 所有的请求响应都要经过负载均衡服务器。集群的最大响应数据吞吐量不得不受制于负载均衡服务器网卡带宽。
- 对于下载或视频服务等大数据流量网站难以满足需求,因此可以考虑让负载均衡服务器只分发请求,而响应数据直接由真实的物理服务器返回给用户。
数据链路层负载均衡
数据链路层负载均衡是指在通信协议的数据链路层修改MAC地址进行负载均衡,又称为直接路由方式DR。是使用最广泛的负载均衡手段,Linux上最好的开源产品即LVS。
只修改Mac地址,而不修改IP地址,通过配置真实物理服务器集群所有机器虚拟IP和负载均衡服务器的IP地址一致,从而达到不修改数据包的源地址和目的地址就可以进行数据分发的目的。
由于实际处理请求的真实物理服务器IP和数据请求目的IP一致,不需要通过负载均衡服务器进行地址转换,可以将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。
负载均衡算法
负载均衡服务器的实现可以分为两个部分:
- 根据负载均衡算法和Web服务器列表计算得到集群中一台Web服务器的地址。
- 将请求数据发送到该地址对应的Web服务器上。
常见的实现算法:
- 轮询。
- 加权轮询。
- 随机。
- 最少连接。记录每个应用服务器正在处理的连接数,将新到的请求分发到最少连接的服务器上。
- 源地址散列。根据请求来源的IP地址进行Hash计算,得到应用服务器。