大資料的儲存和管理

broadviewbj發表於2013-04-17

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

大資料儲存

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

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

 並行資料庫

  並行資料庫是指那些在無共享的體系結構中進行資料操作的資料庫系統。這些系統大部分採用了關係資料模型並且支援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一詞最早出現於1998年,它是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關係型資料庫(他認為,由於NoSQL悖離傳統關聯式資料庫模型,因此,它應該有一個全新的名字,比如“NoREL”或與之類似的名字)。

  2009年,Last.fm的Johan Oskarsson發起了一次關於分散式開源資料庫的討論,來自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集團在一份報告中提出,其主要包括兩類系統:擁有關係型資料庫產品和服務,並將關係模型的好處帶到分散式架構上;或者提高關聯式資料庫的效能,使之達到不用考慮水平擴充套件問題的程度。前一類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將廣義的資料庫系統進行了分類。

 資料庫系統的分類

  圖中將資料庫分為關係型資料庫、非關係型資料庫以及資料庫快取系統。其中,非關係型資料庫主要指的是NoSQL資料庫,分為:鍵值資料庫、列存資料庫、圖存資料庫以及文件資料庫四大類。關係型資料庫包含了傳統關聯式資料庫系統以及NewSQL資料庫。

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

  • 可擴充套件性(Scalability)——硬體價格
  • 高效能(Performance)——MySQL的效能瓶頸
  • 弱一致性(Relaxed consistency)——CAP理論
  • 敏捷性(Agility)——持久多樣性
  • 複雜性(Intricacy)——海量資料
  • 必然性(Necessity)——開源

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

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

相關文章