資料庫發展史(中)

Gauss松鼠會發表於2021-04-12
在《資料庫發展史(上) 中,為大家介紹了網狀資料庫和層次資料庫、關聯式資料庫、分散式資料庫、雲資料庫的發展史。本篇文章為大家介紹NoSQL資料庫和NewSQL資料庫的發展歷程。


NoSQL資料庫

儘管關聯式資料庫系統技術已經相對成熟,能很好地處理表格型別的資料,但對業界出現的越來越多複雜型別的資料(如文字、影像、影片等)無能為力。尤其是步入網際網路Web 2.0和移動網際網路時代,許多網際網路應用有著高併發讀寫、海量資料處理、資料結構不統一等特點,傳統的關聯式資料庫並不能很好地支援這些場景。另一方面,非關聯式資料庫有著高併發讀寫、資料高可用性、海量資料儲存和實時分析等特點,能較好地支援這些應用的需求。因此,一些非關聯式資料庫也開始興起。

為了解決大規模資料集合和多種資料種類帶來的挑戰,NoSQL資料庫應運而生。NoSQL一詞最早出現於1998年,是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的資料庫。NoSQL最常見的解釋是“非關係型(Non-Relational)”,但是“不僅僅是SQL(Not Only SQL)”的解釋也被很多人接受。NoSQL僅僅是一個概念,泛指非關係型的資料庫,區別於關聯式資料庫。它們不保證關係資料的四個特性:原子性、一致性、隔離性、永續性(Atomicity、Consistency、Isolation、Durability,可簡稱ACID)。

NoSQL是全新的資料庫革命性運動的體現,其擁護者提倡運用非關係型的資料儲存,相對於鋪天蓋地的關聯式資料庫運用,這一概念無疑是一種全新的思維注入。因為NoSQL資料庫去掉了關係資料模型的特性,因此資料之間沒有關係,容易進行擴充套件。例如,臉書(Facebook)或者推特(Twitter)每天都為使用者收集萬億位元的資料,這些資料的存取不需要固定的模式,使用NoSQL無須多餘的操作就能實現橫向擴充套件,無形之中也在資料庫架構的層面上帶來了可擴充套件的能力。此外,得益於NoSQL資料庫資料模型的無關係性,資料庫的結構變得比較簡單,因此容易支援海量資料的儲存和高併發讀寫,效能比較優秀。

Johan Oskarsson在2009 年發起了一場關於分散式開源資料庫的討論,EricEvans再次提出了NoSQL的概念,這時的NoSQL主要指非關係型、分散式和不提供ACID特性的資料庫設計模式。2009年在亞特蘭大舉行的“no:sql(east)”討論會是一個里程碑,其口號是“select fun,profit from real_world where relational=false;”。因此,對NoSQL最普遍的解釋是“非關係型的”,強調鍵值儲存和文件資料庫的優點,而不是單純的反對關聯式資料庫。

雖然NoSQL資料庫具有靈活的資料模型、高擴充套件性和高可用性等特點,但是,NoSQL不支援SQL查詢,不支援資料的強一致事務處理,只能保證資料的弱一致性。NoSQL資料庫主要包括4種型別: 文件資料庫(Document-Oriented Database)、列簇式資料庫(Column-family Database)、鍵值資料庫(Key-Value Database)和圖資料庫(Graph Database)。接下來將分別介紹這四種資料庫。

1. 文件資料庫

從1989年起,美國Lotus公司(已被IBM 兼併)透過其群組工作軟體產品Notes提出了資料庫技術的全新概念———文件資料庫(Document-Oriented Database),與傳統資料庫相比,文件資料庫是用來管理文件的。在傳統資料庫中,資訊被分割成離散的資料段,而在文件資料庫中,文件是處理資訊的基本單位。通俗地說,文件資料庫假設儲存的資料均按某種標準或編碼來封裝資料,這些封裝好的資料可以是XML、YAML、JSON 或者BSON 等,也可以是PDF和微軟Office文件等二進位制文件格式。例如,XML資料庫是針對XML文件做了最佳化的面向文件的資料庫的子類。一些搜尋引擎(也稱為資訊檢索)系統如Elasticsearch提供了足夠的對文件的核心操作,從而滿足面向文件資料庫的定義。

常見的文件資料庫有MongoDB、Apache CouchDB、亞馬遜AWS的Document DB等。以MongoDB資料庫為例,它是一個由C++ 語言編寫的基於分散式檔案儲存的文件資料庫。MongoDB的每個資料庫(Database)下包含多個集合(Collection),每個集合下又可以有多個文件(Document),每個文件中的每條記錄(Record)就是一條資料。這與關聯式資料庫的記錄(Record)和資料表(Table)的概念相似,但是同一個集合下的文件可以儲存格式不同的資料,儲存操作更加靈活。其他的文件資料庫產品與之類似,在此不一一贅述。

2. 列簇式資料庫

傳統資料庫有列數的限制,而寬表(BigTable、Hbase)透過列簇的概念來降低這一限制。但是寬錶帶來了儲存的開銷,而列簇資料庫透過融合行鍵值和列來形成統一關鍵字,並且可以把值分成多個列簇,讓每個列簇代表一張資料對映表。典型的列簇式資料庫包括Hbase、BigTable、Cloudera和Cassandra等。以Hbase為例,它是一個開源的非關係型分散式資料庫(NoSQL),參考了谷歌的BigTable建模,實現的程式語言為Java。Hbase是Apache軟體基金會的Hadoop專案的一部分,執行於HDFS檔案系統之上,為Hadoop提供類似於BigTable規模的服務。

但列簇資料庫不同於列資料庫。資料庫儲存方式分為兩種: 行儲存和列儲存。行儲存即按照行進行組織儲存,適合於交易型業務,例如整行資料的增加和刪除; 而列儲存是按照列進行儲存,適合於分析型業務,例如單列資料的聚集分析。下圖是兩種儲存方法的圖形對比。

資料庫發展史(中)

列儲存和行儲存對比圖

3. 鍵值資料庫

鍵值資料庫使用簡單的鍵值方法來儲存資料,是一種最簡單的NoSQL資料庫,具有較高的容錯性和可擴充套件性。該類資料庫將資料儲存為鍵值對集合,其中鍵作為唯一識別符號,鍵和值都可以是從簡單物件到複雜物件的任何內容。在不涉及過多資料關係業務的需求中,使用鍵值儲存可以非常有效地減少讀寫磁碟的次數,比關係型儲存擁有更好的讀寫效能,能夠解決關聯式資料庫無法儲存的資料結構問題。但是該類資料庫的事務不能完全地支援ACID特性。

常見的鍵值資料庫包括面向記憶體的鍵值資料庫Redis和Memcached,面向磁碟的鍵值資料庫RocksDB和LevelDB等。

•Redis是一個使用ANSI C語言編寫的開源、基於記憶體、支援網路、可選永續性的鍵值對儲存資料庫。Redis是目前最流行的鍵值對儲存資料庫之一,經常被用於存取快取資料。

•Memcached是一個開放原始碼、高效能、分散式的記憶體物件快取系統,用於加速動態Web應用程式,減輕關聯式資料庫的負載。它可以應對任意多個連線,使用非阻塞的網路IO。它的工作機制是在記憶體中開闢一塊空間,然後建立一個Hash表,Memcached自管理這些Hash表。Memcached設計簡單而強大,簡單的設計促進其迅速部署,易於發現所面臨的問題,解決了很多大型資料快取的問題。

•LevelDB是一個由谷歌研發的鍵值對嵌入式資料庫管理系統程式設計庫,以開源的BSD許可證釋出。

4. 圖資料庫

圖資料庫的歷史可以追溯到20世紀60年代的Navigational Databases,這時IBM也開發了類似樹結構的資料儲存模型。經過30多年的漫長髮展,期間出現過可標記的圖形資料庫Logic Data Model。直至21世紀初,具有ACID特性的里程碑式圖資料庫產品,如Neo4j、Oracle Spatial and Graph,才被開發出來並進行商業化。到2010年後,可支援水平擴充套件的分散式圖資料庫開始興起,例如OrientDB、ArangoDB、MarkLogic。

至今,各式各樣的圖資料庫越來越受到重視,在谷歌、領英、臉書等一些大公司中,已經有了廣泛應用。圖資料庫的成功可以歸結為很多因素,但歸根結底是因為它們透過大量複雜的資訊來支撐各類新型應用,例如知識圖譜、社交網路分析。

NewSQL資料庫

NoSQL資料庫系統不具備高度結構化查詢等特性,也不能提供ACID 的操作。此外,由於不同的NoSQL資料庫都有各自的查詢語言,這使它很難規範應用程式介面。為了解決NoSQL存在的這些問題,NewSQL資料庫逐漸被提出來,這個概念是對各種新的可擴充套件/高效能資料庫的簡稱,這類資料庫不僅具有NoSQL對海量資料的儲存管理能力,還保持了傳統關聯式資料庫的ACID和SQL等特性。

2011年,451研究所的Matthew Aslett在其論文中首次提出了NewSQL概念。從2011年後,一些商業公司和研究專案人員開始使用NewSQL來描述他們的系統。2012年穀歌在OSDI(USENIX Symposium on Operating Systems Design and Implementation)上發表了Spanner系統的論文,2013年在SIGMOD(Special Interest Group on Management ofData)發表了F1系統的論文,這兩篇論文讓業界第一次看到了關係模型和NoSQL的擴充套件性在超龐大叢集規模上融合的可能性。Spanner/F1 論文引起了廣泛關注,Cockroach Labs開發了CockroachDB分散式資料庫,部署簡單,具有很好的易用性;PingCAP開發了TiDB,結合了關聯式資料庫和NoSQL資料庫的特性,具備強一致性和高可用性。

NewSQL資料庫正在持續發展,在NewSQL概念下提出的多種資料庫設計為開發人員提供了針對不同用例的多種選項,極大地推動了創新和專業資料庫設計的發展。但是,沒有任何NewSQL系統像傳統的SQL系統那樣具有通用性,目前大多數NewSQL資料庫都是專有軟體或僅適用於特定場景,這極大地限制了新技術的普及和採用,而且NewSQL對傳統SQL系統的豐富工具僅僅提供部分訪問,因此亟待開發具有通用能力的NewSQL系統。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997967/viewspace-2767587/,如需轉載,請註明出處,否則將追究法律責任。

相關文章