18 应用服务器集群的伸缩性设计,java 面试多线程和分布式
HTTP 重定向服务器是一台普通的应用服务器,其唯一的功能就是根据用户的 HTTP 请求计算一台真实的 Web 服务器地址,并将该 Web 服务器地址写入 HTTP 重定向响应中 (响应状态码 302 )返回给用户浏览器。在图 6.5 中,浏览器请求访问域名 www.mysite.com, DNS 服务器解析得到 IP 地址是 114.100.80.10,即 HTTP 重定向服务 器的 IP 地址。然后浏览器通
过 IP 地址 114.100.80.10 访问 HTTP 重定向负载均衡服务器 后,服务器根据某种负载均衡算法计算获得一台实际物理服务器的地址(114.100.80.3 ), 构造一个包含该实际物理服务器地址的重定向响应返回给浏览器,浏览器自动重新请求 实际物理服务器的 IP 地址 114.100.80.3,完成访问。
这种负载均衡方案的优点是比较简单。缺点是浏览器需要两次请求服务器才能完成 一次访问,性能较差;重定向服务器自身的处理能力有可能成为瓶颈,整个集群的伸缩 性规模有限;使用 HTTP302 响应码重定向,有可能使搜索引擎判断为 SEO 作弊,降低搜 索排名。因此实践中使用这种方案进行负载均衡的案例并不多见。
2 DNS 域名解析负载均衡
这是利用 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 记录中配置的多个服务器就构成一个集群,并可以实现负载均衡。图 6.6 中的浏览器请求解析 域名 www.mysite.com, DNS 根据 A 记录和负载均衡算法计算得到一个 IP 地址 114.100.80.3,并返回给浏览器;浏览器根据该 IP 地址,访问真实物理服务器 H4.100.80.3o
DNS 域名解析负载均衡的优点是将负载均衡的工作转交给 DNS,省掉了网站管理维 护负载均衡服务器的麻烦,同时许多 DNS 还支持基于地理位置的域名解析,即会将域名 解析成距离用户地理最近的一个服务器地址,这样可加快用户访问速度,改善性能。但 是 DNS 域名解析负载均衡也有缺点,就是目前的 DNS 是多级解析,每一级 DNS 都可能 缓存 A 记录,当下线某台服务器后,即使修改了 DNS 的 A 记录,要使其生效也需要较长 时间,这段时间,DNS 依然会将域名解析到已经下线的服务器,导致用户访问失败;而 且 DNS 负载均衡的控制权在域名服务商那里,网站无法对其做更多改善和更强大的管理。
事实上,大型网站总是部分使用 DNS 域名解析,利用域名解析作为第一级负载均衡 手段,即域名解析得到的一组服务器并不是实际提供 Web 服务的物理服务器,而是同样 提供负载均衡服务的内部服务器,这组内部负载均衡服务器再进行负载均衡,将请求分 发到真实的 Web 服务器上。
3 反向代理负载均衡
利用反向代理服务器进行负载均衡
前面我们提到利用反向代理缓存资源,以改善网站性能。实际上,在部署位置上, 反向代理服务器处于 Web 服务器前面(这样才可能缓存 Web 响应,加速访问),这个位 置也正好是负载均衡服务器的位置,所以大多数反向代理服务器同时提供负载均衡的功能,管理一组 Web 服务器,将请求根据负载均衡算法转发到不同 Web 服务器上。Web 服 务器处理完成的响应也需要通过反向代理服务器返回给用户。由于 Web 服务器不直接对 外提供访问,因此 Web 服务器不需要使用外部 IP 地址,而反向代理服务器则需要配置双 网卡和内部外部两套 IP 地址。
图 6.7 中,浏览器访问请求的地址是反向代理服务器的地址 114.100.80.10,反向代理 服务器收到请求后,根据负载均衡算法计算得到一台真实物理服务器的地址 10.0.0.3,并 将请求转发给服务器。10.0.0.3 处理完请求后将响应返回给反向代理服务器,反向代理服 务器再将该响应返回给用户。
由于反向代理服务器转发请求在 HTTP 协议层面,因此也叫应用层负载均衡。其优 点是和反向代理服务器功能集成在一起,部署简单。缺点是反向代理服务器是所有请求 和响应的中转站,其性能可能会成为瓶颈。
4 IP 负载均衡
在网络层通过修改请求目标地址进行负载均衡,如图 6.8 所示。
用户请求数据包到达负载均衡服务器 114.100.80.10 后,负载均衡服务器在操作系统 内核进程获取网络数据包,根据负载均衡算法计算得到一台真实 Web 服务器 10.0.0.1,然 后将数据目的 IP 地址修改为 10.0.0.1,不需要通过用户进程处理。真实 Web 应用服务器处理完成后,响应数据包回到负载均衡服务器,负载均衡服务器再将数据包源地址修改 为自身的 IP 地址(114.100.80.10)发送给用户浏览器。
这里的关键在于真实物理 Web 服务器响应数据包如何返回给负载均衡服务器。一种 方案是负载均衡服务器在修改目的 IP 地址的同时修改源地址,将数据包源地址设为自身 IP,即源地址转换(SNAT ),这样 Web 服务器的响应会再回到负载均衡服务器;另一种 方案是将负载均衡服务器同时作为真实物理服务器集群的网关服务器,这样所有响应数 据都会到达负载均衡服务器。
IP 负载均衡在内核进程完成数据分发,较反向代理负载均衡(在应用程序中分发数据)有更好的处理性能。但是由于所有请求响应都需要经过负载均衡服务器,集群的最 大响应数据吞吐量不得不受制于负载均衡服务器网卡带宽。对于提供下载服务或者视频 服务等需要传输大量数据的网站而言,难以满足需求。能不能让负载均衡服务器只分发 请求,而使响应数据从真实物理服务器直接返回给用户呢?
5 数据链路层负载均衡
顾名思义,数据链路层负载均衡是指在通信协议的数据链路层修改 mac 地址进行负 载均衡,如图 6.9 所示。
这种数据传输方式又称作三角传输模式,负载均衡数据分发过程中不修改 IP 地址, 只修改目的 mac 地址,通过配置真实物理服务器集群所有机器虚拟 IP 和负载均衡服务器 IP 地址一致,从而达到不修改数据包的源地址和目的地址就可以进行数据分发的目的, 由于实际处理请求的真实物理服务器 IP 和数据请求目的 IP 一致,不需要通过负载均衡服 务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。这种负载均衡方式又称作直接路由方式(DR)。
在图 6.9 中,用户请求到达负载均衡服务器 114.100.80.10 后,负载均衡服务器将请求 数据的目的 mac 地址修改为 00:0c:29:d2,并不修改数目包目标 IP 地址,由于 Web 服务器 集群所有服务器的虚拟 IP 地址都和负载均服务器的 IP 地址相同,因此数据可以正常传输 到达 mac 地址 00:0c:29:d2 对应的服务器,该服务器处理完成后发送响应数据到网站的网 关服务器,网关服务器直接将该数据包发送到用户浏览器(通过互联网),响应数据不需 要通过负载均衡服务器。
使用三角传输模式的链路层负载均衡是目前大型网站使用最广的一种负载均衡手 段。在 Linux 平台上最好的链路层负载均衡开源产品是 LVS ( Linux Virtual Server )。
6 负载均衡算法
负载均衡服务器的实现可以分成两个部分:
根据负载均衡算法和 Web 服务器列表计算得到集群中一台 Web 服务器的地址。
将请求数据发送到该地址对应的 Web 服务器上。
前面描述了如何将请求数据发送到 Web 服务器,而具体的负载均衡算法通常有以下 几种。
评论