天天看點

大資料的存儲和管理

 任何機器都會有實體上的限制:記憶體容量、硬碟容量、處理器速度等等,我們需要在這些硬體的限制和性能之間做出取舍,比如記憶體的讀取速度比硬碟快得多,是以記憶體資料庫比硬碟資料庫性能好,但是記憶體為2GB的機器不可能将大小為100GB的資料全部放入記憶體中,也許記憶體大小為128GB的機器能夠做到,但是資料增加到200GB時就無能為力了。

資料不斷增長造成單機系統性能不斷下降,即使不斷提升硬體配置也難以跟上資料的增長速度。然而,當今主流的計算機硬體比較便宜而且可以擴充,現在購置八台8核心、128GB記憶體的機器比購置一台64核心、TB級别記憶體的伺服器劃算得多,而且還可以增加或減少機器來應對将來的變化。這種分布式架構政策對于海量資料來說是比較适合的,是以,許多海量資料系統選擇将資料放在多個機器中,但也帶來了許多單機系統不曾有的問題。

下面我們介紹大資料存儲和管理發展過程中出現的四類大資料存儲和管理資料庫系統。

并行資料庫

并行資料庫[1]是指那些在無共享的體系結構中進行資料操作的資料庫系統。這些系統大部分采用了關系資料模型并且支援SQL語句查詢,但為了能夠并行執行SQL的查詢操作,系統中采用了兩個關鍵技術:關系表的水準劃分和SQL查詢的分區執行。

水準劃分的主要思想就是根據某種政策将關系表中的元組分布到叢集中的不同節點上,這些節點上的表結構是一樣的,這樣就可以對元組并行處理。現有的分區政策有哈希分區、範圍分區、循環分區等。例如,哈希分區政策是将表T中的元組分布到n個節點上,可以使用統一的雜湊演算法對元組中的某個或某幾個屬性進行哈希,如hash(T.attribute1) mod n,然後根據哈希值将元組放置到不同的節點上。

在分區存儲的表中處理SQL查詢需要使用基于分區的執行政策,如擷取表T中某一數值範圍内的元組,系統首先為整個表T生成總的執行計劃P,然後将P拆分成n個子計劃{P1,…,Pn},子計劃Pi在節點ni上獨立執行,最後每個節點将生成的中間結果發送到某一標明的節點上,該節點對中間結果進行聚集産生最終的結果。

并行資料庫系統的目标是高性能和高可用性,通過多個節點并行執行資料庫任務,提高整個資料庫系統的性能和可用性。最近一些年不斷湧現一些提高系統性能的新技術,如索引、壓縮、實體化視圖、結果緩存、I/O共享等,這些技術都比較成熟且經得起時間的考驗。與一些早期的系統如Teradata必須部署在專有硬體上不同,最近開發的系統如Aster、Vertica等可以部署在普通的商業機器上,這些資料庫系統可以稱得上準雲系統。

并行資料庫系統的主要缺點就是沒有較好的彈性,而這種特性對中小型企業和初創企業是有利的。人們在對并行資料庫進行設計和優化的時候認為叢集中節點的數量是固定的,若需要對叢集進行擴充和收縮,則必須為資料轉移過程制訂周全的計劃。這種資料轉移的代價是昂貴的,并且會導緻系統在某段時間内不可通路,而這種較差的靈活性直接影響到并行資料庫的彈性以及現用現付商業模式的實用性。

并行資料庫的另一個問題就是系統的容錯性較差,過去人們認為節點故障是個特例,并不經常出現,是以系統隻提供事務級别的容錯功能,如果在查詢過程中節點發生故障,那麼整個查詢都要從頭開始重新執行。這種重新開機任務的政策使得并行資料庫難以在擁有數以千個節點的叢集上處理較長的查詢,因為在這類叢集中節點的故障經常發生。基于這種分析,并行資料庫隻适合于資源需求相對固定的應用程式。不管怎樣,并行資料庫的許多設計原則為其他海量資料系統的設計和優化提供了比較好的借鑒。

NoSQL資料管理系統

NoSQL[5]一詞最早出現于1998年,它是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關系型資料庫(他認為,由于NoSQL悖離傳統關系資料庫模型,是以,它應該有一個全新的名字,比如“NoREL”或與之類似的名字[6])。

2009年,Last.fm的Johan Oskarsson發起了一次關于分布式開源資料庫的讨論[7],來自Rackspace的Eric Evans再次提出了NoSQL的概念,這時的NoSQL主要指非關系型、分布式、不提供ACID的資料庫設計模式。

2009年在亞特蘭大舉行的“no:sql(east)”讨論會是一個裡程碑,其口号是"select fun, profit from real_world where relational=false;"。是以,對NoSQL最普遍的解釋是“非關系型的”,強調鍵值存儲和文檔資料庫的優點,而不是單純地反對關系型資料庫。

傳統關系型資料庫在處理資料密集型應用方面顯得力不從心,主要表現在靈活性差、擴充性差、性能差等方面。最近出現的一些存儲系統摒棄了傳統關系型資料庫管理系統的設計思想,轉而采用不同的解決方案來滿足擴充性方面的需求。這些沒有固定資料模式并且可以水準擴充的系統現在統稱為NoSQL(有些人認為稱為NoREL更為合理),這裡的NoSQL指的是“Not Only SQL”,即對關系型SQL資料系統的補充。NoSQL系統普遍采用的一些技術有:

簡單資料模型。不同于分布式資料庫,大多數NoSQL系統采用更加簡單的資料模型,這種資料模型中,每個記錄擁有唯一的鍵,而且系統隻需支援單記錄級别的原子性,不支援外鍵和跨記錄的關系。這種一次操作擷取單個記錄的限制極大地增強了系統的可擴充性,而且資料操作就可以在單台機器中執行,沒有分布式事務的開銷。

中繼資料和應用資料的分離。NoSQL資料管理系統需要維護兩種資料:中繼資料和應用資料。中繼資料是用于系統管理的,如資料分區到叢集中節點和副本的映射資料。應用資料就是使用者存儲在系統中的商業資料。系統之是以将這兩類資料分開是因為它們有着不同的一緻性要求。若要系統正常運轉,中繼資料必須是一緻且實時的,而應用資料的一緻性需求則因應用場合而異。是以,為了達到可擴充性,NoSQL系統在管理兩類資料上采用不同的政策。還有一些NoSQL系統沒有中繼資料,它們通過其他方式解決資料和節點的映射問題。

弱一緻性。NoSQL系統通過複制應用資料來達到一緻性。這種設計使得更新資料時副本同步的開銷很大,為了減少這種同步開銷,弱一緻性模型如最終一緻性和時間軸一緻性得到廣泛應用。

通過這些技術,NoSQL能夠很好地應對海量資料的挑戰。相對于關系型資料庫,NoSQL資料存儲管理系統的主要優勢有:

避免不必要的複雜性。關系型資料庫提供各種各樣的特性和強一緻性,但是許多特性隻能在某些特定的應用中使用,大部分功能很少被使用。NoSQL系統則提供較少的功能來提高性能。

高吞吐量。一些NoSQL資料系統的吞吐量比傳統關系資料管理系統要高很多,如Google使用MapReduce每天可處理20PB存儲在Bigtable中的資料。

高水準擴充能力和低端硬體叢集。NoSQL資料系統能夠很好地進行水準擴充,與關系型資料庫叢集方法不同,這種擴充不需要很大的代價。而基于低端硬體的設計理念為采用NoSQL資料系統的使用者節省了很多硬體上的開銷。

避免了昂貴的對象-關系映射。許多NoSQL系統能夠存儲資料對象,這就避免了資料庫中關系模型和程式中對象模型互相轉化的代價。

NoSQL向人們提供了高效便宜的資料管理方案,許多公司不再使用Oracle甚至MySQL,他們借鑒Amzon的Dynamo和Google的Bigtable的主要思想建立自己的海量資料存儲管理系統,一些系統也開始開源,如Facebook将其開發的Cassandra捐給了Apache軟體基金會。

雖然NoSQL資料庫提供了高擴充性和靈活性,但是它也有自己的缺點,主要有:

資料模型和查詢語言沒有經過數學驗證。SQL這種基于關系代數和關系演算的查詢結構有着堅實的數學保證,即使一個結構化的查詢本身很複雜,但是它能夠擷取滿足條件的所有資料。由于NoSQL系統都沒有使用SQL,而使用的一些模型還未有完善的數學基礎。這也是NoSQL系統較為混亂的主要原因之一。

不支援ACID特性。這為NoSQL帶來優勢的同時也是其缺點,畢竟事務在很多場合下還是需要的,ACID特性使系統在中斷的情況下也能夠保證線上事務能夠準确執行。

功能簡單。大多數NoSQL系統提供的功能都比較簡單,這就增加了應用層的負擔。例如如果在應用層實作ACID特性,那麼編寫代碼的程式員一定極其痛苦。

沒有統一的查詢模型。NoSQL系統一般提供不同查詢模型,這一定程度上增加了開發者的負擔。

NewSQL資料管理系統

人們曾普遍認為傳統資料庫支援ACID和SQL等特性限制了資料庫的擴充和處理海量資料的性能,是以嘗試通過犧牲這些特性來提升對海量資料的存儲管理能力,但是現在一些人則持有不同的觀念,他們認為并不是ACID和支援SQL的特性,而是其他的一些機制如鎖機制、日志機制、緩沖區管理等制約了系統的性能,隻要優化這些技術,關系型資料庫系統在處理海量資料時仍能獲得很好的性能。

關系型資料庫處理事務時對性能影響較大、需要優化的因素有:

通信。應用程式通過ODBC或JDBC與DBMS進行通信是OLTP事務中的主要開銷。

日志。關系型資料庫事務中對資料的修改需要記錄到日志中,而日志則需要不斷寫到硬碟上來保證持久性,這種代價是昂貴的,而且降低了事務的性能。

鎖。事務中修改操作需要對資料進行加鎖,這就需要在鎖表中進行寫操作,造成了一定的開銷。

闩。關系型資料庫中一些資料結構,如B樹、鎖表、資源表等的共享影響了事務的性能。這些資料結構常常被多線程讀取,是以需要短期鎖即闩。

緩沖區管理。關系型資料将資料組織成固定大小的頁,記憶體中磁盤頁的緩沖管理會造成一定的開銷。

為了解決上面的問題,一些新的資料庫采用部分不同的設計,它取消了耗費資源的緩沖池,在記憶體中運作整個資料庫。它還擯棄了單線程服務的鎖機制,也通過使用備援機器來實作複制和故障恢複,取代原有的昂貴的恢複操作。這種可擴充、高性能的SQL資料庫被稱為NewSQL,其中“New”用來表明與傳統關系型資料庫系統的差別,但是NewSQL也是很寬泛的概念。它首先由451集團[1]在一份報告中提出,其主要包括兩類系統:擁有關系型資料庫産品和服務,并将關系模型的好處帶到分布式架構上;或者提高關系資料庫的性能,使之達到不用考慮水準擴充問題的程度。前一類NewSQL包括Clustrix、GenieDB、ScalArc、ScaleBase、NimbusDB,也包括帶有NDB的MySQL叢集、Drizzle等。後一類NewSQL包括Tokutek、JustOne DB。還有一些“NewSQL即服務”,包括Amazon的關系資料庫服務、Microsoft的SQL Azure、FathomDB等。

當然,NewSQL和NoSQL也有交叉的地方,例如,RethinkDB可以看作NoSQL資料庫中鍵/值存儲的高速緩存系統,也可以當作NewSQL資料庫中MySQL的存儲引擎。現在許多NewSQL提供商使用自己的資料庫為沒有固定模式的資料提供存儲服務,同時一些NoSQL資料庫開始支援SQL查詢和ACID事務特性。

NewSQL能夠提供SQL資料庫的品質保證,也能提供NoSQL資料庫的可擴充性。VoltDB是NewSQL的實作之一,其開發公司的CTO宣稱,它們的系統使用NewSQL的方法處理事務的速度比傳統資料庫系統快45倍。VoltDB可以擴充到39個機器上,在300個CPU核心中每分鐘處理1600萬事務,其所需的機器數比Hadoop叢集要少很多。

随着NoSQL、NewSQL資料庫陣營的迅速崛起,當今資料庫系統“百花齊放”,現有系統達數百種之多,圖1-1将廣義的資料庫系統進行了分類[2]。

大資料的存儲和管理

圖1-1  資料庫系統的分類[3]

圖1-1中将資料庫分為關系型資料庫、非關系型資料庫以及資料庫緩存系統。其中,非關系型資料庫主要指的是NoSQL資料庫,分為:鍵值資料庫、列存資料庫、圖存資料庫以及文檔資料庫四大類。關系型資料庫包含了傳統關系資料庫系統以及NewSQL資料庫。

高容量、高分布式、高複雜性應用程式的需求迫使傳統資料庫不斷擴充自己的容量極限,這些驅動傳統關系型資料庫采用不同的資料管理技術的6個關鍵因素可以概括為“SPRAIN”,即:

可擴充性(Scalability)——硬體價格

高性能(Performance)——MySQL的性能瓶頸

弱一緻性(Relaxed consistency)——CAP理論

靈活性(Agility)——持久多樣性

複雜性(Intricacy)——海量資料

必然性(Necessity)——開源

作者簡介

陸嘉恒,中國人民大學教授,博士生導師。2006年畢業于×××大學計算機科學系,獲博士學位;2006-2008年在美國加利福尼亞大學爾灣分校(University of California, Irvine)進行博士後研究;2008年加入中國人民大學,2012年破格晉升為教授。主要研究領域包括資料庫技術和雲計算技術。先後在SIGMOD、VLDB、ICDE、WWW等國際重要會議和期刊上發表資料庫方向的論文40多篇,主編多本雲計算和大資料的教材和著作。

本文節選自《大資料挑戰與NoSQL資料庫技術》一書。陸嘉恒 編著,由電子工業出版社出版。

大資料的存儲和管理

[1]    451集團是涉及最新技術、商業模式的分析及咨詢公司。

[2]    http://nosql-database.org/