2010-03-06 80 views
2

我看到一吨约上传多个文件的问题,但没有对上传单个文件到多台服务器,所以这里去...将文件上传到多个服务器

我有一个ASP.NET应用程序,将在两台负载均衡的服务器上运行,并且我想允许用户上传文件并使它们最终在两台服务器上运行。什么是最干净的方式来做到这一点?我使用IIS 6 btw。

浮现在脑海中的一些想法是:

1)使用指向两个服务器可以访问一些共享位置的虚拟目录。如果应用程序在网络服务中运行,是否会有任何访问问题?我假设应用程序需要以共享位置机器上存在的用户帐户运行。应该如何为此设置权限?

2)这将是很好,如果我可以通过jQuery发布请求到我的两个服务器,引用他们的端口号。即使服务器位于同一个域中,这也违反了同一个源策略,对吧?

是否有另一个我忽略的解决方案?其他网站如何做到这一点?

回答

1

我想你应该更仔细地考虑这个问题 - 拥有一对(或多个)服务器意味着他们中的一些在某些时候会脱机(至少偶尔会重新启动)。

上传当不是所有服务器都将在网上不能够被立即发送到所有的服务器,所以你需要任何中间服务器(这将是一个故障点,除非它是高度可用的本身)或者一个排队系统来“记住”哪些文件在哪里,并在相关服务器恢复时传输它们。

另外,您需要一个备份系统,以及将新配置的服务器添加到群集的方法。您还需要一种监视这些文件的方法,以防它们不同步。你的架构需要仔细思考。我没有答案:)

0

我已经看到这个问题用NAS解决,使用的应用程序池的凭据可以读/写文件到该NAS。确保您的NAS设置为高可用性,以防止单点故障,即:热插拔瓦特/ RAID,多个阵列控制器,电源等..

您也可以将文件夹监控软件放在保存某些目录的服务器上同步中。我不推荐这个解决方案。

1

最简洁的方法是转发文件服务器端,真的。如果您通过JavaScript强制执行两次上传,您不仅需要担心如何解决XSS安全问题,而且还会强制用户为每个文件使用两次非常有限的上行带宽。

无论如何,您不应该将这种细节暴露给客户端。浏览器不需要知道文件结束的位置,只需将其发送给谁。如果你保留了逻辑服务器端,不仅可以隐藏细节(​​因此不易发生错误和漏洞),还可以更好地控制过程。您可以稍后创建网关服务,以处理大量后端存储,并且可以更好地处理发生故障的服务器。您可以排队失败的上传并重试。如果您在服务器端执行这些操作,所有这些成本都会非常低,但是在客户端可靠地工作会很痛苦。

保留后端逻辑到您的后端。负载均衡应该对用户隐藏,所以不需要告诉他们准确发送文件的位置。让它成为可选的,如果你愿意,但是隐藏他们的行动。只需要将网关服务器上的文件(可以是负载均衡服务器中的文件 - 实际上它也应该是负载均衡的,因此它应该与其中任何一个配合使用)并将其发送到其他服务器从那里。从服务器到服务器的传输可能也会更快。

1

你最好的选择是NAS,如果有的话 - 一个与任何机器都没有特别关联的共享文件系统。然后,您可以专注于通过集群前端使NAS高度可用。

如果这不是一个选项,你可以在每台机器上使用一个指向其中一台机器上的一个文件夹的虚拟目录,但是这样你就失去了冗余。

我在工作中面临着同样的挑战。我的应用程序很小,但需要高度可用,但目前没有NAS。因此,在每台计算机的web.config中,我列出了应该存储上传文件的所有UNC路径的列表。上传到临时文件夹后,我将文件逐一复制到每台机器。这并不完美 - 一台机器可能会停机,在这种情况下,它可能没有所有文件(并且复制会因寻找缺少的机器而减慢) - 但在我的情况下,上传并不常见这不值得改进。

正如其他人所说的,Javascript是正确的。上传一次。

+0

如何设置权限以便您的应用程序写入每台机器?您的应用程序是否以网络服务运行,或者是否模拟了可访问每台计算机的ID? – wsanville 2010-03-07 14:00:39

+0

他们为文件复制进行模拟。我们有一个域帐户,但如果两台服务器具有完全相同的用户名/密码,则可以互换使用。您可能想要在配置文件中加密密码。 – roufamatic 2010-03-08 15:25:09