隨著云計(jì)算的發(fā)展,云存儲(chǔ)作為一種更基礎(chǔ)的云上資源池設(shè)施也越來越受到重視和歡迎。從云存儲(chǔ)的類型來講,目前流行的有塊存儲(chǔ)、文件存儲(chǔ)和對(duì)象存儲(chǔ)三種。今天的主角是對(duì)象存儲(chǔ),不過我們?cè)诮榻B對(duì)象存儲(chǔ)之前,先來了解下另外兩種存儲(chǔ),做個(gè)對(duì)比,這樣才能更好的了解對(duì)象存儲(chǔ)。
塊存儲(chǔ)是什么?
對(duì)于這些概念網(wǎng)上我們可以找到很多,但是看著覺得太專業(yè),云里霧里。在這里我以更通俗的方式來介紹什么是塊存儲(chǔ)。
首先我們要明白一個(gè)關(guān)鍵,塊存儲(chǔ)的直接使用者不是我們?nèi)祟?,而是文件系統(tǒng)。更簡單的說塊存儲(chǔ)可以理解為一塊硬盤,就是這么簡單。至于這塊硬盤是單獨(dú)的物理盤,還是采用磁盤陣列技術(shù)組成的陣列,文件系統(tǒng)是不關(guān)心的,它?知道有幾個(gè)盤,至于是邏輯的還是物理的,它完全不關(guān)心(其實(shí)也管不著)。
我們常見的文件(數(shù)據(jù))是以固定大小的塊存放在塊存儲(chǔ)中的,根據(jù)文件大小的不同,可以分成很多個(gè)塊,當(dāng)我們讀取這個(gè)文件的時(shí)候,底層的存儲(chǔ)系統(tǒng)會(huì)將多個(gè)數(shù)據(jù)塊合并一起,就成了一個(gè)我們需要的文件。
一個(gè)塊存儲(chǔ),需要格式化(選擇文件系統(tǒng)的過程)才能被使用。比如你在騰訊云上買了一個(gè)40G的SSD云盤,這個(gè)云盤就是一個(gè)塊存儲(chǔ),你需要掛載到云主機(jī)上,然后選擇合適的文件系統(tǒng)進(jìn)行格式化,然后才能使用。
塊存儲(chǔ)支持隨機(jī)讀寫,一般用于特定業(yè)務(wù)的數(shù)據(jù)存儲(chǔ),不過他不支持共享。
文件存儲(chǔ)是什么?
文件存儲(chǔ)我們最常見了,就是我們電腦上的文件,經(jīng)常接觸。他們是以文件、文件夾的方式組織的,有層次結(jié)構(gòu)。通過FTP、SMB可以進(jìn)行共享,供多個(gè)用戶同時(shí)訪問。
文件存儲(chǔ)的元數(shù)據(jù)信息是放在文件里的,存儲(chǔ)有限,并且層次結(jié)構(gòu)也限制著性能。
終于來到了對(duì)象存儲(chǔ)
雖然塊存儲(chǔ)和文件存儲(chǔ)可以滿足大多數(shù)需求,但是它們還有個(gè)局限性就是不適合公有云存儲(chǔ),它們一般是用于局域網(wǎng)內(nèi)使用。
對(duì)象存儲(chǔ),一種以對(duì)象為基本單位的存儲(chǔ),它的結(jié)構(gòu)是扁平的,甚至可以認(rèn)為不存在結(jié)構(gòu),所以它擴(kuò)展比較容易。
對(duì)象存儲(chǔ)的數(shù)據(jù)一般是非機(jī)構(gòu)化數(shù)據(jù),比如文件、圖片和視頻這些。
對(duì)象存儲(chǔ)的非結(jié)構(gòu)化數(shù)據(jù),會(huì)被分片成一個(gè)個(gè)對(duì)象,存儲(chǔ)在不同的存儲(chǔ)節(jié)點(diǎn)上,這也是叫對(duì)象存儲(chǔ)的原因,它不想文件存儲(chǔ)是以文件和文件夾方式,塊存儲(chǔ)是以數(shù)據(jù)塊的方式。
對(duì)象存儲(chǔ)的核心概念
對(duì)象存儲(chǔ)非常簡單,只有2個(gè)核心概念:存儲(chǔ)桶(Bucket)和對(duì)象(Object)。一個(gè)存儲(chǔ)桶可以有很多個(gè)對(duì)象,這些對(duì)象都是平級(jí)的,也就是扁平的。
在對(duì)象存儲(chǔ)的時(shí)候,KEY就是對(duì)象的名稱,Value就是對(duì)象的內(nèi)容。所以對(duì)于對(duì)于是一個(gè)類似Hash,是一個(gè)KV方式存儲(chǔ)。
對(duì)象存儲(chǔ)是如何管理對(duì)象的
既然我們的對(duì)象都是扁平存儲(chǔ)的,而且還被分片了,那么是如何管理它們的,或者說如何找到我們想要的文件以及文件的信息等?這就是對(duì)象存儲(chǔ)核心的對(duì)象元數(shù)據(jù)管理。
對(duì)象的元數(shù)據(jù)就是用來管理數(shù)據(jù)的存儲(chǔ)、分片以及數(shù)據(jù)本身的信息,因?yàn)樵獢?shù)據(jù)單獨(dú)存儲(chǔ),所以我們可以為一個(gè)對(duì)象擴(kuò)展任意多的元數(shù)據(jù),這也是文件存儲(chǔ)做不到的。
對(duì)象存儲(chǔ)是如何有目錄結(jié)構(gòu)的
對(duì)象存儲(chǔ)的底層設(shè)計(jì)都是扁平的,沒有層次結(jié)構(gòu),但是我們看到的對(duì)象存儲(chǔ)管理工具的確給我們提供了目錄層次的管理,就像我們?cè)谑褂梦募到y(tǒng)一樣,其實(shí)這樣方式是通過KEY進(jìn)行區(qū)分的。
假設(shè)我們想達(dá)到/static/1.jpg這樣的存儲(chǔ)效果,那么在存儲(chǔ)的時(shí)候,對(duì)于圖片1.jpg保存在對(duì)象存儲(chǔ)中的KEY是/static/1.jpg,通過KEY中的/分隔,達(dá)到多級(jí)目錄的效果,其實(shí)本質(zhì)是KEY做了改變。
對(duì)象存儲(chǔ)如何防止數(shù)據(jù)丟失
以MinIO為例,對(duì)于分布式的對(duì)象存儲(chǔ)系統(tǒng),是采用糾刪碼的方式保證數(shù)據(jù)的安全。糾刪碼會(huì)把分布式的盤組成一個(gè)糾刪碼集合,默認(rèn)情況下,哪怕丟失N/2的數(shù)據(jù)盤,數(shù)據(jù)也可以正?;謴?fù)使用。
假設(shè)一個(gè)8塊盤(可以分散在多個(gè)主機(jī)上)組成的糾刪碼集合,哪怕同時(shí)有4個(gè)盤損壞丟失,數(shù)據(jù)也可以正常使用,并且可以從中恢復(fù),是不是很厲害。
Minio采用的是開源的糾刪碼實(shí)現(xiàn),可以參考 github.com/klauspost/reedsolomon了解更多實(shí)現(xiàn)。
對(duì)象存儲(chǔ)開源實(shí)現(xiàn)
對(duì)象存儲(chǔ)業(yè)界比較有名的是GlusterFS和Ceph,MinIO是后起之秀,也是是GlusterFS的開發(fā)人員做的,采用Go語言實(shí)現(xiàn)。而且他的擴(kuò)容機(jī)制是采用更簡單的集群方式而不是節(jié)點(diǎn)方式,大大降低了維護(hù)的復(fù)雜度,因?yàn)楣?jié)點(diǎn)的方式需要重新計(jì)算Hash以及對(duì)應(yīng)的舊文件遷移,加一個(gè)節(jié)點(diǎn)原來的Hash就亂了。MinIO的地址是:https://github.com/minio/minio,有興趣的朋友可以研究下。
小結(jié)
對(duì)象存儲(chǔ)兼容了文件和塊存儲(chǔ)的優(yōu)點(diǎn),又具備更好的擴(kuò)展以支持公有云存儲(chǔ)的需求,成本低、無限擴(kuò)容、更容易訪問等優(yōu)點(diǎn),會(huì)更多的被用戶所選擇。就像我當(dāng)前的博客網(wǎng)站 https://www.flysnow.org/使用的就是對(duì)象存儲(chǔ)搭建的靜態(tài)網(wǎng)站托管。