鍵值是一種基本的數(shù)據(jù)保存形式或數(shù)據(jù)結(jié)構(gòu),我們所熟知的NoSQL數(shù)據(jù)庫(kù)采用的就是這種數(shù)據(jù)結(jié)構(gòu)。它非常簡(jiǎn)單,由鍵和值對(duì)組成,鍵在數(shù)據(jù)集中具有唯一性。如果曾經(jīng)關(guān)注過(guò)基于對(duì)象的存儲(chǔ)(或文件系統(tǒng)),那么這些操作對(duì)你來(lái)說(shuō)應(yīng)該非常熟悉。實(shí)際上,對(duì)象存儲(chǔ)使用同樣的操作,比如亞馬遜的S3、OpenStack的Swift、Caringo及其他對(duì)象存儲(chǔ)。這些文件系統(tǒng)方案存在已有幾年,所以它們根本不是全新的。

那么,為何鍵值存儲(chǔ)會(huì)是眼下的一個(gè)熱門(mén)話題呢?理由很淺顯:它很簡(jiǎn)單,同時(shí)有一些新技術(shù)讓鍵值存儲(chǔ)更容易,可能更適用于比之前所用的速度更快的存儲(chǔ)。
實(shí)際上,鍵值存儲(chǔ)不僅能成為基于對(duì)象的存儲(chǔ)和文件系統(tǒng)的后端部分,還成為許多文件系統(tǒng)的后端部分,包括傳統(tǒng)上使用塊存儲(chǔ)的文件系統(tǒng)。目前,希捷已經(jīng)研發(fā)出了一款基于鍵值的、使用以太網(wǎng)接口的硬盤(pán)驅(qū)動(dòng)器,這也表明鍵值存儲(chǔ)是一個(gè)值得關(guān)注的發(fā)展方向。
支持鍵值存儲(chǔ)的驅(qū)動(dòng)器
希捷Kinetic驅(qū)動(dòng)器(Kinetic Drive)在鍵值存儲(chǔ)方面做出了大膽的探索。在Kinetic驅(qū)動(dòng)器中,希捷去除了傳統(tǒng)硬盤(pán)驅(qū)動(dòng)器的SAS或SATA接口,換成兩個(gè)以太網(wǎng)接口和簡(jiǎn)單的處理器。另外,在電源連接方面也有變化,不過(guò)Kinetic驅(qū)動(dòng)器的外觀尺寸與普通SAS驅(qū)動(dòng)器一樣。
把SAS接口換成以太網(wǎng)接口的好處在于,它擯棄了應(yīng)用程序與驅(qū)動(dòng)器本身之間的所有中間層。這個(gè)中間層涉及所有的POSIX函數(shù)調(diào)用、文件系統(tǒng)、卷管理器、驅(qū)動(dòng)程序,以及含有RAID控制器、高速緩存和SAS控制器等部件的存儲(chǔ)服務(wù)器。
就Kinetic驅(qū)動(dòng)器而言,應(yīng)用程序與開(kāi)發(fā)人員開(kāi)發(fā)的、取代文件系統(tǒng)的類(lèi)庫(kù)進(jìn)行通信,隨后類(lèi)庫(kù)使用TCP/IP,直接與Kinetic驅(qū)動(dòng)器進(jìn)行通信。這大大縮短了應(yīng)用程序和實(shí)際存儲(chǔ)之間的所有輸入輸出延遲。
但它只有以太網(wǎng)接口,我們?cè)撊绾问褂肒inetic驅(qū)動(dòng)器?希捷將Kinetic驅(qū)動(dòng)器變成了一種鍵值對(duì)存儲(chǔ)設(shè)備,用戶可以通過(guò)幾門(mén)編程語(yǔ)言,包括Java、C++和Python,訪問(wèn)該接口。這種接口有幾個(gè)簡(jiǎn)單的客戶端API:Put、Get、Delete,這些函數(shù)是不是很熟悉?Kinetic驅(qū)動(dòng)器還有另外幾個(gè)命令可以幫助開(kāi)發(fā)人員,包括getNext、getPrevious、getMetadata、getKeyrange。這種驅(qū)動(dòng)器還有管理員API,那樣就能管理和監(jiān)控驅(qū)動(dòng)器。
雖然希捷不愿詳細(xì)討論該驅(qū)動(dòng)器里面到底有什么玄機(jī),但基本上就是一個(gè)簡(jiǎn)單的鍵值數(shù)據(jù)庫(kù),可能還有某個(gè)簡(jiǎn)單的操作系統(tǒng)。深入探究的話,發(fā)現(xiàn)Kinetic驅(qū)動(dòng)器可以從事空間映射工作,包括需要執(zhí)行的任何垃圾收集工作。驅(qū)動(dòng)器存儲(chǔ)的鍵范圍在1字節(jié)到4 KiB之間,存儲(chǔ)的值范圍則在0字節(jié)到1 MiB之間。
開(kāi)發(fā)人員可以通過(guò)驅(qū)動(dòng)器的開(kāi)源編程庫(kù)編寫(xiě)或改動(dòng)文件系統(tǒng),以便將這種驅(qū)動(dòng)器用作存儲(chǔ)后端。另外,還可以編寫(xiě)相當(dāng)簡(jiǎn)單的輸入輸出庫(kù),那樣應(yīng)用程序就能與驅(qū)動(dòng)器之間直接進(jìn)行輸入輸出操作。
目前的Kinetic驅(qū)動(dòng)器有兩個(gè)千兆以太網(wǎng)接口。希捷提供的性能數(shù)字表明,順序讀取和寫(xiě)入速度約為50 MB/s,隨機(jī)寫(xiě)入速度也約為50 MB/s,不過(guò)隨機(jī)讀取速度比傳統(tǒng)驅(qū)動(dòng)器慢1.2倍。所以,性能與普通SAS驅(qū)動(dòng)器大致相當(dāng)。
有一些文件系統(tǒng)支持使用Kinetic驅(qū)動(dòng)器作為后端。比如,Swiftstack就有支持Kinetic的Swift版本。它面向可能用于數(shù)據(jù)歸檔的速度較慢、成本較低的存儲(chǔ)場(chǎng)景。
鍵值存儲(chǔ)的局限
有了鍵就很容易查詢(xún)對(duì)應(yīng)值、刪除鍵值對(duì),或者更換鍵值對(duì)中的值。開(kāi)發(fā)人員可以編寫(xiě)程序檢索所請(qǐng)求數(shù)據(jù)、寫(xiě)入數(shù)據(jù),或者擦除數(shù)據(jù)。但存儲(chǔ)數(shù)據(jù)還需要元數(shù)據(jù)。有好多方法可以進(jìn)行元數(shù)據(jù)操作,包括存儲(chǔ)文件到鍵的映射,作為Kinetic驅(qū)動(dòng)器或可能單獨(dú)數(shù)據(jù)庫(kù)中數(shù)據(jù)的一部分。開(kāi)發(fā)人員將所有函數(shù)和操作編寫(xiě)到輸入輸出庫(kù)。
這聽(tīng)起來(lái)很容易,但必須重新編寫(xiě)應(yīng)用程序的輸入輸出部分,才能使用Kinetic驅(qū)動(dòng)器提供的輸入輸出庫(kù)。鍵值存儲(chǔ)其實(shí)與POSIX并不兼容,所以這意味著存儲(chǔ)接口要么是新的,要么需要編寫(xiě)庫(kù)層,以便適應(yīng)POSIX輸入輸出函數(shù)調(diào)用。
使用鍵值存儲(chǔ)有難度,一個(gè)簡(jiǎn)單的例子是POSIX輸入輸出函數(shù)讓你可以查找到文件中的特定部位(偏移),但沒(méi)有對(duì)應(yīng)的鍵值函數(shù)讓你可以將文件指針移到文件中的指定位置。也就是說(shuō),你無(wú)法查找到文件中的特定部位,然后執(zhí)行某種輸入輸出操作。這是表明使用鍵值存儲(chǔ)方面有問(wèn)題的一個(gè)例子而已。辦法是要么針對(duì)特定的輸入輸出庫(kù)重新編寫(xiě)應(yīng)用程序,要么編寫(xiě)與POSIX兼容(或足夠相近)的庫(kù),可以與鍵值存儲(chǔ)進(jìn)行聯(lián)系。
另一個(gè)辦法是編寫(xiě)輸入輸出庫(kù),以便它有一個(gè)中間文件系統(tǒng)來(lái)執(zhí)行查找及鍵值存儲(chǔ)無(wú)法提供的其他操作。訪問(wèn)、打開(kāi)或創(chuàng)建文件后,與POSIX兼容的文件系統(tǒng)就執(zhí)行應(yīng)用程序所要求的全部操作,該文件系統(tǒng)用作中間文件系統(tǒng)。隨后在某個(gè)時(shí)候,中間文件系統(tǒng)中的數(shù)據(jù)被“清空”或拷貝到鍵值存儲(chǔ)。確保鍵值存儲(chǔ)中的數(shù)據(jù)與中間文件系統(tǒng)相一致,就需要一些認(rèn)真的設(shè)計(jì)和編碼工作。這不是最容易的解決辦法,不過(guò)為非POSIX輸入輸出庫(kù)和與POSIX兼容的庫(kù)起到了橋梁的作用。
不只是適用于歸檔存儲(chǔ)
鍵值存儲(chǔ)最擅長(zhǎng)的領(lǐng)域是歸檔存儲(chǔ)。這類(lèi)應(yīng)用程序不可能直接與歸檔存儲(chǔ)進(jìn)行聯(lián)系,因而不大需要與POSIX兼容或重新編寫(xiě)應(yīng)用程序。其本質(zhì)是只需要將數(shù)據(jù)“放入”歸檔,然后需要時(shí)從歸檔“獲取”數(shù)據(jù)的工具?!胺湃搿焙汀矮@取”這兩種操作非常適合于鍵值存儲(chǔ)。
如前所述,創(chuàng)建使用鍵值存儲(chǔ)的與POSIX兼容的系統(tǒng)并非易事,因?yàn)閷⑺蠵OSIX輸入輸出函數(shù)映射到鍵值存儲(chǔ)的簡(jiǎn)單函數(shù)有難度。然而,這并不意味著不可能??朔@個(gè)難題的一個(gè)辦法就是對(duì)現(xiàn)有的面向?qū)ο蟮奈募到y(tǒng)進(jìn)行改動(dòng),以適應(yīng)鍵值存儲(chǔ)。Ceph就是這方面的一個(gè)典例。
Ceph可以讓存儲(chǔ)在客戶端面前呈現(xiàn)為面向?qū)ο蟮奈募到y(tǒng)、塊存儲(chǔ)或文件。Ceph里面支持所有這三種存儲(chǔ)類(lèi)型的文件系統(tǒng)基于對(duì)象。Ceph v0.80(Firefly)支持鍵值OSD(對(duì)象存儲(chǔ)設(shè)備)。所以,絕對(duì)可以創(chuàng)建不只是歸檔的存儲(chǔ)解決方案,它也不一定只有歸檔存儲(chǔ)的有限性能。其他改動(dòng)后可使用鍵值存儲(chǔ)的性能良好的文件系統(tǒng),還有Lustre和GlusterFS。對(duì)鍵值存儲(chǔ)來(lái)說(shuō),性能不是一個(gè)限制因素。
鍵值存儲(chǔ)正迅速成為一項(xiàng)流行的存儲(chǔ)技術(shù),特別是在大容量、低性能的存儲(chǔ)領(lǐng)域受到特別關(guān)注。但鍵值存儲(chǔ)并不局限于歸檔或低性能存儲(chǔ)。恰恰相反,它可以用于性能更高的存儲(chǔ),Ceph就是個(gè)佐證。
希捷的Kinetic可以使用類(lèi)似REST的命令(比如get、put和delete)來(lái)尋址,這表明你可以用鍵值存儲(chǔ)實(shí)現(xiàn)什么、它有多簡(jiǎn)單。簡(jiǎn)單的開(kāi)源庫(kù)讓你隨后可以開(kāi)發(fā)輸入輸出庫(kù),那樣應(yīng)用程序就能執(zhí)行與驅(qū)動(dòng)器之間的輸入輸出操作。Swift等一些對(duì)象存儲(chǔ)解決方案早已進(jìn)行了移植,可以使用Kinetic驅(qū)動(dòng)器。Ceph還演示了可使用Kinetic驅(qū)動(dòng)器的一個(gè)版本。Lustre和Gluster等其他基于對(duì)象的存儲(chǔ)系統(tǒng)在理論上同樣可以使用這項(xiàng)技術(shù)。
鑒于此,請(qǐng)密切關(guān)注鍵值存儲(chǔ),它可能會(huì)出現(xiàn)在你身邊的文件系統(tǒng)中。