我需要设置一个容量非常大的 SFTP 服务器。我需要将我们的一个合作伙伴的 SFTP 登录详细信息提供给一个服务器,他们将在该服务器上上传数百万个文件,总计几百 TB。然后我会有选择地阅读其中一些文件,而且很少阅读。这是唯一的实际要求,任何技术选择都是可以争取的。
想到的最简单的方法是让某种 EC2 实例运行 SFTP 服务器,这样上传的任何内容都会直接发送到 S3,或者某种进程在上传新文件时发现它们,将其复制到 S3,然后从磁盘中删除它们。
这是最好的方法吗?还有其他方法可以让服务器拥有“无限且神奇地增长的磁盘空间”吗?
谢谢你的帮助!Daniel
答案1
s3fs 确实是一个合理的解决方案,就我而言,尽管存在理论/潜在问题,但我将它与 proftpd 结合起来,获得了优异的效果。
在我写答案的时候,我只为我的一位咨询客户设置了这个……但从那时起,我也开始喝自己的 Kool-Aid,并在日常工作中使用它。我们与之交换数据的公司整天在我的 sftp 服务器上上传和下载文件,该服务器将所有内容直接存储在 S3 上。作为奖励,我的报告导出系统(将 Excel 电子表格直接写入 S3)可以将报告“导出到 FTP 服务器”,只需将它们直接放入 ftp 服务器的存储桶中,并使用适当的元数据显示每个文件的 uid、gid 和模式。(s3fs 使用 x-amz-meta-uid、-gid 和 -mode 标头来模拟文件系统权限)。当客户端登录到服务器时,报告文件就在那里。
我确实认为理想的解决方案可能是 sftp 到 S3 网关服务,但我还没有开始设计一个,因为这个解决方案确实很有效……当然,也有一些注意事项:
并非所有 s3fs 的默认值都是合理的。您可能需要指定以下选项:
-o enable_noobj_cache # s3fs has a huge performance hit for large directories without this enabled
-o stat_cache_expire=30 # the ideal time will vary according to your usage
-o enable_content_md5 # it's beyond me why this safety check is disabled by default
最好使用除 US-Standard 之外的区域,因为这是唯一不提供新对象读写一致性的区域。(或者,如果您需要使用 US-Standard,则可以使用your-bucket.s3-external-1.amazonaws.com
us-east-1 区域中几乎未记录的主机名来防止您的请求被地理路由,这可能会提高一致性。)
我在存储桶上启用了对象版本控制,而 s3fs 对此完全不知情。这样做的好处是,即使文件被“破坏”,我也始终可以通过存储桶版本控制来恢复“覆盖”的文件。S3 中的对象版本控制设计得非常巧妙,以至于不知道版本控制的 S3 客户端绝不会受到禁用或混淆,因为如果您不进行版本控制感知的 REST 调用,S3 返回的响应将与没有版本控制概念的客户端兼容。
还请注意传输数据进入S3 是免费的的数据传输费用。您只需支付每个请求的定价。在区域内将数据从 S3 传输到 EC2 也无需支付数据传输费用。只有当您将数据从 S3 传输到 Internet、Cloudfront 或另一个 AWS 区域时,您才需要支付传输费用。如果您想使用价格较低的低冗余存储,s3fs 可通过 来支持-o use_rrs
。
有趣的是,当您看到 256 TB 的可用空间(并且已使用 0 个空间,因为 S3 是对象存储而不是文件系统,因此实际计算大小是不切实际的)时,您总会感到温暖模糊的感觉。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.9G 1.4G 6.2G 18% /
s3fs 256T 0 256T 0% /srv/s3fs/example-bucket
当然,您可以将存储桶安装在任何地方。我恰好将它安装在 /srv/s3fs 中。
答案2
我们在使用 s3fs 时遇到了可靠性问题,因此我们专门为此开发了一个自定义解决方案。我们在生产中使用它已经好几年了,没有出现任何问题,最近我们将其发布到了 AWS Marketplace。
答案3
有两种选择。您可以使用亚马逊最近添加的本地托管 SFTP 服务(设置起来更容易)。或者您可以将存储桶安装到 Linux 服务器上的文件系统,并使用 SFTP 访问文件,就像访问服务器上的任何其他文件一样(这可以让您更好地控制)。
托管 SFTP 服务
在您的 Amazon AWS 控制台中,转到AWS Transfer for SFTP并创建一个新的服务器。
在 SFTP 服务器页面,添加一个或多个新的 SFTP 用户。
用户的权限由 IAM 服务中关联的 AWS 角色管理(为了快速入门,您可以使用亚马逊S3FullAccess政策)。
该角色必须与 有信任关系
transfer.amazonaws.com
。
有关详细信息,请参阅我的指南设置对 Amazon S3 的 SFTP 访问。
将 Bucket 安装到 Linux 服务器
正如@Michael 已经已回答,只需使用文件系统(或类似系统)将存储桶挂载s3fs
到 Linux 服务器(Amazon EC2)并使用该服务器的内置 SFTP 服务器访问该存储桶。
以下是基本说明:
将您的安全凭证以表单形式添加
access-key-id:secret-access-key
到/etc/passwd-s3fs
添加存储桶安装条目到
fstab
:<bucket> /mnt/<bucket> fuse.s3fs rw,nosuid,nodev,allow_other 0 0
有关详细信息,请参阅我的指南设置对 Amazon S3 的 SFTP 访问。
使用 S3 客户端
或者使用任何免费“FTP/SFTP 客户端”,这也是“S3 客户端”,并且您无需在服务器端进行任何设置。例如,我的 温SCP或者网络鸭。
答案4
另一个有趣的解决方案是迅捷FTP云。它是一种托管解决方案,与 AWS Transfer Family 一样,但价格更低,功能更多。与 AWS Transfer Family 相比,您可以使用以下提供商作为 SFTP 服务器的存储:
- S3
- Google 云端存储
- Azure Blob 存储
- DigitalOcean 空间
- Backblaze B2
- 芥末
- Cloudflare R2
UI 直观且易于使用。您可以管理用户、设置带宽和存储配额、基于密钥的身份验证、创建多个 SFTP 服务器(每个服务器可以拥有来自不同提供商的存储)、实时查看活动连接和文件系统事件。也许它会帮助其他正在寻找此类解决方案的用户。