1

您可以在 Amazon s3 存储桶中拥有无限的对象,并使用getBucket API 调用列出您的对象。有趣的是,您可以使用任何字符作为分隔符(如 Linux 文件系统中的“/”)。面对大量对象,S3 API 如何实时响应?你不能指望全面扫描,对吧?s3存储架构背后的技术是什么?

这是我到目前为止的一些搜索工作结果。有谁知道更详细的吗?

  1. s3架构
  2. 亚马逊架构
4

2 回答 2

1

我添加作为答案是因为评论部分没有足够的空间:

有几个设计决策可以避免使用完整扫描,例如索引或简单的前缀树。

尽管一些 S3 客户端应用程序会将前缀列为文件夹,但 S3 中没有这样的概念。在一个存储桶中,所有文件都分层地处于同一级别。文件的组织方式是键/值方式,而不是树方式(就像人们期望在类似“文件夹”的系统中所期望的那样)。请参阅此相关问题以获取更多信息。因此,如果您想列出您的“文件夹”,是的,您可能需要列出您的前缀,即根据前缀获取对象并跳过具有附加信息的对象。

于 2013-03-13T11:37:35.683 回答
0

您可以避免使用存储桶名称上的索引进行完整搜索。我在 MySQL 中做了一个关于这个的实验。MySQL 只真正支持此应用程序的 B-Trees,这不是一个完美的解决方案,但应该会显着加快速度。我创建了下表并用我系统上 /usr/ 下的所有文件(446594 个文件)填充它:

CREATE TABLE `files` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `filename` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `dirname` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `filename` (`filename`)
) ENGINE=InnoDB AUTO_INCREMENT=446722 DEFAULT CHARSET=utf8 \ 
COLLATE=utf8_unicode_ci;

结果意义重大。

mysql> select count(*) from files where filename like "/usr/lib/%" \ 
and filename regexp "^/usr/lib/[^/]*";
+----------+
| count(*) |
+----------+
|    68678 |
+----------+
1 row in set (0.21 sec)

mysql> select count(*) from files where filename regexp "^/usr/lib/[^/]*";
+----------+
| count(*) |
+----------+
|    68678 |
+----------+
1 row in set (3.06 sec)
于 2016-07-07T09:01:06.327 回答