2009-07-10 37 views
2

我有一个应用程序处理目录中的文件并将它们与处理后的输出一起移动到另一个目录。没什么特别的。引入了一个有趣的需求:经典文件系统问题 - 目录上的并行远程处理

通过允许多个远程实例在同一文件存储上工作来实现容错和处理吞吐量。

其他注意事项是我们不能假设文件系统,因为我们同时支持Windows和NFS。

当然,问题是,我如何确保不同的实例不尝试和处理相同的工作,可能会破坏工作或降低吞吐量?文件锁定可能会产生问题,特别是跨网络共享。我们可以使用更复杂的方法,如简单的数据库或消息传递框架(la JMS或类似的方法),但是整个集群需要具有容错能力。由于它引入了单点故障,我们不能拥有一个数据库或消息传递提供程序。

我们已经实现了一个解决方案,该解决方案使用多播消息来自我发现处理实例并选择分配工作的主管。如果主管倒闭并进行另一次选举,则有超时。然而,我们的网络库并不是非常成熟,而且我们的消息实现很笨拙。

但是,我的直觉告诉我,有一种更简单的方法。

的思考?

回答

1

我认为你可以放心地假设重命名操作在你关心的所有网络文件系统上是原子的。因此,如果您将大量工作安排为单个文件(或键入单个文件),那么请让每台服务器首先列出包含新工作的目录,选择一项工作,然后让文件重命名为自己的文件服务器名称(例如,机器名称或IP地址)。对于同时执行相同操作的实例之一,重命名将成功,因此他们应该处理该工作。对于其他人来说,它会失败,所以他们应该从他们收到的列表中选择一个不同的文件。假设目录创建(mkdir)是原子的,但文件创建不是(创建文件,第二个作者可能会覆盖现有文件)。因此,如果还有多个工作生产者,则为每件工作创建一个新目录。

+0

有趣的想法,但我最初想知道如果你关于假定重命名的声明是原子的是真的。为什么假设这是安全的?我们试图覆盖的情况是通过NFS运行的;它的缓存在过去引起了我们的问题。 如果我们同时重命名a-> b和a-> c操作,那么什么机制可以保护我们免受这两个b&c的影响? – 2009-07-13 18:49:14