最佳实践:带文件处理的 AWS ftp

Posted

技术标签:

【中文标题】最佳实践:带文件处理的 AWS ftp【英文标题】:Best Practice: AWS ftp with file processing 【发布时间】:2013-08-25 03:19:13 【问题描述】:

我正在寻找有关 AWS 架构决策的方向。我的目标是允许用户将文件 ftp 到 EC2 实例,然后对文件进行一些分析。我的重点是尽可能多地以面向服务的方式构建它。并且在未来将其扩展到多个客户端,每个客户端都有自己的 ftp 服务器和处理队列,而不会混合数据。

目前我有一个安装了 vsftpd 的开发 EC2 实例和一个运行 Chokidar 的 node.js 进程,该进程持续监视要删除的新文件。当该文件丢失时,我希望通知另一台服务器或一组服务器来获取该文件并进行处理。

ftp 服务器是否应该将文件移动到 S3,然后使用 SQS 让处理服务器池知道它已准备好进行处理?我应该使用 SQS,然后让服务器池 ssh 进入 ftp 实例(或其他方法)来获取文件,而不是使用 S3 作为中介吗?有更好的方法吗?

非常感谢任何指导。随意向我学习任何可以在高文件量下省钱的替代想法。

【问题讨论】:

【参考方案1】:

我会把它分成小组件。

负载平衡器 伸缩组中的 FTP 服务器 FTP 服务器上的守护进程移动到 S3,然后将作业排队 处理伸缩组中的服务器

这样,您可以在必要时扩展 ftp 服务器,或扩展处理服务器(根据 SQS 队列长度或处理器利用率)。您最终可能会得到一个 ftp 服务器和 5 个处理服务器,反之亦然 - 但至少这样您只能在瓶颈处扩展。

您可能想要查看的另一件事是 DataPipeline - 它(虽然不知道您的工作细节)听起来像是为您的用例量身定制的。

S3 和队列很便宜,它可以让您更精细地控制不同的组件以进行适当的扩展。您也可以使用通配符策略和 IAM 来加强数据隔离。

【讨论】:

【参考方案2】:

理想情况下,我会尝试在当前放置的服务器上处理文件。 这将节省大量网络流量和 CPU 负载。

但是,如果您希望其中一台服务器像反向代理并在服务器群之间进行负载平衡,那么我将通过 http 调用通知服务器文件已到达。我将通过 ftp 提供该文件,因为您已经有工作的 vsftp 这不会成为问题,并将在 http 调用中包含文件 ftp url,因此将进行处理的服务器可以获取该文件并立即开始处理它.

通过这种方式,您将无需使用任何额外的 S3 或 SQS 或任何其他附加服务,从而节省资金。

如果服务器群由相同类型的服务器组成,那么分配负载的算法应该是RoundRobin 如果服务器容量不同,那么负载分配应该根据服务器性能进行。

例如,如果服务器一的性能是服务器三的 3 倍,服务器二的性能是服务器三的 2 倍,那么您可以这样做:

1: Server ONE - forward 3 request
2: Server TWO - forward 2 request
3: Server THREE - forward 1 request
4: GOTO 1

理想情况下,应该有来自报告当前负载的服务的反馈,以便负载平衡器知道谁是下一个请求的最佳候选者,而不是使用硬编码算法,因为可能请求不需要完全相同数量的要处理的资源,但这开始看起来像Map-Reduce paradigm 并且超出了范围......至少在开始时是这样。 :)

【讨论】:

【参考方案3】:

如果您想坚持使用 S3,您可以使用 RioFS 将 S3 存储桶作为本地文件系统挂载到您的 FTP 和处理服务器上。然后你可以做通常的文件操作(例如:在创建/修改文件时获取通知)。

【讨论】:

【参考方案4】:

与 RioFS 一样,s3fs-fuse 利用 FUSE 提供了一个(本地虚拟)可挂载的文件系统; s3fs-fuse 目前是well-maintained。

相比之下Filesystem Abstraction for S3, HDFS and normal filesystem swineherd-fs 允许使用不同的(本地虚拟)方法:

All filesystem abstractions implement the following core methods, based on standard UNIX functions, and Ruby's File class [...]。

由于“本地抽象层”一直是Only thoroughly tested on Ubuntu Linux,我个人会选择更主流/可靠/较少实验性的堆栈,即:

(沙盒)vsftpd 用于 FTP 传输 (可选)listen 用于文件系统更改,最后是 触发器 middleman-s3_sync 进行云提升(或自行同步)。

另外,更多实验性的,有一些 github 项目可能适合它:

s3-ftp: FTP 服务器前端 将所有上传内容转发到 S3 存储桶 (Clojure) ftp-to-s3: 一个 FTP 服务器 将收到的每个文件上传到 S3 (Python) ftp-s3:在 Python 中将 FTP 前端连接到 S3。

最后但并非最不重要的一点是,如果在 OSX 上,我建议使用捐赠软件 Cyberduck - 一个舒适(并且非常类似于 FTP)的客户端直接连接 S3。对于 Windows,有一个名为 S3 Browser 的(PRO 可选)免费软件。

【讨论】:

以上是关于最佳实践:带文件处理的 AWS ftp的主要内容,如果未能解决你的问题,请参考以下文章

AWS Cognito:处理相同用户(使用相同电子邮件地址)从不同身份提供商(Google、Facebook)登录的最佳实践

处理 javascript 和 css 文件的最佳实践是啥

在 R 中处理个人功能的最佳实践

使用 AWS 处理 .csv 数据的最佳方式

AWS 任务角色策略的最佳实践

ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践