是否有一个ftp服务器可以作为多个其他服务器的“分发前端”? 所以,当我上传一个文件,它接受的内容,把他们的所有其他FTP服务器的列表,(重要的是)不确认成功的上传,直到它在所有其他服务器上?
或者,如果可以等到(比方说)rsync在返回成功之前(或者更一般地说,在返回成功之前等待一些外部命令完成)将上传的文件复制到所有其他服务器。
背景:
我们有一个应用程序将file upload到存储库(使用ftp或sftp),然后立即指示设备下载文件(通过http)。
我们需要存储库负载均衡/高可用性/弹性。 我们的公司托pipe标准不允许共享存储。
我们对其他相关应用程序所做的是有几个ftp / http服务器,并在告诉应用程序(然后设备)使用它们之前手动将file upload到所有的应用程序。 负载平衡器分配下载请求。 这个工程,因为这些应用程序不上载,而是我们configuration他们使用以前上传的文件的URL。 问题应用程序不会这样做,它自己上传。
我们可以使用rsync或类似的方式将问题应用程序上传的文件复制到多个服务器上,但是这些文件的使用是立即的,所以当收到请求时,它们可能不会复制到其他服务器上。 该应用程序不能configuration在这里有一个延迟。
但是,如果ftp服务器在文件复制之前没有返回(通过服务器本身进行所有复制/上传到其他服务器,或者等待外部命令完成),那么应用程序不会告诉该设备使用这些文件,直到我们知道他们到处都是。 这一切都会奏效。
任何指向合适的服务器? 解决问题的其他想法? (不幸的是,改变应用程序在时间尺度是不可能的)
如果您需要使用FTP,您可以编写一个脚本(也许是一个Python程序,或者提供一个方便的FTP库的任何语言),在上传到“主”服务器之后立即运行您的上传程序。 该脚本将扫描应该复制到的FTP站点,并且不会退出,直到看到这些文件。 在主服务器上,您将拥有另一个监视文件系统的脚本(例如使用Linux的inotify ),当它看到新的或修改的文件时,会将其上传到从属服务器。
或者,您可以使用复制的文件系统。 这将问题从应用程序层的自制脚本集移动到devise用于处理复制文件的层。 检查Tahoe-LAFS 。 我引用了相关的句子:
用户确实依赖存储服务器来提供可用性。 密文被擦除编码成分布在至lessH个不同的存储服务器上的N个共享(N的默认值为10,H为7),这样它就可以从这些服务器的任意K个中恢复(默认值K是3)。 因此,只有H-K + 1(缺省为5)服务器的故障才能使数据不可用。
我认为真正的答案是“不”。 您要求的不仅仅是FTP协议。 如果客户端发送一个TCP段并且服务器说“我知道了”,客户端发送下一个。 当他们都收到,转移完成。 现有协议中没有任何钩子可以让服务器说:“请稍候,我在旁边”。
如果您修改了FTP服务器,以便减慢TCP ACK,直到在其他位置写入字节为止,您可能会得到您想要的,但是我担心您也可能会将您的传输转换为比所需更多的抓取到TCP滑动窗口。
你基本上要求在FTP中进行文件传输操作的两阶段提交,并且不存在。
也许你可以看看虚拟化/复制存储系统,而不是像上面所提到的那样。