0

我的服务器分布在多个数据中心,每个数据中心都存储不同的文件。我希望用户能够通过单个域访问所有服务器上的文件,并让各个服务器将文件直接返回给用户。

下面是一个简单的例子:
1) 用户的浏览器请求http://www.example.com/files/file1.zip
2) 请求到达服务器 A,基于 example.com 的 DNS A 记录。
3) 服务器 A 分析请求,发现 /files/file1.zip 存储在服务器 B 上。
4) 服务器 A 将请求转发给服务器 B。
5) 服务器 B 直接返回 file1.zip 给用户,无需经过服务器一个。

注意:步骤 4 和 5 必须对用户透明,并且不能涉及向用户发送重定向,因为这会违反单个域的要求。

根据我的研究,我想要实现的称为“直接服务器返回”,它是负载平衡的常见设置。它有时也称为半反向代理。

对于第 4 步,听起来我需要进行 MAC 地址转换,然后将请求传递回网络,对于服务器网络之外的服务器,将需要隧道。

对于第 5 步,我只需要根据负载平衡设置中的真实服务器配置服务器 B。也就是说,服务器 B 应该在环回接口上拥有服务器 A 的 IP 地址,并且它不应该响应对该 IP 地址的任何 ARP 请求。

我的问题是如何实际实现第 4 步?

我发现有很多硬件和软件可以在第 4 层实现简单的负载平衡,但这些解决方案不够完善,无法处理我需要的那种自定义路由。看来我需要推出自己的解决方案。

理想情况下,我想在 Web 服务器级别进行路由/转发,即在 PHP 或 C#/ASP.net 中。但是,我愿意在 Apache 或 IIS 等较低级别,或者在更低级别(即所有事物前面的自定义代理服务)上执行此操作。

4

2 回答 2

1

请原谅我的无知,但为什么不设置服务器 A 以通过 NFS 或 SMB 挂载位于其他服务器上的文件,具体取决于您使用的是 unix 变体还是使用 Windows?

似乎您正在尝试做的事情过于复杂,而这可能非常简单。此外,使用网络挂载文件将允许您在将来需要时将这些文件挂载到其他机器上。那时,您可以在服务器 A(以及服务器 x、y 和 z,它们也都从服务器 B 挂载文件)前面放置一个负载平衡器。

当然这不能解决在返回时绕过服务器 A 的问题,从技术上讲,服务器 A 将返回文件而不是服务器 B,但是如果将负载平衡器放在 A 前面,那么 A 无论如何都会变成 B,所以从技术上讲,B 仍然会返回文件,因为负载均衡器将使用直接服务器返回(它现在是很长一段时间的标准功能)。

如果我确实错过了什么,请详细说明。

编辑:是的,我意识到这是近 3 年前发布的。那好吧。

于 2012-09-03T03:06:04.650 回答
0

为什么不发送状态码 307 临时重定向的 HTTP 响应?

此时,客户端将重新请求正确的指定服务器。

我知道您想要一个域,但您可以同时拥有单独的子域和一个公共域。

例如:

example.com有IP1、IP2、IP3。

example1.example.com有 IP1
example2.example.com有 IP2
example3.example.com有 IP3

如果请求到达它自己无法处理的服务器,它将转发用户以向正确的特定服务器发出另一个请求。顺便说一下,HTTP 浏览器将透明地遵循此重定向。

于 2010-02-14T03:51:20.790 回答