首页 > 解决方案 > 如何在存储桶中选择文件的密钥以最大化 AWS S3 中的性能

问题描述

我对 AWS 很陌生。我正在开发一个云应用程序,我想使用 S3 进行文件存储。我阅读了Request Rate and Performance Considerations - Amazon Simple Storage Service以更好地了解索引在 S3 中的工作原理,但我不得不说这对我来说不是很清楚。

我的应用程序是多租户的,它将为每个客户存储许多文件。

我的关键想法是:

bucketname/211a6589-caef-4554-acc6-bc0fd05d756d/a/f/z/3b288ae5-3779-49d1-a79e-1812d4fa76e2.pdf

以这种方式组成的密钥:

  1. 存储桶名称
  2. 租户的uuid
  3. 3级文件夹随机生成
  4. 文件的uuid

第 2 点对我很有用,因为我将租户的所有数据都放在了一个文件夹中。uuid 是唯一且随机的,因此应该是一个好习惯。我还添加了 3 级嵌套文件夹(随机生成),因为最初我为磁盘存储创建了这个方法,这样我可以平衡文件系统上的 inode。

从文档中,我不完全了解密钥的哪一部分用于在 S3 中进行索引。

为了从 S3 获得最佳性能,我的方法是否足够好?

标签: amazon-web-servicesamazon-s3

解决方案


首先,仅当存储桶“通常每秒超过 100 个 PUT/LIST/DELETE 请求或每秒超过 300 个 GET 请求”时才需要这种类型的工作。

这不是典型情况,因此如果您的应用程序不太可能达到这样的水平,请不要花费太多精力。但是,如果您认为自己会达到这样的水平,那么尽早将其“正确”是一个好主意。

想法是将负载分散到整个名称空间。将 Amazon S3 视为具有用于维护对象列表的树结构。对于大型存储桶,树结构的管理分布在服务器上。目标是将流量分散到多台服务器上,而不是只访问一台服务器。

如果您使用 UUID 来存储对象并且 UUID 是随机的,那么只需使用 UUID。这足以将负载分散到树结构中。即使是键前面的几个随机字符也足以分散负载。

如果您特别想在“每个租户”结构下存储文件,请使用:

tenant-uuid/object-uuid

这稍微不太好,因为一个租户可以同时获取/放置大量文件,并且它会影响树结构的一小部分,但如果您有许多同时用户,多租户应用程序的可能性很小。


推荐阅读