对象存储

**對象存儲**（英語：Object storage）是一種計算機數據存儲架構，它將數據作為對象進行管理，與其他存儲架構不同（如文件系統將數據作為文件層次結構進行管理，而塊存儲則將數據作為扇區和軌道內的塊進行管理）。 每個對象通常包括數據本身、數量不等的元數據和一個全局唯一的標識符。對象存儲可以在多個層面實現，包括設備層面（對象存儲設備）、系統層面和接口層面。在每一種情況下，對象存儲都試圖實現其他存儲架構所不具備的能力，如可由應用程式直接編程的接口，可跨越多個物理硬體實例的命名空間，以及數據管理功能，如數據複製和對象級粒度的數據分發。

對象存儲系統允許保留大量的非結構化數據。對象存儲的用途包括：在 Facebook 上存儲照片，在 Spotify 上存儲歌曲，或在在線協作服務（如 Dropbox）中存儲文件。

## 歷史

### 起源

1995 年，由 Garth Gibson 領導的關於網絡附加安全磁碟的研究首次推廣了將不太常見的操作（如命名空間操作）與常見的操作（如讀和寫）分開的概念，以優化兩者的性能和規模。 同年，比利時公司 FilePool 成立，為歸檔功能奠定了基礎。1996 年，對象存儲作為一個研究項目在 Gibson 的卡內基・梅隆大學實驗室提出。 另一個關鍵概念是將數據的寫入和讀取抽象為更靈活的數據容器（對象）。NASD 團隊之一的 Howard Gobioff 進一步描述了通過對象存儲架構的細粒度訪問控制，他後來是 Google 檔案系統的發明人之一。 其他相關工作包括卡內基・梅隆大學的 Coda 文件系統項目，該項目始於 1987 年，並催生了 Lustre 文件系統。 還有 1999 年開始的加州大學伯克利分校的 OceanStore 項目和 1998 年開始的田納西大學諾克斯維爾分校的 Logistical Networking 項目。 1999 年，Gibson 成立了 Panasas 公司，將 NASD 團隊開發的概念商業化。

### 發展

希捷科技在對象存儲的發展中發揮了核心作用。根據存儲網絡工業協會 SNIA 的說法，「對象存儲起源於 20 世紀 90 年代末。希捷公司 1999 年的規範介紹了一些最早的命令和作業系統如何有效地從存儲的消費中移除」。

1999 年 10 月 25 日的《基於對象的存儲設備命令集提案》的初步版本是由希捷提交的，由希捷的 Dave Anderson 編輯，是國家存儲產業聯盟（NSIC）的工作成果，包括卡內基梅隆大學、希捷、IBM、昆騰和 StorageTek 的貢獻。 這篇論文是向 INCITS T-10（國際信息技術標準委員會）提出的，目的是組建一個委員會並設計一個基於 SCSI 接口協議的規範。這個規範將對象定義為抽象的數據，具有唯一的標識符和元數據，還定義了對象如何與文件系統相關，以及其他許多創新概念。Anderson 在 1999 年 10 月的 SNIA 會議上提出了許多這些想法。該演講揭示了 1997 年 2 月原始合作者（由 Anderson 和 Chris Malakapalli 代表希捷）之間簽署的智慧財產權協議，並涵蓋了對象存儲、可擴展計算、平台獨立性和存儲管理的好處。

## 架構

### 存儲的抽象化

對象存儲的設計原則之一是將一些較低層次的存儲從管理員和應用程式中抽象出來。因此，數據是作為對象而不是文件或塊被暴露和管理的。對象包含額外的描述性屬性，可用於更好地進行索引或管理。管理員不必執行較低層次的存儲功能，如構建和管理邏輯卷以利用磁碟容量或設置 RAID 級別以處理磁碟故障。

對象存儲還允許通過不僅僅是文件名和文件路徑對單個對象進行尋址和識別。對象存儲在一個桶內或整個系統中增加了一個唯一的標識符，以支持更大的命名空間並消除名稱衝突。

### 將豐富的自定義元數據納入對象中

對象存儲明確地將文件元數據與數據分開，以支持額外的功能。相對於文件系統中的固定元數據（文件名、創建日期、類型等），對象存儲提供了全功能的、自定義的、對象級的元數據，以便於：

* 捕獲特定應用或特定用戶需要的信息，以更好地進行索引
* 支持數據管理策略（例如，驅動對象從一個存儲層移動到另一個存儲層的策略）。
* 集中管理許多單獨節點和集群的存儲
* 優化元數據存儲（如封裝、資料庫或鍵值存儲）和緩存 / 索引（當權威元數據與對象內部的元數據封裝在一起時），獨立於數據存儲（如非結構化二進位存儲）。

此外，在一些基於對象的文件系統實現中：

* 文件系統客戶端只在文件打開時與元數據伺服器聯繫一次，然後直接通過對象存儲伺服器獲得內容（而基於塊的文件系統需要持續的元數據訪問）。
* 可以根據每個文件配置數據對象，以允許自適應條帶寬度，甚至可以跨多個對象存儲伺服器進行配置，從而支持對帶寬和 I/O 進行優化

**基於對象的存儲設備**（**OSD**）以及一些軟體實現（例如，DataCore Swarm）在存儲設備層面管理元數據和數據：

* 不是提供面向塊的接口來讀寫固定大小的數據塊，而是將數據組織成靈活大小的數據容器（稱作「對象」）
* 每個對象都有數據（未解釋的字節序列）和元數據（描述對象的可擴展的屬性集）；將兩者物理封裝在一起有利於提升可恢復性。
* 命令界面包括創建和刪除對象、向單個對象寫入字節和讀取字節，以及設置和獲取對象屬性的命令
* 安全機制提供每個對象和每個命令的訪問控制

### 編程式的數據管理

對象存儲提供了編程接口，使應用程式能夠操作數據。在基礎層面，這包括用於基礎讀、寫和刪除操作的增刪改查（CRUD）功能。一些對象存儲的實現更進一步，支持對象版本控制、對象複製、生命周期管理以及對象在不同層級和類型的存儲之間的移動等附加功能。大多數 API 實現是基於 REST 的，允許使用許多標準的 HTTP 調用。

## 實現

### 雲存儲

市場上絕大多數的雲存儲都是利用對象存儲的架構。一些值得注意的例子是 2006 年 3 月首次亮相的亞馬遜網絡服務 S3、Microsoft Azure Blob 存儲、Rackspace Files（其代碼在 2010 年捐贈給 Openstack 項目並作為 OpenStack Swift 發布）以及 2010 年 5 月發布的谷歌雲存儲。

### 基於對象的文件系統

一些分布式文件系統使用基於對象的架構，其中文件元數據存儲在元數據伺服器中，文件數據存儲在對象存儲伺服器中。文件系統客戶端軟體與不同的伺服器進行交互，並將其抽象化，以向用戶和應用程式展示一個完整的文件系統。

### 對象存儲系統

一些早期的對象存儲被用於歸檔，因為實現是針對數據服務（如不變性）而不是性能進行優化。EMC Centera 和日立 HCP（以前被稱為 HCAP）是兩個常見的用於歸檔的對象存儲產品。另一個例子是 Quantum Lattus 對象存儲平台。

更多的通用對象存儲系統在 2008 年左右進入市場。在雅虎郵箱等網絡應用的「私藏」存儲系統的驚人增長和雲存儲的早期成功的誘惑下，對象存儲系統承諾具有雲存儲的規模和能力，並能夠在企業內或有志於雲存儲的服務提供商處部署系統。

### 混合存儲

少數對象存儲系統支持統一文件和對象（UFO）存儲，允許一些客戶在一個存儲系統上存儲對象，同時其他客戶在同一存儲系統上存儲文件。雖然由於與混合旋轉磁碟和快閃記憶體的混淆，「混合存儲」並不是這個概念的一個廣泛接受的術語， 但在一些對象存儲產品中，對相同的數據集有可操作的接口。

### 「私藏」對象存儲

一些大型網際網路公司在對象存儲產品沒有商業化或使用案例非常特殊的情況下開發了自己的軟體。著名的 Facebook 開發了他們自己的對象存儲軟體，代號為 Haystack，以有效解決他們特殊的大規模照片管理需求。

### 基於對象的存儲設備

協議和設備層的對象存儲是在 20 年前提出的，並在近 10 年前作為「基於對象的存儲設備命令」（OSD）被批准用於 SCSI 命令集， 然而，直到希捷 Kinetic 開放存儲平台的開發，它還沒有投入生產。 對象存儲設備的 SCSI 命令集是由 SNIA 的一個工作小組為國際信息技術標準委員會（INCITS）的 T10 委員會開發的。 T10 負責所有 SCSI 標準。

## Market adoption

最早的對象存儲產品之一，Lustre，被用於 70% 的前 100 名超級計算機和約 50% 的前 500 名超級計算機。 截至 2013 年 6 月 16 日，這包括前 10 名中的 7 名，包括目前榜單上第四快的系統 —— 中國的天河二號，和第七快的橡樹嶺國家實驗室的泰坦超級計算機。

對象存儲系統在 21 世紀初作為存檔平台有很好的應用，特別是在薩班斯 - 奧克斯利法案等合規法律出台後。在進入市場五年後，EMC 的 Centera 產品聲稱到 2007 年有超過 3500 個客戶和 150PB 的出貨量。 日立的 HCP 產品也聲稱有許多 PB 級的客戶。 較新的對象存儲系統也得到了一些吸引力，特別是圍繞非常大的定製應用，如 eBay 的拍賣網站，EMC Atmos 被用來每天管理超過 5 億個對象。 截至 2014 年 3 月 3 日，EMC 聲稱已經售出超過 1.5 兆字節的 Atmos 存儲。 2014 年 7 月 1 日，洛斯阿拉莫斯國家實驗室選擇 Scality RING 作為 500PB 存儲環境的基礎，這將是有史以來最大的存儲環境之一。

像 Facebook 的 Haystack 這樣的「私藏」對象存儲系統的規模也令人印象深刻。 2009 年 4 月，Haystack 管理著 600 億張照片和 1.5PB 的存儲，每周增加 2.2 億張照片和 25TB。Facebook 最近表示，他們每天增加 3.5 億張照片，存儲 2400 億張照片。 這可能相當於 357PB 之多。

隨著許多新的網絡和行動應用程式選擇雲作為存儲二進位數據的常用方式，雲存儲已經變得無處不在。 作為許多流行的應用程式如 Smugmug 和 Dropbox 的存儲後端，AWS S3 已經發展到大規模，在 2013 年 4 月引用了超過 2 萬億的存儲對象。 兩個月後，微軟聲稱他們在 Azure 中存儲的對象甚至更多，達到 8.5 萬億。 到 2014 年 4 月，Azure 聲稱存儲了超過 20 萬億個對象。 Windows Azure 存儲管理著 Blobs（用戶文件）、表（結構化存儲）和隊列（消息傳遞），並把它們都算作對象。

## 市場分析

IDC 已經開始使用其 MarketScape 方法每年評估基於對象的存儲市場。IDC 將 MarketScape 描述為。"... 對評估供應商在上述市場或細分市場的當前和未來成功的特徵進行定量和定性評估，並提供一個衡量其成為領導者或保持領導地位的標準。IDC 的 MarketScape 評估對新興市場特別有幫助，這些市場往往是分散的，有幾個參與者，缺乏明確的領導者。"

在 2019 年，IDC 將戴爾 EMC、日立數據系統、IBM、NetApp 和 Scality 評為領導者。

## 標準

### 基於對象的存儲設備標準

#### OSD 版本 1

在 OSD 標準的第一個版本中， 對象是用一個 64 位的分區 ID 和一個 64 位的對象 ID 指定的。分區在 OSD 中被創建和刪除，而對象在分區中被創建和刪除。分區或對象沒有固定的大小，它們被允許在設備的物理大小限制或分區的邏輯配額限制下增長。

一套可擴展的屬性描述對象。有些屬性是由 OSD 直接實現的，如一個對象的字節數和一個對象的修改時間。有一個特殊的策略標籤屬性，是安全機制的一部分。其他的屬性則不被 OSD 所解釋。這些是由使用 OSD 進行持久化存儲的上級存儲系統在對象上設置的。例如，屬性可能被用來對對象進行分類，或者用來捕捉存儲在不同 OSD 上的不同對象之間的關係。

列表命令返回一個分區中的對象的標識符列表，可以選擇通過與屬性值的匹配進行過濾。列表命令還可以返回列表對象的選定屬性。

讀和寫的命令可以與獲取和設置屬性的命令結合起來，或者說是捎帶上的。這種能力減少了高層存儲系統穿越接口到 OSD 的次數，這可以提高整體效率。

#### OSD 版本 2

第二代 SCSI 命令集「基於對象的存儲設備 - 2」（OSD-2）增加了對快照、對象集合的支持，並改進了錯誤處理。

快照是將一個分區中的所有對象複製到一個新的分區中的時間點。OSD 可以使用寫時拷貝技術實現空間效率高的拷貝，這樣兩個分區就可以共享快照之間沒有變化的對象，或者 OSD 可以將數據物理地拷貝到新的分區中。該標準定義了克隆和快照，前者是可寫的，後者是只讀的。

集合是一種特殊的對象，包含其他對象的標識符。有一些操作可以從集合中添加和刪除，還有一些操作可以獲取或設置集合中所有對象的屬性。集合也被用於錯誤報告。如果一個對象因為介質缺陷（即磁碟上的一個壞點）或 OSD 實現中的軟體錯誤而損壞，它的標識符會被放入一個特殊的錯誤集合中。使用 OSD 的上級存儲系統可以查詢這個集合併在必要時採取糾正措施。

## 鍵值存儲和對象存儲之間的差異

不幸的是，對象存儲和鍵 - 值存儲之間的邊界是模糊的，鍵值存儲有時被寬泛地稱為對象存儲。

傳統的塊存儲接口使用一系列固定大小的塊，這些塊從 0 開始編號。數據必須是準確的固定大小，並且可以存儲在一個特定的塊中，該塊由其邏輯塊編號（LBN）識別。之後，人們可以通過指定其唯一的 LBN 來檢索該數據塊。

在鍵值存儲中，數據是由一個鍵而不是 LBN 來識別的。一個鍵可能是「cat」 或「olive」或「42」。它可以是一個任意長度的任意字節序列。數據（在這裡稱為值）不需要有固定的大小，也可以是任意長度的任意字節序列。人們通過向數據存儲提交密鑰和數據（值）來存儲數據，隨後可以通過提交密鑰來檢索數據。這個概念在程式語言中可以看到。Python 稱其為字典，Perl 稱其為散列，Java 和 C++ 稱其為 map（映射），等等。一些數據存儲也實現了鍵值存儲，如 Memcached、Redis 和 CouchDB。

對象存儲在兩個方面與鍵值存儲相似。首先，對象的標識符或 URL（相當於鍵）可以是一個任意的字符串。 第二，數據可以是任意大小的。

然而，鍵值存儲和對象存儲之間有幾個關鍵的區別。首先，對象存儲還允許人們將一組有限的屬性（元數據）與每一個數據聯繫起來。一個鍵、值和一組屬性的組合被稱為一個對象。其次，對象存儲為大量的數據（幾百兆字節甚至幾千兆字節）進行了優化，而對於鍵值存儲來說，價值預計相對較小（千兆字節）。最後，對象存儲通常提供較弱的一致性保證，如最終一致性，而鍵值存儲提供強一致性。

## 參見

* 雲存儲
* 集群文件系統
* 對象訪問方法

## 參考文獻