圖片來源: 

iThome

早在NoSQL資料庫這個名詞流行之前,就已經出現了很多種非關聯式資料庫,這些資料庫各有不同的特徵,很難像關聯式資料庫那樣,用一套共同的觀念就可以全部了解。只能逐一了解每個NoSQL資料庫的特性和用途。

目前有4種比較受到關注的NoSQL資料庫,分別是Key-Value資料庫,記憶體資料庫(In-memory Database)、圖學資料庫(Graph Database)以及文件資料庫(Document Database)。

類型1:Key-Value類型的資料庫最多

Key-Value資料庫是NoSQL資料庫中最大宗的類型,這類資料最大的特色就是採用Key-Value資料架構,取消了原本關聯式資料庫中常用的欄位架構(Schema),每筆資料各自獨立,所以,可以打造出分散式和高擴充能力的特性。

包括像Google的BigTable、Hadoop的HBase、Amazon的Dynamo、Cassandra、Hypertable等都是這類Key-Value資料庫。

Google自行研發的BigTable建置在Google檔案系統GFS上,專供Google自家應用程式使用,例如Gmail、Google Reader、Google地圖、YouTube等應用的資料都是儲存在BigTable中。現在Google也透過Google App Engine服務開放其他人使用BigTable來儲存資料。

BigTable就像是一張整合大量機器的資料表,所有資料都存在同一張資料表中,單個資料表可以儲存PB等級的內容。Google App Engine提供了一種GQL查詢語言,讓開發者使用Select語法來查詢BigTable中的資料,不過,這種GQL語言不能像SQL語言那樣可以使用Join語法來進行跨資料表查詢。

因為Google沒有釋出BigTable和相關的雲端運算平臺,後來就出現了另外一套參考Google雲端運算架構的Hadoop平臺,並且發展出HBase分散式資料庫。HBase是Hadoop平臺使用的資料庫,用來儲存Hadoop進行MapReduce平行運算的資料。類似Google的BigTable,也是在一張大資料表中儲存很多行資料,每一行的結構同樣有一個主要Key值和任意數量的列欄位。

Amazon開發的Dynamo分散式資料庫則是用在Amazon的網路服務,例如S3儲存服務,也是採取Key-Value的儲存方式來建立分散式的高可用性環境。Amazon的購物車就是使用Dynamo資料庫,Dynamo會將一份資料複製到很多伺服器上建立副本,彼此定期同步。不過,由於Dynamo無法確保每一個副本的資料即時同步,為了解決資料衝突和遺失的問題,Amazon另外開發了衝突解決技術來確保資料的一致性。

在Key-Value資料庫類型中,還有一個最近很熱門的NoSQL資料庫,也就是力可科技使用的Cassandra。這是Facebook在2008年釋出的分散式資料庫,支援Java平臺。Facebook用Cassandra來儲存高達120TB的站內信箱(inbox)資料,2009年3月由Apache基金會接手維護,現在是Apache重點發展的頂級計畫之一。

和HBase這種主從式架構的分散式資料庫不同,Cassandra每一個在資料庫叢集中的節點都是相同的,沒有主從關係,所以,建置分散式資料庫時,Cassandra最少只要建立2個伺服器節點就能執行,這兩個節點的功能和角色幾乎一模一樣,只需要在設定檔中指定好彼此溝通的IP網址即可。啟動資料庫以後,這兩個節點會自行複製資料、分散儲存、平衡資料庫存取的負載。

類型2:記憶體資料庫是知名網站慣用快取工具

記憶體資料庫(In-memory Database)就是將資料儲存在記憶體的NoSQL資料庫,包括了Memcached、Redis、Velocity、Tuple space等。其實像Memcached、Redis都是一種Key-Value資料架構的資料庫,只是這類資料庫改將資料儲存在記憶體中來提高讀取效率,大多用來快取常用網頁,加快傳遞網頁的速度,減少讀取硬碟的次數,不過系統關機後就無法保存。

2003年就出現的Memcached更是許多知名網站改善網站瀏覽效率的重要工具,例如YouTube、Facebook、Zynga、Twitter等都有使用Memcached。Google應用代管服務App Engine也提供了Memcached的服務。

在Facebook上最熱門的Farm Ville農場遊戲就是利用Memcached來改善遊戲流暢性。Farm Ville每天登入的使用者人數高達1千萬人,為了讓使用者操作過程不需要等待資料讀寫的延遲,Farm Ville採取2層式的架構,使用Memcached來傳遞站上使用者的資料,稍後再整批將資料寫入後端MySQL資料庫,儲存在硬碟上。不過,這個架構的風險就是,系統當機時,會遺失一整批儲存在記憶體中的資料。

除了老牌的Memcached以外,2009年出現了一個新的開源記憶體資料庫Redis。除了提供分散式的快取以外,Redis和Memcached最大的不同點是,Redis提供了一個資料架構,可以自動排序那些儲存在Redis中的資料,讓開發者取得排序後的資料。

Redis在今年3月時獲得VMware贊助。9月剛釋出了2.0新版,新增加了如虛擬記憶體的設計,讓開發者可以放入記憶體容量更多的資料量。美國分類廣告網站Craigslist和程式碼代管網站Github都是使用Redis來加快存取速度。

類型3:文件資料庫適合儲存非結構化資料

文件資料庫主要是用來儲存非結構性的文件,例如最常見的非結構化資料就是HTML網頁。一個HTML網頁結構不像一般表格那樣有固定的欄位,每個欄位有特定資料類型和大小。例如網頁裡有Head和Body結構,Body元素中可能會有10個段落,段落中會有文字、連結、圖片等。文件資料庫的資料結構往往是鬆散的樹狀結構。

很多文件資料庫都是商用資料庫系統,文件資料庫的概念源自IBM的Lotus Notes儲存文件的方式,XML資料庫也是一種文件資料庫。常見的開源文件資料庫像是CouchDB、MongoDB以及Riak等。

隨著網頁儲存和搜尋索引的需求大增,CouchDB和MongoDB這2款文件資料庫越來越受到關注。2005年就出現的CouchDB剛釋出了1.0版,它也是Apache基金會維護的頂級計畫之一。CouchDB提供了一套RESTful的API,讓應用程式透過HTTP協定就能存取資料庫,也可以用JavaScript作為查詢語言。

2009年才出現的MongoDB很快就已經釋出穩定的1.6.1版,可以用來儲存UTF-8和非UTF-8的文件資料。不像CouchDB只能儲存UTF-8格式的文件。MongoDB同樣可以在查詢指令中使用JavaScript。採取Master-Slave架構,1臺Master伺服器搭配多臺資料伺服器,資料伺服器間互相備援、容錯。

類型4:圖學資料庫可用於記錄社交關係

最後一類是圖學資料庫,這不是專門用來處理圖片的資料庫,而是指運用圖學架構來儲存節點間關係資料架構,例如用樹狀結構來組織從屬關係或網狀結構來儲存朋友關係,地理圖資系統通常也會用圖學資料庫來儲存地圖上每一點和鄰近點的關係,或用圖學資料庫來計算點與點之間最短的距離,也可以用同樣的概念來計算出人與人之間最短的交友距離。圖學資料庫最大的特性是對複雜性的擴充力,關係越複雜的資料越適合使用圖學資料庫。

這類資料的資料結構沒有標準的作法,基本的圖學資料包括了節點(Node)、關係(Relation)和屬性(Property)三種結構。例如用節點來記錄Facebook上的帳號、用關係來記錄朋友關係、用屬性來描述這個帳號的個人資料等。最後可以用網絡圖來呈現出Facebook用戶之間的交友狀況。常見的圖學資料庫如Neo4j、InfoGrid、AllegroGrph等。

這四大類NoSQL資料庫是比較精簡的區分方式,可以用來快速了解不同NoSQL資料庫的特性和差異,另外像維基百科則是從應用角度將NoSQL分成10類,那個分類方法特別將Key-Value資料庫區分出更多不同應用類型的子分類,也可以更進一步了解更多NoSQL資料庫的特性。

 


相關報導請參考「NoSQL:解決資料庫暴量的新方法」


Advertisement

更多 iThome相關內容