數(shù)據(jù)庫(kù)發(fā)展史(中)
在《數(shù)據(jù)庫(kù)發(fā)展史(上)》中,為大家介紹了網(wǎng)狀數(shù)據(jù)庫(kù)和層次數(shù)據(jù)庫(kù)、關(guān)系數(shù)據(jù)庫(kù)、分布式數(shù)據(jù)庫(kù)、云數(shù)據(jù)庫(kù)的發(fā)展史。本篇文章為大家介紹NoSQL數(shù)據(jù)庫(kù)和NewSQL數(shù)據(jù)庫(kù)的發(fā)展歷程。
NoSQL數(shù)據(jù)庫(kù)
盡管關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)技術(shù)已經(jīng)相對(duì)成熟,能很好地處理表格類(lèi)型的數(shù)據(jù),但對(duì)業(yè)界出現(xiàn)的越來(lái)越多復(fù)雜類(lèi)型的數(shù)據(jù)(如文本、圖像、視頻等)無(wú)能為力。尤其是步入互聯(lián)網(wǎng)Web 2.0和移動(dòng)互聯(lián)網(wǎng)時(shí)代,許多互聯(lián)網(wǎng)應(yīng)用有著高并發(fā)讀寫(xiě)、海量數(shù)據(jù)處理、數(shù)據(jù)結(jié)構(gòu)不統(tǒng)一等特點(diǎn),傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)并不能很好地支持這些場(chǎng)景。另一方面,非關(guān)系數(shù)據(jù)庫(kù)有著高并發(fā)讀寫(xiě)、數(shù)據(jù)高可用性、海量數(shù)據(jù)存儲(chǔ)和實(shí)時(shí)分析等特點(diǎn),能較好地支持這些應(yīng)用的需求。因此,一些非關(guān)系數(shù)據(jù)庫(kù)也開(kāi)始興起。
為了解決大規(guī)模數(shù)據(jù)集合和多種數(shù)據(jù)種類(lèi)帶來(lái)的挑戰(zhàn),NoSQL數(shù)據(jù)庫(kù)應(yīng)運(yùn)而生。NoSQL一詞最早出現(xiàn)于1998年,是Carlo Strozzi開(kāi)發(fā)的一個(gè)輕量、開(kāi)源、不提供SQL功能的數(shù)據(jù)庫(kù)。NoSQL最常見(jiàn)的解釋是“非關(guān)系型(Non-Relational)”,但是“不僅僅是SQL(Not Only SQL)”的解釋也被很多人接受。NoSQL僅僅是一個(gè)概念,泛指非關(guān)系型的數(shù)據(jù)庫(kù),區(qū)別于關(guān)系數(shù)據(jù)庫(kù)。它們不保證關(guān)系數(shù)據(jù)的四個(gè)特性:原子性、一致性、隔離性、持久性(Atomicity、Consistency、Isolation、Durability,可簡(jiǎn)稱(chēng)ACID)。
NoSQL是全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng)的體現(xiàn),其擁護(hù)者提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),相對(duì)于鋪天蓋地的關(guān)系數(shù)據(jù)庫(kù)運(yùn)用,這一概念無(wú)疑是一種全新的思維注入。因?yàn)镹oSQL數(shù)據(jù)庫(kù)去掉了關(guān)系數(shù)據(jù)模型的特性,因此數(shù)據(jù)之間沒(méi)有關(guān)系,容易進(jìn)行擴(kuò)展。例如,臉書(shū)(Facebook)或者推特(Twitter)每天都為用戶(hù)收集萬(wàn)億比特的數(shù)據(jù),這些數(shù)據(jù)的存取不需要固定的模式,使用NoSQL無(wú)須多余的操作就能實(shí)現(xiàn)橫向擴(kuò)展,無(wú)形之中也在數(shù)據(jù)庫(kù)架構(gòu)的層面上帶來(lái)了可擴(kuò)展的能力。此外,得益于NoSQL數(shù)據(jù)庫(kù)數(shù)據(jù)模型的無(wú)關(guān)系性,數(shù)據(jù)庫(kù)的結(jié)構(gòu)變得比較簡(jiǎn)單,因此容易支持海量數(shù)據(jù)的存儲(chǔ)和高并發(fā)讀寫(xiě),性能比較優(yōu)秀。
Johan Oskarsson在2009 年發(fā)起了一場(chǎng)關(guān)于分布式開(kāi)源數(shù)據(jù)庫(kù)的討論,EricEvans再次提出了NoSQL的概念,這時(shí)的NoSQL主要指非關(guān)系型、分布式和不提供ACID特性的數(shù)據(jù)庫(kù)設(shè)計(jì)模式。2009年在亞特蘭大舉行的“no:sql(east)”討論會(huì)是一個(gè)里程碑,其口號(hào)是“select fun,profit from real_world where relational=false;”。因此,對(duì)NoSQL最普遍的解釋是“非關(guān)系型的”,強(qiáng)調(diào)鍵值存儲(chǔ)和文檔數(shù)據(jù)庫(kù)的優(yōu)點(diǎn),而不是單純的反對(duì)關(guān)系數(shù)據(jù)庫(kù)。
雖然NoSQL數(shù)據(jù)庫(kù)具有靈活的數(shù)據(jù)模型、高擴(kuò)展性和高可用性等特點(diǎn),但是,NoSQL不支持SQL查詢(xún),不支持?jǐn)?shù)據(jù)的強(qiáng)一致事務(wù)處理,只能保證數(shù)據(jù)的弱一致性。NoSQL數(shù)據(jù)庫(kù)主要包括4種類(lèi)型: 文檔數(shù)據(jù)庫(kù)(Document-Oriented Database)、列簇式數(shù)據(jù)庫(kù)(Column-family Database)、鍵值數(shù)據(jù)庫(kù)(Key-Value Database)和圖數(shù)據(jù)庫(kù)(Graph Database)。接下來(lái)將分別介紹這四種數(shù)據(jù)庫(kù)。
1.?文檔數(shù)據(jù)庫(kù)
從1989年起,美國(guó)Lotus公司(已被IBM 兼并)通過(guò)其群組工作軟件產(chǎn)品Notes提出了數(shù)據(jù)庫(kù)技術(shù)的全新概念———文檔數(shù)據(jù)庫(kù)(Document-Oriented Database),與傳統(tǒng)數(shù)據(jù)庫(kù)相比,文檔數(shù)據(jù)庫(kù)是用來(lái)管理文檔的。在傳統(tǒng)數(shù)據(jù)庫(kù)中,信息被分割成離散的數(shù)據(jù)段,而在文檔數(shù)據(jù)庫(kù)中,文檔是處理信息的基本單位。通俗地說(shuō),文檔數(shù)據(jù)庫(kù)假設(shè)存儲(chǔ)的數(shù)據(jù)均按某種標(biāo)準(zhǔn)或編碼來(lái)封裝數(shù)據(jù),這些封裝好的數(shù)據(jù)可以是XML、YAML、JSON 或者BSON 等,也可以是PDF和微軟Office文檔等二進(jìn)制文檔格式。例如,XML數(shù)據(jù)庫(kù)是針對(duì)XML文檔做了優(yōu)化的面向文檔的數(shù)據(jù)庫(kù)的子類(lèi)。一些搜索引擎(也稱(chēng)為信息檢索)系統(tǒng)如Elasticsearch提供了足夠的對(duì)文檔的核心操作,從而滿(mǎn)足面向文檔數(shù)據(jù)庫(kù)的定義。
常見(jiàn)的文檔數(shù)據(jù)庫(kù)有MongoDB、Apache CouchDB、亞馬遜AWS的Document DB等。以MongoDB數(shù)據(jù)庫(kù)為例,它是一個(gè)由C++ 語(yǔ)言編寫(xiě)的基于分布式文件存儲(chǔ)的文檔數(shù)據(jù)庫(kù)。MongoDB的每個(gè)數(shù)據(jù)庫(kù)(Database)下包含多個(gè)集合(Collection),每個(gè)集合下又可以有多個(gè)文檔(Document),每個(gè)文檔中的每條記錄(Record)就是一條數(shù)據(jù)。這與關(guān)系數(shù)據(jù)庫(kù)的記錄(Record)和數(shù)據(jù)表(Table)的概念相似,但是同一個(gè)集合下的文檔可以存儲(chǔ)格式不同的數(shù)據(jù),存儲(chǔ)操作更加靈活。其他的文檔數(shù)據(jù)庫(kù)產(chǎn)品與之類(lèi)似,在此不一一贅述。
2.?列簇式數(shù)據(jù)庫(kù)
傳統(tǒng)數(shù)據(jù)庫(kù)有列數(shù)的限制,而寬表(BigTable、Hbase)通過(guò)列簇的概念來(lái)降低這一限制。但是寬表帶來(lái)了存儲(chǔ)的開(kāi)銷(xiāo),而列簇?cái)?shù)據(jù)庫(kù)通過(guò)融合行鍵值和列來(lái)形成統(tǒng)一關(guān)鍵字,并且可以把值分成多個(gè)列簇,讓每個(gè)列簇代表一張數(shù)據(jù)映射表。典型的列簇式數(shù)據(jù)庫(kù)包括Hbase、BigTable、Cloudera和Cassandra等。以Hbase為例,它是一個(gè)開(kāi)源的非關(guān)系型分布式數(shù)據(jù)庫(kù)(NoSQL),參考了谷歌的BigTable建模,實(shí)現(xiàn)的編程語(yǔ)言為Java。Hbase是Apache軟件基金會(huì)的Hadoop項(xiàng)目的一部分,運(yùn)行于HDFS文件系統(tǒng)之上,為Hadoop提供類(lèi)似于BigTable規(guī)模的服務(wù)。
但列簇?cái)?shù)據(jù)庫(kù)不同于列數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)存儲(chǔ)方式分為兩種: 行存儲(chǔ)和列存儲(chǔ)。行存儲(chǔ)即按照行進(jìn)行組織存儲(chǔ),適合于交易型業(yè)務(wù),例如整行數(shù)據(jù)的增加和刪除; 而列存儲(chǔ)是按照列進(jìn)行存儲(chǔ),適合于分析型業(yè)務(wù),例如單列數(shù)據(jù)的聚集分析。下圖是兩種存儲(chǔ)方法的圖形對(duì)比。

3.?鍵值數(shù)據(jù)庫(kù)
鍵值數(shù)據(jù)庫(kù)使用簡(jiǎn)單的鍵值方法來(lái)存儲(chǔ)數(shù)據(jù),是一種最簡(jiǎn)單的NoSQL數(shù)據(jù)庫(kù),具有較高的容錯(cuò)性和可擴(kuò)展性。該類(lèi)數(shù)據(jù)庫(kù)將數(shù)據(jù)存儲(chǔ)為鍵值對(duì)集合,其中鍵作為唯一標(biāo)識(shí)符,鍵和值都可以是從簡(jiǎn)單對(duì)象到復(fù)雜對(duì)象的任何內(nèi)容。在不涉及過(guò)多數(shù)據(jù)關(guān)系業(yè)務(wù)的需求中,使用鍵值存儲(chǔ)可以非常有效地減少讀寫(xiě)磁盤(pán)的次數(shù),比關(guān)系型存儲(chǔ)擁有更好的讀寫(xiě)性能,能夠解決關(guān)系數(shù)據(jù)庫(kù)無(wú)法存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)問(wèn)題。但是該類(lèi)數(shù)據(jù)庫(kù)的事務(wù)不能完全地支持ACID特性。
常見(jiàn)的鍵值數(shù)據(jù)庫(kù)包括面向內(nèi)存的鍵值數(shù)據(jù)庫(kù)Redis和Memcached,面向磁盤(pán)的鍵值數(shù)據(jù)庫(kù)RocksDB和LevelDB等。
Redis是一個(gè)使用ANSI C語(yǔ)言編寫(xiě)的開(kāi)源、基于內(nèi)存、支持網(wǎng)絡(luò)、可選持久性的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù)。Redis是目前最流行的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù)之一,經(jīng)常被用于存取緩存數(shù)據(jù)。
Memcached是一個(gè)開(kāi)放源代碼、高性能、分布式的內(nèi)存對(duì)象緩存系統(tǒng),用于加速動(dòng)態(tài)Web應(yīng)用程序,減輕關(guān)系數(shù)據(jù)庫(kù)的負(fù)載。它可以應(yīng)對(duì)任意多個(gè)連接,使用非阻塞的網(wǎng)絡(luò)IO。它的工作機(jī)制是在內(nèi)存中開(kāi)辟一塊空間,然后建立一個(gè)Hash表,Memcached自管理這些Hash表。Memcached設(shè)計(jì)簡(jiǎn)單而強(qiáng)大,簡(jiǎn)單的設(shè)計(jì)促進(jìn)其迅速部署,易于發(fā)現(xiàn)所面臨的問(wèn)題,解決了很多大型數(shù)據(jù)緩存的問(wèn)題。
LevelDB是一個(gè)由谷歌研發(fā)的鍵值對(duì)嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng)編程庫(kù),以開(kāi)源的BSD許可證發(fā)布。
4.?圖數(shù)據(jù)庫(kù)
圖數(shù)據(jù)庫(kù)的歷史可以追溯到20世紀(jì)60年代的Navigational Databases,這時(shí)IBM也開(kāi)發(fā)了類(lèi)似樹(shù)結(jié)構(gòu)的數(shù)據(jù)存儲(chǔ)模型。經(jīng)過(guò)30多年的漫長(zhǎng)發(fā)展,期間出現(xiàn)過(guò)可標(biāo)記的圖形數(shù)據(jù)庫(kù)Logic Data Model。直至21世紀(jì)初,具有ACID特性的里程碑式圖數(shù)據(jù)庫(kù)產(chǎn)品,如Neo4j、Oracle Spatial and Graph,才被開(kāi)發(fā)出來(lái)并進(jìn)行商業(yè)化。到2010年后,可支持水平擴(kuò)展的分布式圖數(shù)據(jù)庫(kù)開(kāi)始興起,例如OrientDB、ArangoDB、MarkLogic。
至今,各式各樣的圖數(shù)據(jù)庫(kù)越來(lái)越受到重視,在谷歌、領(lǐng)英、臉書(shū)等一些大公司中,已經(jīng)有了廣泛應(yīng)用。圖數(shù)據(jù)庫(kù)的成功可以歸結(jié)為很多因素,但歸根結(jié)底是因?yàn)樗鼈兺ㄟ^(guò)大量復(fù)雜的信息來(lái)支撐各類(lèi)新型應(yīng)用,例如知識(shí)圖譜、社交網(wǎng)絡(luò)分析。
NewSQL數(shù)據(jù)庫(kù)
NoSQL數(shù)據(jù)庫(kù)系統(tǒng)不具備高度結(jié)構(gòu)化查詢(xún)等特性,也不能提供ACID 的操作。此外,由于不同的NoSQL數(shù)據(jù)庫(kù)都有各自的查詢(xún)語(yǔ)言,這使它很難規(guī)范應(yīng)用程序接口。為了解決NoSQL存在的這些問(wèn)題,NewSQL數(shù)據(jù)庫(kù)逐漸被提出來(lái),這個(gè)概念是對(duì)各種新的可擴(kuò)展/高性能數(shù)據(jù)庫(kù)的簡(jiǎn)稱(chēng),這類(lèi)數(shù)據(jù)庫(kù)不僅具有NoSQL對(duì)海量數(shù)據(jù)的存儲(chǔ)管理能力,還保持了傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的ACID和SQL等特性。
2011年,451研究所的Matthew Aslett在其論文中首次提出了NewSQL概念。從2011年后,一些商業(yè)公司和研究項(xiàng)目人員開(kāi)始使用NewSQL來(lái)描述他們的系統(tǒng)。2012年谷歌在OSDI(USENIX Symposium on Operating Systems Design and Implementation)上發(fā)表了Spanner系統(tǒng)的論文,2013年在SIGMOD(Special Interest Group on Management ofData)發(fā)表了F1系統(tǒng)的論文,這兩篇論文讓業(yè)界第一次看到了關(guān)系模型和NoSQL的擴(kuò)展性在超龐大集群規(guī)模上融合的可能性。Spanner/F1 論文引起了廣泛關(guān)注,Cockroach Labs開(kāi)發(fā)了CockroachDB分布式數(shù)據(jù)庫(kù),部署簡(jiǎn)單,具有很好的易用性;PingCAP開(kāi)發(fā)了TiDB,結(jié)合了關(guān)系數(shù)據(jù)庫(kù)和NoSQL數(shù)據(jù)庫(kù)的特性,具備強(qiáng)一致性和高可用性。
NewSQL數(shù)據(jù)庫(kù)正在持續(xù)發(fā)展,在NewSQL概念下提出的多種數(shù)據(jù)庫(kù)設(shè)計(jì)為開(kāi)發(fā)人員提供了針對(duì)不同用例的多種選項(xiàng),極大地推動(dòng)了創(chuàng)新和專(zhuān)業(yè)數(shù)據(jù)庫(kù)設(shè)計(jì)的發(fā)展。但是,沒(méi)有任何NewSQL系統(tǒng)像傳統(tǒng)的SQL系統(tǒng)那樣具有通用性,目前大多數(shù)NewSQL數(shù)據(jù)庫(kù)都是專(zhuān)有軟件或僅適用于特定場(chǎng)景,這極大地限制了新技術(shù)的普及和采用,而且NewSQL對(duì)傳統(tǒng)SQL系統(tǒng)的豐富工具僅僅提供部分訪問(wèn),因此亟待開(kāi)發(fā)具有通用能力的NewSQL系統(tǒng)。