對象存儲

對象存儲（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代表希捷）之間簽署的智慧財產權協議，並涵蓋了對象存儲、可擴展計算、平台獨立性和存儲管理的好處。

## 架構

<image>

### 存儲的抽象化

對象存儲的設計原則之一是將一些較低層次的存儲從管理員和應用程式中抽象出來。因此，數據是作為對象而不是文件或塊被暴露和管理的。對象包含額外的描述性屬性，可用於更好地進行索引或管理。管理員不必執行較低層次的存儲功能，如構建和管理邏輯卷以利用磁碟容量或設置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）存儲，允許一些客戶在一個存儲系統上存儲對象，同時其他客戶在同一存儲系統上存儲文件。雖然由於與混合旋轉磁碟和快閃記憶體的混淆，「混合存儲」並不是這個概念的一個廣泛接受的術語，但在一些對象存儲產品中，對相同的數據集有可操作的接口。

### 私有物件儲存

私有物件儲存是指將物件儲存系統部署於組織內部的本地端（on-premises）基礎架構中，而非完全依賴公有雲服務。此類系統通常支援標準物件儲存介面（如 S3 API），供內部應用程式或服務存取。

在部分實作中，私有物件儲存可與檔案或區塊型儲存共存於同一平台，構成混合型儲存架構。不同類型的資料可依其存取方式與管理需求分別處理。此類部署方式常見於需要資料主權控管、法規遵循，或需在本地端與雲端之間進行資料整合的環境。

### 「私藏」對象存儲

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

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

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

## 市場採用

最早的對象存儲產品之一，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（相當於鍵）可以是一個任意的字串。第二，數據可以是任意大小的。

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