對象存儲誕生之初談到為什么要有對象存儲,,必須聊聊對象存儲誕生之前的兩大存儲模型:塊存儲和文件存儲。 塊存儲主要是將存儲介質(zhì)的空間整個映射給主機使用的,,主機如果需要對這些空間進行讀寫IO操作,,需要先進行分區(qū)和格式化處理,形成可以被操作系統(tǒng)識別的邏輯命名空間,,之后主機才能通過操作系統(tǒng)對這些存儲介質(zhì)進行讀寫操作,。常見的塊存儲有磁盤,SSD,,NAS,、SAN等,,這些物理設(shè)備都或多或少存在物理上的極限,比如存儲空間,、性能等都存在物理極限,。 文件存儲立足于物理存儲介質(zhì)之上,是操作系統(tǒng)對數(shù)據(jù)管理操作的抽象,,這些抽象最終匯總形成文件系統(tǒng),。一般我們提到的文件系統(tǒng)都遵循POSIX標(biāo)準(zhǔn),而POSIX標(biāo)準(zhǔn)定義了操作系統(tǒng)應(yīng)該為其上運行的應(yīng)用程序提供的接口標(biāo)準(zhǔn),?;谶@套接口標(biāo)準(zhǔn),我們可以非常方便的將數(shù)據(jù)以文件,、文件夾方式進行管理,,但是常見的文件系統(tǒng)都是按目錄樹進行管理,在互聯(lián)網(wǎng)數(shù)據(jù)爆炸時代,,隨著文件目錄層級不斷增加,,亦或是文件數(shù)量達到海量以后,文件管理成本會直線飆升,,特別是一些遍歷操作會變得非常低效,,因此文件存儲在面對海量數(shù)據(jù)的時候有些力不從心。 介紹完塊存儲和文件存儲以后,,終于輪到對象存儲出場,,那對象存儲又是如何克服塊存儲和文件存儲的短板?在介紹對象存儲之前,,需要各位特別注意的就是對象存儲天生就帶互聯(lián)網(wǎng)基因,,完美適配當(dāng)前互聯(lián)網(wǎng)場景下的各種爆炸式數(shù)據(jù)需求,具體表現(xiàn)為: 扁平化的命名空間 將數(shù)據(jù)以對象(Object)形式存儲在以桶(Bucket)為命名空間的兩級結(jié)構(gòu)中,通過新增Bucket方式來橫向擴展命名空間,,同時通過在Bucket中不斷新增Object方式來實現(xiàn)海量數(shù)據(jù)的存儲,,這種扁平化的數(shù)據(jù)管理模型克服了目錄樹管理的不足,,實現(xiàn)了海量數(shù)據(jù)簡單有效的管理,。需要注意的是Bucket的名稱全局唯一,通過桶名稱(Bucket name) 對象的鍵名(Key name)來定位一個對象的最終存儲路徑,。
分布式構(gòu)架設(shè)計 借助扁平化的管理模型設(shè)計,,使得整個對象存儲系統(tǒng)可以按命名空間規(guī)則進行底層數(shù)據(jù)存儲的分區(qū),借助一些哈希算法最終將需要存儲的數(shù)據(jù)按分區(qū)規(guī)則均勻分布到多個主機的多塊磁盤上,,從而實現(xiàn)數(shù)據(jù)的分布式存儲,,從而解決了物理硬件的擴容及性能問題,為海量數(shù)據(jù)的存儲鋪平道路,。 通用化的接口標(biāo)準(zhǔn) 在解決了海量數(shù)據(jù)管理和硬件短板的問題之后,,對象存儲還要克服一個關(guān)鍵的問題:如何實現(xiàn)通用接口標(biāo)準(zhǔn),?通用接口標(biāo)準(zhǔn)對一個對象存儲系統(tǒng)來說至關(guān)重要,這個是整個系統(tǒng)與外圍系統(tǒng)打交道的重要窗口,。如何兼容各種外圍系統(tǒng),,去適配各種開發(fā)語言,形成一套圍繞對象存儲系統(tǒng)的生態(tài)標(biāo)準(zhǔn),?同樣遵循“Simple is best,!”思想,互聯(lián)網(wǎng)時代HTTP大行其道,,到處都通行的RESTful風(fēng)格被對象存儲“一眼相中”,,目前主流的對象存儲在接口標(biāo)準(zhǔn)的實現(xiàn)上都提供RESTful風(fēng)格的API,同時也衍生出各種語言的SDK,,當(dāng)然有些對象存儲也實現(xiàn)了RPC,、SOAP等標(biāo)準(zhǔn),這里篇幅有限就不再贅述,。
(非)結(jié)構(gòu)化數(shù)據(jù)與對象存儲什么是結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)?以大家熟知的關(guān)系型數(shù)據(jù)庫場景為例: 將一個人的屬性抽象出來,,分為姓名(name),年齡(age),住址(address),郵箱(email)幾個標(biāo)簽,之后將這些信息存儲到數(shù)據(jù)庫中,,那么某個人將對應(yīng)到數(shù)據(jù)庫里的一條記錄,。眾所周知,我們現(xiàn)在熟知的數(shù)據(jù)庫主要是關(guān)系型數(shù)據(jù)庫,,如果能夠?qū)?shù)據(jù)按關(guān)系模型進行存儲和管理,,那么這一類數(shù)據(jù)就是結(jié)構(gòu)化數(shù)據(jù)。 與之相對立的就是非結(jié)構(gòu)化數(shù)據(jù),。如果上面需要存儲的數(shù)據(jù)新增了一個相片(photo)字段,,用于存儲用戶的相片數(shù)據(jù),因為相片數(shù)據(jù)無法通過關(guān)系型數(shù)據(jù)進行描述,,所以一般存儲相片都是以二進制方式(非結(jié)構(gòu)化方式)存儲在關(guān)系數(shù)據(jù)庫中,,但是傳統(tǒng)數(shù)據(jù)庫不是萬能。當(dāng)需要比較多張相片的相似度,,并刪除重復(fù)相片,,特別是需要管理海量相片的時候,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,,會讓你覺得異常痛苦,。 對象存儲正是為了彌補傳統(tǒng)關(guān)系型數(shù)據(jù)庫在管理非結(jié)構(gòu)化數(shù)據(jù)方面的不足。在對象存儲模型中,,將每一條存儲在其中的非結(jié)構(gòu)化數(shù)據(jù)抽象成一個“對象”,,一個對象(Object)主要由下面四部分組成: 鍵名(Key):用于標(biāo)識對象的名稱,通過Bucket name Key的組合來確定對象最終存儲路徑,。 鍵值(Value):用于存儲對象的內(nèi)容數(shù)據(jù),。 訪問控制列表(ACL):標(biāo)識對象可以被哪些用戶或者用戶組訪問,。 元數(shù)據(jù)(Metadata):用于以key-value形式存儲對象其他額外信息,比如對象內(nèi)容的MD5校驗值,,對象的屬主(owner),,atime/ctime/mtime等。
再來看一下我們熟悉的文件系統(tǒng)下一個文件都有哪些屬性,以Linux下面使用stat和md5sum命令查看ceph.conf文件為例 root@demo:/home/user# stat ceph.conf File: ‘ceph.conf’ Size: 2534 Blocks: 8 IO Block: 4096 regular file Device: fe21h/65057d Inode: 1409 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-09-19 06:25:02.294973380 0800 Modify: 2017-03-17 11:20:13.736611814 0800 Change: 2017-03-17 11:20:13.736611814 0800 Birth: - root@demo:/home/user# md5sum ceph.conf 1f3695479cf9198e318cd930b91ab97d ceph.conf
通過上面的命令可以很輕松的看到文件的ACL,、MD5,、atime/ctime/mtimed等,接下來就是將文件系統(tǒng)的這些內(nèi)容轉(zhuǎn)換成對象存儲里面相應(yīng)的屬性即可,,這里使用一個s3cmd工具實現(xiàn)對象存儲的上傳,,具體操作及效果如下 root@demo:/home/user# s3cmd put ceph.conf s3://my-bucket 'ceph.conf' -> 's3://my-bucket/ceph.conf' [1 of 1] 2534 of 2534 100% in 0s 31.61 kB/s done 'ceph.conf' -> 's3://my-bucket/ceph.conf' [1 of 1] 2534 of 2534 100% in 0s 34.84 kB/s done root@demo:/home/user# s3cmd info s3://my-bucket/ceph.conf s3://my-bucket/ceph.conf (object): File size: 2534 Last mod: Tue, 14 Nov 2017 06:45:37 GMT MIME type: text/plain MD5 sum: 1f3695479cf9198e318cd930b91ab97d SSE: none cors: none ACL: s3user: FULL_CONTROL x-amz-meta-s3cmd-attrs: uid:0/gname:root/uname:root/gid:0/mode:33188/mtime:1489720813/atime:1474237502/md5:1f3695479cf9198e318cd930b91ab97d/ctime:1489720813
通過上面的介紹,相信大家已經(jīng)對對象存儲已經(jīng)有所了解,。那么如何解決快速刪除重復(fù)相片的問題,?只需要將每張相片存儲在對象存儲中,同時以元數(shù)據(jù)方式記錄對應(yīng)的MD5值,,在不讀取圖片內(nèi)容的情況下,,通過比較每個對象的MD5值是就能快速的篩選出重復(fù)的相片。
|