2013-03-12 25 views
1

您可以在Amazon s3存儲桶中擁有無限制的對象,並使用getBucket API call來列出您的對象。有趣的是你可以使用任何字符作爲分隔符(比如Linux文件系統中的「/」)。大量的對象,S3 API如何實時響應?你不能指望全面掃描,對吧? s3存儲架構背後的技術有哪些?s3的getBucket API如何實現?

以下是我的一些搜索工作結果。任何人都知道更多的細節?

  1. s3 architecture
  2. amazon architecture
+0

有幾個設計決定可以避免使用全面掃描,如索引或簡單的[前綴樹](http://en.wikipedia.org/wiki/Trie),例如。 – Viccari 2013-03-12 12:18:24

+0

你是對的Viccari,索引​​部分是最具挑戰性的一部分。請注意,這不僅僅是一個前綴問題,爲了列出一個_「文件夾」_,必須跳過許多帶有共同前綴但不同於後分隔符部分的記錄。這個_skip_進程可能會帶來額外的開銷。 – 2013-03-13 05:01:00

回答

1

我加入一個答案,因爲沒有足夠的空間在評論部分:

有幾個設計決策,可能避免的用法例如全面掃描,如索引或簡單的前綴樹。

即使多個S3客戶端應用程序將前綴列爲文件夾,S3中也沒有這樣的概念。在一個存儲桶中,所有文件在層次上都處於同一級別。文件的組織方式是以鍵/值的方式,而不是以樹的方式(就像在「文件夾」式系統中所期望的那樣)。有關更多信息,請參閱this related question。所以,如果你想列出你的「文件夾」,是的,你很可能需要列出你的前綴,即根據前綴獲取對象,並跳過那些有額外信息的對象。

+0

謝謝Viccari。當然,這對於s3文件的命名空間是kv時尚,我很好奇s3架構的一部分,s3是如何做到這一點的:你可以使用任何字符串作爲分隔符,並且總文件數量是無限的。以這個示例數據集爲例:folder1/[level2]/[level3],我們有百萬級別2,每級百萬級別3,並執行ls前綴= folder1 /和delimiter = /,所有[level3]將被摺疊起來。這是一項真正具有挑戰性的工作。 – 2013-03-13 14:46:57

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)