迷失在NoSQL的叢林中了?你需要這份導(dǎo)游手冊(cè)
Nosql數(shù)據(jù)庫(kù)
NoSQL這個(gè)詞,意思是 "不僅僅是SQL",最早出現(xiàn)在20世紀(jì)90年代末,指的是為了解決網(wǎng)絡(luò)和云數(shù)據(jù)管理的要求,克服傳統(tǒng)SQL技術(shù)的限制而建立的新系統(tǒng)(見(jiàn)我們的 blog post on SQL vs. NoSQL vs NewSQL不同方法之間的比較)。這些限制是缺乏橫向可擴(kuò)展性,數(shù)據(jù)攝取效率低,模式僵化,以及難以支持復(fù)雜的數(shù)據(jù),如文檔和圖表。
圖1:傳統(tǒng)的SQL數(shù)據(jù)庫(kù)
作為支持標(biāo)準(zhǔn)關(guān)系模型的傳統(tǒng)SQL數(shù)據(jù)庫(kù)的替代品,NoSQL系統(tǒng)支持標(biāo)準(zhǔn)SQL以外的數(shù)據(jù)模型和查詢(xún)語(yǔ)言。它們通常強(qiáng)調(diào)可擴(kuò)展性(以犧牲一致性為代價(jià))、靈活的模式和實(shí)用的API,用于編程復(fù)雜的數(shù)據(jù)密集型應(yīng)用。為了提供可擴(kuò)展性,NoSQL系統(tǒng)通常在一個(gè)無(wú)共享的集群中使用擴(kuò)展的方法(見(jiàn) blog post on shared-nothing),并進(jìn)行復(fù)制以保證可用性。
大數(shù)據(jù)軟件棧中的nosql
根據(jù)底層數(shù)據(jù)模型,NoSQL系統(tǒng)有四大類(lèi)(?zsu & Valduriez, 2020),例如,鍵值數(shù)據(jù)存儲(chǔ)、寬列存儲(chǔ)、文檔存儲(chǔ)和圖形數(shù)據(jù)庫(kù)。在每個(gè)類(lèi)別中,我們可以找到數(shù)據(jù)模型的不同變化(與標(biāo)準(zhǔn)化的關(guān)系數(shù)據(jù)模型不同)和不同的查詢(xún)語(yǔ)言或API。然而,對(duì)于文檔存儲(chǔ),JSON正在成為事實(shí)上的標(biāo)準(zhǔn)。還有一些多模型數(shù)據(jù)存儲(chǔ),在一個(gè)系統(tǒng)中結(jié)合了多種數(shù)據(jù)模型,通常是文檔和圖形。
圖2:NoSQL類(lèi)別
鍵值數(shù)據(jù)存儲(chǔ)和寬列存儲(chǔ)
鍵值數(shù)據(jù)存儲(chǔ)和寬列存儲(chǔ)有時(shí)被歸為同一類(lèi),因?yàn)樗鼈兌际菬o(wú)模式的,并且共享許多特征。在鍵值數(shù)據(jù)模型中,所有的數(shù)據(jù)都被表示為鍵值對(duì),其中鍵是唯一的標(biāo)識(shí)值。鍵值系統(tǒng)是無(wú)模式的,這產(chǎn)生了巨大的靈活性和可擴(kuò)展性。它們通常提供一個(gè)簡(jiǎn)單的接口,如put(key,value),value=get(key),and delete(key)。寬列存儲(chǔ)可以將行存儲(chǔ)為屬性-值對(duì)的列表。第一個(gè)屬性被稱(chēng)為主鍵或主鍵,例如,社會(huì)安全號(hào)碼,它在一個(gè)行的集合中唯一地識(shí)別一個(gè)行,例如,人。鍵通常是排序的,這使得范圍查詢(xún)和鍵的有序處理成為可能。這是寬列存儲(chǔ)的一種能力,鍵值存儲(chǔ)通常不支持。
鍵值數(shù)據(jù)存儲(chǔ)有一個(gè)分布式的架構(gòu),在一個(gè)無(wú)共享的集群中可以線(xiàn)性擴(kuò)展。一個(gè)鍵值集合的行通常是水平分區(qū)的,使用散列或鍵值范圍,并存儲(chǔ)在一些集群節(jié)點(diǎn)上。鍵值數(shù)據(jù)存儲(chǔ)也善于使用SSTables有效地?cái)z取數(shù)據(jù)(他們聲稱(chēng)使用LSM樹(shù),但實(shí)際上使用SSTables,見(jiàn)我們的 blog post on B+ Trees, LSM trees and SSTables),這是一種數(shù)據(jù)結(jié)構(gòu)和攝取算法,通過(guò)使用單個(gè)I/O來(lái)插入許多行,在攝取數(shù)據(jù)方面非常高效。鍵值數(shù)據(jù)存儲(chǔ)解決了僵化的模式問(wèn)題,僅僅是通過(guò)無(wú)模式,每一行都可以有不同的結(jié)構(gòu),即任意的列集。
圖3:B+樹(shù)和SST表的比較
鍵值數(shù)據(jù)存儲(chǔ)的這些新特性影響了性能。首先,SST表格在查詢(xún)數(shù)據(jù)方面的效率很低,所以在鍵值數(shù)據(jù)存儲(chǔ)中讀取數(shù)據(jù)的成本要比使用B+樹(shù)的SQL數(shù)據(jù)庫(kù)高很多。其次,模式的靈活性意味著數(shù)據(jù)表示在空間方面變得更加昂貴,因?yàn)榱忻仨毐痪幋a并存儲(chǔ)在行內(nèi)。更重要的是,一般用于打包相同大小的列的技術(shù)不能被應(yīng)用,所以數(shù)據(jù)表示的效率更低。由于其固定的模式,SQL數(shù)據(jù)庫(kù)可以在行中組織列,在空間和訪(fǎng)問(wèn)時(shí)間方面非常有效。
圖4:關(guān)系型和無(wú)模式型方法的比較
最后,鍵值存儲(chǔ)以強(qiáng)大的數(shù)據(jù)一致性換取可擴(kuò)展性和可用性,依賴(lài)于不同的控制一致性的方式,如副本的最終一致性,有條件的寫(xiě)入,以及最終一致性和強(qiáng)一致性的讀取。
圖5:鍵值數(shù)據(jù)存儲(chǔ)的屬性
寬列存儲(chǔ)結(jié)合了SQL數(shù)據(jù)庫(kù)的一些有益特性(例如,以表的形式表示數(shù)據(jù))和鍵值存儲(chǔ)的靈活性(例如,列內(nèi)無(wú)模式數(shù)據(jù))和可擴(kuò)展性。寬列表中的每一行都由一個(gè)鍵唯一標(biāo)識(shí),并有一些命名的列。然而,與關(guān)系表不同的是,列只能包含原子值(即二進(jìn)制字符串),一個(gè)列可以很寬,包含多個(gè)鍵值對(duì)。寬列存儲(chǔ)用更多的聲明性結(jié)構(gòu)擴(kuò)展了鍵值存儲(chǔ)接口,允許對(duì)列族進(jìn)行掃描、精確匹配和范圍查詢(xún)。它們通常為這些結(jié)構(gòu)提供一個(gè)API,以便在編程語(yǔ)言中使用。
圖6:鍵值和寬列存儲(chǔ)的比較