LVS (Linux Virtual Server)
什么是LVS?它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。(另外,LVS 项目是章文嵩博士的成名作[1])
LVS 主要组成部分
- 负载调度器(load balancer / Director),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
- 服务器池(server pool / Realserver),是一组真正执行客户请求的服务器,执行的服务一般有 WEB, MAIL, FTP 和 DNS 等。
- 共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
LVS 负载均衡方式[2]
LVS 有三种负载均衡方式:
- Virtual Server via Network Address Translation NAT (VS/NAT)
- Virtual Server via IP Tunneling (VS/TUN)
- Virtual Server via Direct Routing (VS/DR)
VS/DR 方式是目前大型网站使用最广泛的一种负载均衡手段。对这三种方式,我谈下自己的理解:
1 中的 LB 工作在 http 层,可看做一个 http 服务器,它接收到客户端请求后向 real server 发出请求,接收到返回后再返回给客户端。为什么 real server 不能直接返回给客户端呢?因为根据 TCP/IP 协议,real server 返回的包的目标 IP 地址是请求包的源 IP,即 LB 的 IP。
2 中的 LB 用到了 IP 封装协议,大概可以这样理解(是我揣测的,没有求证)。LB 向 real server 发送请求时,源 IP 还是 LB 的 IP,但是包体里面包含了客户端的 IP,根据协议 real server 返回的时候会把包的目标 IP 设为包体里的客户端 IP。如果真是这样的话,协议数据走在应用层,但是又对传输层的数据做了修改,比较 hack,没有遵守分层的设计规范。
3 中的 LB 工作在数据链路层,LB 直接把 frame 的 mac 地址修改为 某台 real server 的 mac 地址,转发给 real server。real server 拿到包里的源 IP 是客户端的 IP,返回包的目标 IP 自然为客户端的 IP。
基于它们工作的网络协议,有下面的特点。(注:子网的出口的路由器叫做网关)
指标 | VS/NAT | VS/TUN | VS/DR |
---|---|---|---|
服务器操作系统 | 任意 | 支持隧道 | 多数(支持Non-arp) |
服务器网络 | 私有网络 | 局域网/广域网 | 局域网 |
服务器数目(100M网络) | 10~20 | 100 | 大于100 |
服务器网关 | 负载均衡器 | 自己的路由 | 自己的路由 |
效率 | 一般 | 高 | 最高 |
其他负载均衡方法
HTTP 重定向负载均衡
当用户发来请求的时候,Web 服务器通过修改 HTTP 响应头中的 Location 标记来返回一个新的 url,然后浏览器再继续请求这个新 url,实际上就是页面重定向。通过重定向,来达到“负载均衡”的目标。例如,我们在下载 PHP 源码包的时候,点击下载链接时,为了解决不同国家和地域下载速度的问题,它会返回一个离我们近的下载地址。重定向的 HTTP 返回码是 302。
优点:比较简单。
缺点:浏览器需要两次请求服务器才能完成一次访问,性能较差。重定向服务自身的处理能力有可能成为瓶颈,整个集群的伸缩性国模有限;使用 HTTP 302 响应码重定向,有可能使搜索引擎判断为 SEO 作弊,降低搜索排名。
DNS 域名解析负载均衡
DNS(Domain Name System)负责域名解析的服务,域名url实际上是服务器的别名,实际映射是一个IP地址,解析过程,就是DNS完成域名到IP的映射。而一个域名是可以配置成对应多个 IP的。因此,DNS也就可以作为负载均衡服务。
事实上,大型网站总是部分使用DNS域名解析,利用域名解析作为第一级负载均衡手段,即域名解析得到的一组服务器并不是实际提供Web服务的物理服务器,而是同样提供负载均衡服务的内部服务器,这组内部负载均衡服务器再进行负载均衡,将请求分发到真是的 Web 服务器上。
优点:将负载均衡的工作转交给 DNS,省掉了网站管理维护负载均衡服务器的麻烦,同时许多 DNS 还支持基于地理位置的域名解析,即会将域名解析成举例用户地理最近的一个服务器地址,这样可以加快用户访问速度,改善性能。
缺点:不能自由定义规则,而且变更被映射的IP或者机器故障时很麻烦,还存在 DNS 生效延迟的问题。而且DNS负载均衡的控制权在域名服务商那里,网站无法对其做更多改善和更强大的管理。
反向代理负载均衡
反向代理服务可以缓存资源以改善网站性能。实际上,在部署位置上,反向代理服务器处于Web服务器前面(这样才可能缓存 Web 相应,加速访问),这个位置也正好是负载均衡服务器的位置,所以大多数反向代理服务器同时提供负载均衡的功能,管理一组 Web 服务器,将请求根据负载均衡算法转发到不同的 Web 服务器上。Web服务器处理完成的响应也需要通过反向代理服务器返回给用户。由于 Web 服务器不直接对外提供访问,因此 Web 服务器不需要使用外部ip地址,而反向代理服务器则需要配置双网卡和内部外部两套 IP 地址。
优点:和反向代理服务器功能集成在一起,部署简单。
缺点:反向代理服务器是所有请求和响应的中转站,其性能可能会成为瓶颈。
反向代理负载均衡跟 VS/NAT 的原理一样。
参考资料