最近讀到一些關(guān)于數(shù)據(jù)庫(kù)技術(shù)發(fā)展的文章,基本都是圍繞著SQL與NoSQL的討論來(lái)展開(kāi)的。記得當(dāng)初在NoSQL運(yùn)動(dòng)剛剛起步的時(shí)候,“say no to SQL”的口號(hào)不絕于耳,當(dāng)然口號(hào)并沒(méi)有成為現(xiàn)實(shí),人們最終普遍接受了Not-Only SQL的說(shuō)法。但真的要給NoSQL下一個(gè)定義,還真不是件容易的事,人們習(xí)慣把MongoDB、Redis這樣的產(chǎn)品作為NoSQL普遍定義,可以歸結(jié)為那“四大類”。但對(duì)于我來(lái)說(shuō),上次采訪某大數(shù)據(jù)架構(gòu)師的說(shuō)法則更加中肯,凡是沒(méi)有用到SQL的都算是NoSQL,即便是在傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)里。
也就是說(shuō),你可以把它們看作是一對(duì)好基友,你中有我,我中有你。用軟件工程師Martin Fowler的一篇文章其中提到的詞來(lái)形容就非常貼切:Polyglot Persistence。它翻譯成中文可以叫做混合持久化或者多語(yǔ)言持久化,所以說(shuō)在未來(lái)的數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,將很有可能打破所謂的關(guān)系型和NoSQL之間的界限,用不同的工具達(dá)到不同的目的,將各種數(shù)據(jù)庫(kù)技術(shù)雜糅在一套系統(tǒng)中,各司其職。因此,就像Fowler所說(shuō)的,無(wú)論怎樣定義NoSQL都是無(wú)用功。
關(guān)系型數(shù)據(jù)庫(kù)(SQL)成為主流技術(shù)已經(jīng)超過(guò)20年,這是有它的道理的。它把數(shù)據(jù)存儲(chǔ)在磁盤中,人們可以通過(guò)最標(biāo)準(zhǔn)化的語(yǔ)言SQL來(lái)對(duì)數(shù)據(jù)進(jìn)行各種操作。它的事務(wù)性(transactional)能夠?yàn)橛行У靥峁┯脩舨l(fā)訪問(wèn)控制,并為應(yīng)用程序的數(shù)據(jù)調(diào)用提供一致性。而且由于關(guān)系型數(shù)據(jù)庫(kù)主要存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù),它的數(shù)據(jù)模型和標(biāo)準(zhǔn)化更加適用于報(bào)表(Report)的生成。
但是關(guān)系型數(shù)據(jù)庫(kù)的最大問(wèn)題在于,它的設(shè)計(jì)初衷是要運(yùn)行在單一的服務(wù)器上,因此在進(jìn)行Scale-out的時(shí)候很可能會(huì)遭遇巨大的瓶頸。Scale-up就是你買更大的機(jī)器來(lái)跑數(shù)據(jù)庫(kù),Scale-out就是用多個(gè)普通服務(wù)器組成集群,讓數(shù)據(jù)庫(kù)分布在這個(gè)集群的節(jié)點(diǎn)當(dāng)中。而集群(Cluster)的概念就是用更多的機(jī)器來(lái)做一件事,這其中如果一個(gè)機(jī)器宕掉,其他的機(jī)器還可以繼續(xù)運(yùn)行,因此整個(gè)集群也能夠正常的工作。在這方面,一些大型的互聯(lián)網(wǎng)公司走在了前面,像Google和Amazon都運(yùn)行了非常大型的集群,在逐漸就衍生出了云計(jì)算的概念。他們都意識(shí)到,SQL數(shù)據(jù)庫(kù)在應(yīng)對(duì)集群方面出現(xiàn)了比較大的性能瓶頸,因此紛紛放棄SQL,自己開(kāi)始研發(fā)出像BigTable和Dynamo這樣的存儲(chǔ)平臺(tái),它們應(yīng)該算是最早的NoSQL數(shù)據(jù)庫(kù)。
于是,人們開(kāi)始注意到這個(gè)問(wèn)題,各種各樣的NoSQL產(chǎn)品也涌現(xiàn)出來(lái)。Adewale把這類數(shù)據(jù)庫(kù)的特點(diǎn)歸結(jié)為:不使用關(guān)系數(shù)據(jù)模型,不使用結(jié)構(gòu)化查詢語(yǔ)言;往往針對(duì)大型集群設(shè)計(jì);沒(méi)有固定的模式(Schema),一條記錄中可以存儲(chǔ)任意數(shù)據(jù);往往是開(kāi)源的。它主要解決的一個(gè)問(wèn)題就是大數(shù)據(jù)集存儲(chǔ),使用NoSQL數(shù)據(jù)庫(kù)的大型集群可以存儲(chǔ)PB級(jí)別的數(shù)據(jù),并處理大量的分析數(shù)據(jù)。而多種多樣的數(shù)據(jù)模型,可以用來(lái)應(yīng)對(duì)不同類型的數(shù)據(jù),比如文檔、圖片、視頻等非結(jié)構(gòu)化數(shù)據(jù)。
當(dāng)然這并不是說(shuō)要放棄關(guān)系型數(shù)據(jù)庫(kù),在應(yīng)對(duì)特定類型的數(shù)據(jù)時(shí)它依舊是最高效的。而像ACID和第三方工具支持等方面,NoSQL數(shù)據(jù)庫(kù)還遠(yuǎn)遠(yuǎn)比不上傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)。所以Fowler建議人們考慮所謂的混合持久化原則,即根據(jù)不同應(yīng)用對(duì)數(shù)據(jù)的需求,而使用多種數(shù)據(jù)存儲(chǔ)技術(shù)。舉例來(lái)說(shuō),快速的讀寫(xiě)訪問(wèn),無(wú)需持久性的應(yīng)用可以使用Redis;財(cái)務(wù)和報(bào)表系統(tǒng),可以使用關(guān)系型數(shù)據(jù)庫(kù);集群的大規(guī)模分析數(shù)據(jù),可以使用Cassandra;而讀操作很多,寫(xiě)操作很少的,則可以使用MongoDB。人們可以自行選擇合適的數(shù)據(jù)庫(kù)技術(shù),而無(wú)需一股腦全部使用SQL數(shù)據(jù)庫(kù)。
本文主要說(shuō)了一下SQL和NoSQL數(shù)據(jù)庫(kù)的發(fā)展情況以及各自優(yōu)劣,下一篇文章將更多地討論混合持久化原則,如何用好Polyglot Persistence。