隨著云計算時代的到來,各種類型的互聯網應用層出不窮,對與此相關的數據模型、分布式架構、數據存儲等數據庫相關的技術指標也提出了新的要求。雖然傳統(tǒng)的關系型數據庫已在數據存儲方面占據了不可動搖的地位,但由于其天生的限制,已經越來越無法滿足云計算時代對數據擴展、讀寫速度、支撐容量以及建設和運營成本的要求。云計算時代對數據庫技術提出了新的需求,主要表現在以下幾個方面。
海量數據處理:對類似搜索引擎和電信運營商級的經營分析系統(tǒng)這樣大型的應用而言,需要能夠處理PB級的數據,同時應對百萬級的流量。
大規(guī)模集群管理:分布式應用可以更加簡單地部署、應用和管理。
低延遲讀寫速度:快速的響應速度能夠極大地提高用戶的滿意度。
建設及運營成本:云計算應用的基本要求是希望在硬件成本、軟件成本以及人力成本方面都有大幅度的降低。
關系型數據庫的劣勢分析
隨著Web2.0的發(fā)展,傳統(tǒng)的關系型數據庫在應對超大規(guī)模和高并發(fā)的SNS類型的網站方面暴露了許多難以克服的問題,主要表現在以下方面。
(1)高并發(fā)讀寫速度慢
這種情況主要發(fā)生在數據量達到一定規(guī)模時,由于關系型數據庫的系統(tǒng)邏輯非常復雜,使得其非常容易發(fā)生死鎖等并發(fā)問題,導致其讀寫速度下降非常嚴重。例如,Web2.0網站要根據用戶個性化信息來實時生成動態(tài)頁面、提供動態(tài)信息,所以基本上無法使用動態(tài)頁面靜態(tài)化技術,因此數據庫并發(fā)負載非常高,往往要達到每秒上萬次讀寫請求。關系型數據庫勉強可以應付上萬次SQL查詢,硬盤I/O往往無法承擔上萬次的SQL寫數據請求。
(2)支撐容量有限
類似Facebook、Twitter這樣的SNS網站,用戶每天產生海量的用戶動態(tài),每月會產生幾億條用戶動態(tài),對于關系型數據庫來說,在一張數億條記錄的表里面進行SQL查詢,效率是極其低下乃至不可忍受的。
(3)擴展性差
在基于Web的架構當中,數據庫是最難進行橫向擴展的,當一個應用系統(tǒng)的用戶量和訪問量與日俱增的時候,傳統(tǒng)的關系型數據庫卻沒有辦法像Web Server那樣簡單地通過添加更多的硬件和服務節(jié)點來擴展性能和負載能力。對于很多需要提供不間斷服務的網站來說,對數據庫系統(tǒng)進行升級和擴展是非常痛苦的事情,往往需要停機維護和數據遷移,因此迫切需要關系型數據庫也能夠通過不斷添加服務器節(jié)點來實現擴展。
(4)建設和運維成本高
企業(yè)級數據庫的價格很高,并且隨著系統(tǒng)的規(guī)模增大而不斷上升。高昂的建設和運維成本無法滿足云計算應用對數據庫的需求。
關系型數據庫遇到上述難以克服的瓶頸,與此同時,它的很多主要特性在云計算應用中卻往往無用武之地,例如:數據庫事務一致性、數據庫的寫實時性和讀實時性、復雜的SQL查詢特別是多表關聯查詢。因此,傳統(tǒng)的關系型數據庫已經無法獨立應付云計算時代的各種應用。
NoSQL數據庫數據模型
關系型數據庫越來越無法滿足云計算的應用場景,為了解決此類問題,非關系型數據庫應運而生,由于在設計上和傳統(tǒng)的關系型數據庫相比有了很大的不同,所以此類數據庫被稱為“NoSQL(Not only SQL)”系列數據庫。與關系型數據庫相比,它們非常關注對數據高并發(fā)讀寫和海量數據的存儲,在架構和數據模型方面作了簡化,而在擴展和并發(fā)等方面作了增強。目前,主流的NoSQL數據庫包括BigTable、HBase、Cassandra、SimpleDB、CouchDB、MongoDB以及 Redis等。NoSQL常用數據模型包括以下3種。
(1)Column-oriented(列式)
列式主要使用Table這樣的模型,但是它并不支持類似Join這樣多表的操作,它的主要特點是在存儲數據時,主要圍繞著“列(Column)”,而不是像傳統(tǒng)的關系型數據庫那樣根據“行(Row)”進行存儲,也就是說,屬于同一列的數據會盡可能地存儲在硬盤同一個頁中,而不是將屬于同一個行的數據存放在一起。這樣做的好處是,對于很多類似數據倉庫的應用,雖然每次查詢都會處理很多數據,但是每次所涉及的列并沒有很多。使用列式數據庫,將會節(jié)省大量I/O,并且大多數列式數據庫都支持Column Family這個特性,能將多個列并為一個小組。這樣做的好處是能將相似列放在一起存儲,提高這些列的存儲和查詢效率。總體而言,這種數據模型的優(yōu)點是比較適合匯總和數據倉庫這類應用。
(2)Key-value
雖然Key-value這種模型和傳統(tǒng)的關系型相比較簡單,有點類似常見的HashTable,一個Key對應一個Value,但是它能提供非??斓牟樵兯俣?、大的數據存放量和高并發(fā)操作,非常適合通過主鍵對數據進行查詢和修改等操作,雖然不支持復雜的操作,但是可以通過上層的開發(fā)來彌補這個缺陷。
(3)Document(文檔)
在結構上,Document和Key-value是非常相似的,也是一個Key對應一個Value,但是這個Value主要以JSON或者 XML等格式的文檔來進行存儲,是有語義的,并且Document DB一般可以對Value來創(chuàng)建Secondary Index來方便上層的應用,而這點是普通Key-Value DB所無法支持的。
常用NoSQL數據庫比較及優(yōu)劣勢分析
(1)主要NoSQL數據庫比較
從設計理念、數據模式、分布式等幾個角度對BigTable、Cassandra、Redis、MongoDB進行比較,見表1.
(2) NoSQL數據庫的優(yōu)勢分析
NoSQL數據庫主要有以下優(yōu)勢:
擴展簡單,典型例子是Cassandra,由于其架構類似于經典的P2P,因此能夠通過簡單添加新的節(jié)點來擴展集群;
讀寫快速,典型例子是Redis,由于其邏輯簡單,純內存操作,因此其具有非常出色的性能,單節(jié)點每秒可以處理超過10萬次的讀寫操作;
成本低廉,因為大多數NoSQL數據庫都是開源軟件,沒有昂貴的成本限制。
(3)NoSQL數據庫的劣勢分析
雖然NoSQL具有很多顯著的優(yōu)勢,但是依然存在很多不足,主要表現在:
不提供對SQL的支持,將會對用戶產生一定的應用遷移成本,同時,無法實現組合應用,發(fā)揮SQL數據庫已經非常成熟的優(yōu)勢;
支持的特性不夠豐富,現有NoSQL數據庫提供的功能十分有限,大多數都不支持事務和其他附加功能;
產品不夠成熟,大多數NoSQL數據庫產品還處于初級階段,與已經非常完善成熟的關系型數據庫不可同日而語。
結束語
云計算主要常見的有兩類場景:需要低延遲和高并發(fā)的讀寫能力,數據量雖大,但不超過TB級別,大部分現在使用RDBMS的Web應用基本上都屬于這一類,類似傳統(tǒng)的OLTP(聯機事務處理);海量數據的存儲和操作,如PB級別的,這方面的例子有傳統(tǒng)的數據倉庫、Google海量的Web頁面和圖片存儲等,類似傳統(tǒng)的OLAP(聯機分析處理)。目前,業(yè)界還沒有一款數據庫能同時適應上述多種云計算場景的NoSQL數據庫??紤]到PaaS平臺的需求比較復雜,能夠在后臺進行定制化的數據庫將是未來發(fā)展的趨勢,因此,輕量級的、兼顧高可擴展和高可靠性的架構設計將會受到歡迎。