You are on page 1of 11

2011

雲端運算

ccy
TKU CSIE DB Lab
2011/1/9
目錄

雲端運算定義 .......................................................................................................................................................... 2

Why use NoSQL ? ........................................................................................................................................... 2

What is NoSQL? .............................................................................................................................................. 3

1. NoSQL 是 Not Only SQL ...................................................................................................................... 3

2. 增加機器就能自動擴充資料庫容量 ................................................................................................ 3

3. 打破 Schema 欄位架構的限制 ..................................................................................................... 4

4. 資料遲早會一致.............................................................................................................................. 4

5. 成熟度不足,版本升級風險高 ................................................................................................... 5

NoSQL 的種類 ................................................................................................................................................... 5

1. Key-Value ............................................................................................................................................ 6

2. 記憶體資料庫 .................................................................................................................................... 7

3. 文件資料庫 ........................................................................................................................................ 7

4. 圖學資料庫 ........................................................................................................................................ 8

NoSQL 實際案例 .............................................................................................................................................. 9

1
雲端運算定義

主體是所有連接網路的實體,可以是人、設備和程式,客體是我們現在接觸到的以及不久將
來會出現的各種資訊服務。

硬體和軟體都是資源並被封裝為服務,使用者可以透過網路依其需求來使用。在雲端運算中,
工作通常運行在遠端的分散式系統上,而非本地端電腦或單一伺服器上。

Why use NoSQL ?

Facebook、Google、Twitter 這些國外大型網站,為了解決資料庫大量資料存取的問題,近年
來紛紛捨棄了關聯式資料庫技術,改以 NoSQL 資料庫來提升效能與擴充彈性;在臺灣,開發社
交遊戲的力可科技,也因為關聯式資料庫無法應付每日 2GB 的資料量增長,而改採 NoSQL 資料
庫來解決資料庫寫入暴量的問題。面對社交型態的網站興起,NoSQL 儼然成為資料庫的一股新威
力。
網站業者為了解決如 TB 等級甚至是 PB 等級的巨量資料儲存和擴充問題,開始研發各種建置
成本較低的分散式開源資料庫,Google 自行研發的 BigTable 就是其中最好的例子。其他如 Amazon、
Yahoo 近幾年也都投入這類 NoSQL 資料庫的研發。甚至連微軟的 Azure 雲端平臺也使用了 NoSQL
技術來存取資料。同樣情況,像 Facebook、Twitter、Zynga 這類社交型網站為了解決龐大的使用
者互動資料,也大量使用 NoSQL 資料庫技術。例如 Facebook 開發出 Cassandra 資料庫,在 600
多個運算核心的叢集系統上,儲存了超過 120TB 的站內郵件。

2
What is NoSQL?

NoSQL 資料庫是分散式非關聯式資料庫統稱的名詞,泛指哪些非關聯式資料庫的資料庫技術,
包括了數十種不同類型的資料庫系統,這些資料庫大多沒有支援標準的 SQL,例如知名的 Google
BigTable、Amazon S3 的 Dynamo 資料庫,或是微軟 Azure 平臺儲存資料的方式,都屬於 NoSQL
資料庫的其中一種。NoSQL 不像關聯式資料庫那樣有一套通用的基礎資料庫理論。導入 NoSQL 資料
庫的第一個挑戰是要拋棄原有的 SQL 觀念,學習新的資料存取方法。大約有以下描述:

1. NoSQL 是 Not Only SQL

因為 SQL 語言是關聯式資料庫的標準查詢語言,原本 NoSQL 資料庫用來代表那些無法提供


SQL 語言查詢的資料庫系統,這些資料庫系統大多是開源的分散式資料庫系統,不過,也有少數
商用資料庫系統具有 NoSQL 的特性,例如微軟 Azure 平臺上儲存資料的方式。
今年開源社群則出現了另外一個新的定義方式,將 NoSQL 視為「Not Only SQL」,不只是 SQL 的
意思,也就是說混用關聯式資料庫和 NoSQL 資料庫來達成最佳的儲存效果,像是用 NoSQL 資料
庫來儲存資料量大的用戶狀態資料,但其他資料仍然使用關聯式資料庫,以便善用 SQL 語法的
好處。

2.增加機器就能自動擴充資料庫容量

NoSQL 資料庫的另一個重要特性是具有水平擴充能力,只要增加新的伺服器節點,就可以
不斷擴充資料庫系統的容量。而且可以利用低價的一般等級電腦就能進行水平擴充,不像關聯
式資料庫的叢集系統往往需要效能和容量較大的伺服器才能勝任。NoSQL 資料庫可以用更低的
成本打造出 TB 等級或 PB 等級的大型資料庫系統。有些 NoSQL 資料庫甚至可以在不停機或不影
響應用程式的情況下,線上就能直接擴充資料庫系統的容量。 簡單來說,水平擴充能力的意思
就是只要增加新的伺服器設備,就能自動增加資料庫的容量,從管理角度來看,這也可以減少
長期維護資料庫的人力。

3
3.打破 Schema 欄位架構的限制

關聯式資料庫必須透過資料庫的 Schema 欄位架構來確立資料表之間的關聯,Schema 通常


是事先設計好的架構,上線以後要進行欄位變更非常麻煩,尤其資料量龐大時要變更 Schema 的
難度很高。NoSQL 資料庫則是改用 Key-Value 資料模式來解決龐大資料的異動困難。Key-Value
模式是將一筆資料的結構簡化到只有一個 Key 值對應到一個 Value 值,每一筆資料之間沒有關連
性,所以,可以任意切割或調整,也可以分散到不同的伺服器中建立副本。有些 NoSQL 資料庫
則是增加了 Column 的觀念,用法上等於是可以用更多的 Key 值來對應 Value,例如 Cassandra
就提供了 4 層或 5 層 Key-Value 的資料結構,可以用 3 個 Key 來對應 1 個 Value 值。例如用「使
用者帳號」
、「個人檔案」
、「生日」這三個 Key 值來取得某一個用戶的生日日期。採用 Column 設
計的 NoSQL 資料庫會比只用 Key-Value 資料架構的資料庫更有彈性,減少資料存取程式的開發難
度。因為 NoSQL 資料庫沒有 Schema 架構,所以,也無法支援標準的 SQL 語法來查詢資料。NoSQL
資料庫通常是透過簡單的 API 來新增、更新或刪除資料庫中的內容,有些資料庫則會提供類似
SQL 語法中的 Select 查詢機制,不過通常也無法執行複雜的 Join 指令,例如 Google App Engine
就提供了 GQL 語法讓開發者查詢 BigTable 上的資料。

4.資料遲早會一致

為了確保資料的完整性,關聯式資料庫採用的交易(Transaction)的設計,讓資料存取或異
動過程中不會受到干擾。Transaction 資料庫的特性就是 ACID,在 SQL 執行過程中,確保有交易
作為最小運作單位(Atomicity)
、異動過程確保整體資料庫的一致性(Consistency)
、執行多筆交
易時能隔離交易中的資料不受其他交易影響(Isolation)以及交易過程不會變動原始資料的持久
性(Durability)
。但是 ACID 架構的資料庫擴充不易,所以,NoSQL 資料庫大多沒有交易的設計,
而是採用了另外一個不同的 CAP 資料庫理論。CAP 理論有三個關鍵,包括資料一致性(Consistent)、
可用性(Availability)和中斷容忍性(Partition Tolerance)
。理論上無法同時兼顧 CAP 這三種特性,
所以,NoSQL 資料庫通常會選擇其中兩種特性來設計,通常是選擇 CP 或 AP。多數 NoSQL 資料
庫選擇的是 CP 的設計,不過,NoSQL 資料庫中談的資料一致性和關聯式資料庫的意義不同。
NoSQL 資料庫會採取 Eventually Consistency(資料遲早會一致)的作法,因為 NoSQL 的分散式設
計會將資料分散複製到不同節點中,每個節點各自也能異動資料,然後再彼此同步。同步過程
就會有時間落差,若同時讀取不同節點上的資料,會發生資料不一致的情況。 NoSQL 資料庫為
了保持分散式的擴充架構,容許這樣的情況,只有保證最後資料會達到一致。而在資料尚未同
步的短暫時間內就需要開發者自行解決資料衝突或遺失的問題,或者是用 NoSQL 資料庫來記錄
那些對精確度要求較低的資料,例如 Facebook 的贊按鈕,即使少了幾個贊的記錄,使用者也不
容易發現,就適合用 NoSQL 資料庫來儲存。導入 NoSQL 資料庫時,開發者得先評估資料的性質,
是否能承擔資料遺失的風險。

4
5.成熟度不足,版本升級風險高

因為近幾年 Web 2.0 網站和社交網站的盛行,才開始出現用 NoSQL 資料庫解決使用者貢獻


資料的暴漲問題。很多 NoSQL 資料庫都是這 2、3 年內才出現,所以,資料庫本身的功能還不完
整,也較少出現成熟穩定的版本,版本升級過程中很容易會出現不相容的情形。另一方面,這
類資料庫大多透過 API 來存取資料,新的版本若增加了新的功能,也會改變這些 API 的參數或呼
叫方式。對開發者而言,等於得重新修改應用程式,才能正確取得資料庫中的內容。甚至是資
料庫本身儲存的檔案格式也會變化,升級新版本資料庫後,反而無法讀取舊版檔案,必須進行
格式轉檔的工作。 找到合適的 NoSQL 資料庫,一方面要挑選知名網站所使用的資料庫,因為這
些知名網站通常也是這些資料庫的貢獻者,他們為了解決自身的使用問題,會比較積極地完善
資料庫。另外,還要考慮自身的技術能力以及掌握外國技術發展的學習能力,雖然 NoSQL 資料
庫提供了另外一種低成本的分散式資料庫,自動擴充節點的功能可以節省資料庫維護人力,但
是,相對地,也須承擔技術不夠成熟時的變動風險。

NoSQL 的種類

早在 NoSQL 資料庫這個名詞流行之前,就已經出現了很多種非關聯式資料庫,這些資料庫
各有不同的特徵,很難像關聯式資料庫那樣,用一套共同的觀念就可以全部了解。只能逐一了解
每個 NoSQL 資料庫的特性和用途。目前有 4 種比較受到關注的 NoSQL 資料庫,分別是 Key-Value
資料庫,記憶體資料庫(In-memory Database)
、圖學資料庫(Graph Database)以及文件資料庫
(Document Database)

5
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 網址即可。啟動資料庫以後,這兩個節點會自行複製資料、分散儲存、
平衡資料庫存取的負載。

6
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 伺服器搭配多臺資料伺服
器,資料伺服器間互相備援、容錯。

7
4.圖學資料庫

最後一類是圖學資料庫,這不是專門用來處理圖片的資料庫,而是指運用圖學架構來儲
存節點間關係資料架構,例如用樹狀結構來組織從屬關係或網狀結構來儲存朋友關係,地理
圖資系統通常也會用圖學資料庫來儲存地圖上每一點和鄰近點的關係,或用圖學資料庫來計
算點與點之間最短的距離,也可以用同樣的概念來計算出人與人之間最短的交友距離。圖學
資料庫最大的特性是對複雜性的擴充力,關係越複雜的資料越適合使用圖學資料庫。這類資
料的資料結構沒有標準的作法,基本的圖學資料包括了節點(Node) 、關係(Relation)和屬
性(Property)三種結構。例如用節點來記錄 Facebook 上的帳號、用關係來記錄朋友關係、
用屬性來描述這個帳號的個人資料等。最後可以用網絡圖來呈現出 Facebook 用戶之間的交
友狀況。常見的圖學資料庫如 Neo4j、InfoGrid、AllegroGrph 等。

這四大類 NoSQL 資料庫是比較精簡的區分方式,可以用來快速了解不同 NoSQL 資料庫的特性和


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

NoSQL 實際案例

8
力可科技採取混用的作法,將成長速度最快、檔案最大的幾個資料表,搬移到 NoSQL 的分
散式資料庫中,其餘資料表則是還儲存在免費的 MySQL 資料庫中。用 NoSQL 解決龐大資料的擴
充需求,另一方面則能保留用 SQL 語法來查詢其他資料的便利性。

要建置分散式資料庫,Cassandra 只要建立 2 個伺服器節點就能執行,這兩個節點的功能和


角色幾乎一模一樣,只需要在設定檔中指定好彼此溝通的 IP 網址即可。啟動資料庫以後,這兩
個節點會自行複製資料、分散儲存、平衡資料庫存取的負載。未來要擴充資料庫的容量時,只要
建妥另一個 Cassandra 的資料庫節點,啟動新節點後,原有的節點就會自行將資料複製到新節點
中,自動建立彼此的分散架構。「很容易就可以擴充資料庫。即使有一臺資料庫節點當機,重新
開啟後就能自動再加入。」

Cassandra 屬於 Key-Value Store 類型的分散式資料庫,採用 Key-Value 資料模式來儲存資料。


最簡單的 Key-Value 資料庫中,每一筆記錄只有 2 個欄位,也就是 Key 欄位和 Value 欄位,每一
個 Key 對應到一個 Value 欄位,沒有傳統關聯式資料庫的欄位架構(Schema),讀取資料的方式
也只有設定值、取出值或刪除值等簡單的操作,沒有像 SQL 語言那樣可以進行 Join 的複雜查詢。
但是 Key-Value 架構的好處正是因為沒有 Schema,只要建立另一群 Key 值,就等於是建立了另一
個資料表,而因為每一群資料之間沒有關連,可以任意切割或擴充。

不過,Key-Value 資料庫後來也發展出不同的 Key-Value 結構,例如像 Cassandra 提供了


ColumnFamily,以及 Column/SuperColumn 的彈性資料結構。使用上可視為三層的 Hash Key 對應
到一個值。舉例來說,第一層 Key 是使用者帳號,帳號中有一項是個人資訊,第二層 Key 則是個
人資訊。在個人資訊中又可以分成很多種類,如性別、學歷、生日等,生日就是第三層 Key。透
過「使用者帳號」 、
「個人資訊」 、「生日」這三個 Key 值,就可取得對應的 Value 內容,也就是這
個人的生日。

除了資料存取方式改變以外,還會有 SQL 資料庫不會發生的資料衝突問題。分散式資料庫會


將資料複製成好幾份放到不同的伺服器中,一般常見的作法是複製成 3 份。當程式更新其中一臺
伺服器中的記錄時,還需要一段時間才會同步到其他伺服器中,這段時間差內,若有另外一支程
式到還未同步資料的伺服器中讀取記錄,就會取得不一樣的舊數據。即使是只有 2 臺伺服器,同
樣也會發生資料不同步的情況。力可的作法是一筆資料重複讀取兩次,或者是設定要讀取不同伺
服器的資料,再相互比對,如果相同就可以使用,若不相符,表示其中一個數據是舊版本,暫緩
一點時間再重新讀取。

除了資料讀取衝突外,寫入時也會發生衝突。因為社交遊戲是多人同時進行,可能會發生 2
個使用者同時寫入到同一筆資料的情況,或者是有 1 個人寫入資料時,另一個人正要讀取該筆資
料。這也會造成兩個使用者拿到不同的資料,或者是只有其中 1 個人的資料成功寫入。

9
因為 NoSQL 資料庫沒有 SQL 資料庫的「交易」 (Transaction)設計,在資料異動過程中,NoSQL
資料庫不會鎖住資料來阻止其他寫入或讀取動作,所以會發生資料衝突,造成資料錯誤或遺失。
像 Cassandra 的設計就是採取 Eventual Consistency 的原則,經過一段時間資料沒有更新時,分散
的各版本資料終究會達成一致,所以,力可導入 Cassandra 資料庫的過程中,每天上百萬次的資
料存取總會遇到幾次資料衝突的情況,力可表示,開發者必須自行解決這些原本在 SQL 資料庫中
會自動處理的問題。像金錢這類資訊比較適合關聯式資料庫,若要使用 NoSQL 資料庫,就需要
特別處理資料一致性的問題。

Cassandra 最大的優點是可以降低維護成本。使用者貢獻比例高的網站資料量通常很大,成
長速度也很快。若要採用 MySQL 來滿足資料庫不斷擴充的需求,往往每隔一段時間就要會遇到
資料庫空間不足,甚至得有專人負責切割和轉移資料庫。

10

You might also like