1. 程式人生 > >大資料導論(5)——大資料的儲存(分散式、NoSQL、叢集、CAP、ACID、BASE)

大資料導論(5)——大資料的儲存(分散式、NoSQL、叢集、CAP、ACID、BASE)

 

大資料從獲取到分析的各個階段都可能會涉及到資料集的儲存,考慮到大資料有別於傳統資料集,因此大資料儲存技術有別於傳統儲存技術。大資料一般通過分散式系統、NoSQL資料庫等方式(還有云資料庫)進行儲存。同時涉及到以下幾個新理念。

本篇summary主要圍繞以下三方面內容:

  • 大資料儲存方案(分散式系統、NoSQL資料庫系統);
  • 分佈與叢集、資料分佈的途徑;
  • 資料庫設計時涉及到的原則與遵循的定理。

 

叢集

將多臺伺服器集中在一起,每臺伺服器(節點)實現相同的業務。

因此每臺伺服器並不是缺一不可,叢集的目的是緩解併發壓力和單點故障轉移問題。

例如:新浪網微博的訪問量巨大,因此可以通過群集技術,幾臺伺服器完成同一業務。當有業務訪問時,選擇負載較輕的伺服器完成任務。

 

 

分散式

傳統的專案中,各個業務模組存在於同一系統中,導致系統過於龐大,開發維護困難,無法針對單個模組進行優化以及水平擴充套件。因此考慮分散式系統:

將多臺伺服器集中在一起,分別實現總體中的不同業務。每臺伺服器都缺一不可,如果某臺伺服器故障,則網站部分功能缺失,或導致整體無法執行。因此可大幅度的提高效率、緩解伺服器的訪問儲存壓力。

從上圖中可看出:每個Web伺服器(Tomcat)程式都負責一個網站中不同的功能,缺一不可。如果某臺伺服器故障,則對應的網站功能缺失,也可以導致其依賴功能甚至全部功能都不能夠使用。

 

分散式與叢集的關係、區別

關係:

分散式方便我們系統的維護和開發,但是不能解決併發問題,也無法保證我們的系統崩潰後的正常運轉。

叢集則恰好彌補了分散式的缺陷,多個伺服器處理相同的業務,這可以改善系統的併發問題,同時保證系統崩潰後的正常運轉。

因此,分散式和叢集技術一般同時出現,密不可分。(分散式中的每一個節點,都可以做叢集)

 

區別:

分散式是以縮短單個任務的執行時間來提升效率的,而叢集則是通過提高單位時間內執行的任務數來提升效率。

 

【補充】例如:

如果一個任務由10個子任務組成,每個子任務單獨執行需1小時,則在一臺伺服器上執行改任務需10小時。

  • 採用分散式方案:提供10臺伺服器,每臺伺服器只負責處理一個子任務,不考慮子任務間的依賴關係,執行完這個任務只需一個小時。(這種工作模式的一個典型代表就是Hadoop的Map/Reduce分散式計算模型)
  • 而採用叢集方案:同樣提供10臺伺服器,每臺伺服器都能獨立處理這個任務。假設有10個任務同時到達,10個伺服器將同時工作,10小時後,10個任務同時完成。整身來看,還是1小時內完成一個任務。

 

檔案系統 & 分散式檔案系統

檔案系統——是一種儲存和組織計算機資料的方法。

  • 資料是以檔案的形式存在,提供 Open、Read、Write、Seek、Close 等API 進行訪問;
  • 檔案以樹形目錄進行組織,提供重新命名(Rename)操作改變檔案或者目錄的位置。

分散式檔案系統——允許檔案通過網路在多臺主機上分享的檔案系統,可讓多機器上的多使用者分享檔案和儲存空間。

幾種常見的分散式檔案儲存系統有GFS(Google分散式檔案系統)、HDFS(Hadoop分散式檔案系統)、TFS、Swift、Ceph等。

                                                                 HDFS系統示意圖

 

NoSQL(非關係型資料庫)

NoSQL(Not Only SQL),意即"不僅僅是SQL"。NoSQL資料庫可同時儲存結構化、非結構化資料、半結構化資料。

相比於關係型資料庫,非關係型資料庫提出另一種理念:每一個樣本(元組)根據需要可以有不同的欄位,這樣就不侷限於固定的結構,調取資料時也更方便。可以減少一些時間和空間的開銷。因此為了獲取使用者的不同資訊,不需要像關係型資料庫中,對多表進行關聯查詢。僅需要根據id取出相應的value就可以完成查詢,通過XQuery、SPARQL等查詢語言完成查詢過程。

非關係型資料庫有以下幾種型別:

 

 

大資料集的資料量巨大,單機無法儲存與處理如此規模的資料量,只能依靠大規模叢集以進行儲存和處理,因此係統需要具備可擴充套件性。

目前主流的大資料儲存與計算系統往往採用橫向擴充套件(Scale Out)的方式。因此,對於待儲存處理的海量資料,需要用過資料分片將資料進行切分,並分配到各伺服器中。

資料分佈的兩條途徑:複製 & 分片

分散式NoSQL的兩大特性:複製和分片。

資料分片與資料複製是緊密聯絡的兩個概念。對於海量資料,可通過資料分片實現系統的水平擴充套件,通過資料複製保證資料的高可用性。

 

                                                                         資料分片與資料複製的關係

 

分片sharding/partition)——將資料的各個部分存放在不同的伺服器/節點中,每個伺服器/節點負責自身資料的讀取與寫入操作,以此實現橫向擴充套件。

複製replication)——將同一份資料拷貝到多個節點。分為主從複製master-slave方式、對等式複製peer-to-peer。

  • 主從式複製master節點用於存放權威資料,通常負責資料的更新,其餘節點都叫做slave節點,複製操作就是讓slave節點的資料與master節點的資料同步。適用於讀請求密集的負載。 
  • 對等式複製兩個節點相互為各自的副本,也同時可以接受寫入請求,丟失其中一個不影響整個資料庫的訪問。但同時接受寫入請求,容易出現數據(寫入)不一致問題,實際使用上,通常是隻有一個節點接受寫入請求,另一個master作為stand-by,在對方出現故障的時候自動承接寫操作請求。

分片與複製可以組合,即同時採用主從複製與分片、對等複製與分片。

 

【補充】優缺點對比:

分片可以極大地提高讀取效能,但對於要頻繁寫的應用,幫助不大。另外,分片對改善故障恢復能力並沒有幫助,但是它減少了故障範圍,只有訪問這個節點的那些使用者才會受影響,其餘使用者可以正常訪問。雖然資料庫缺失了一部分,但是還是其餘部分還是可以正常運轉。

複製除保證可用性之外,還可增加讀操作的效率。(即客戶端可以從多個備份資料中選擇物理距離較近的進行讀取,這既增加了讀操作的併發性又可以提高單次讀的讀取效率。)

 

 

對於分散式資料庫系統的設計過程,需遵循CAP定理:

CAP定理(布魯爾定理)

布式資料庫系統不可能同時滿足以下三點,最多隻能同時滿足兩個:

  • 一致性(Consistency)——所有節點在同一時間具有相同的資料;
  • 可用性(Availability)——保證每個請求不管成功或者失敗都有響應;
  • 分割槽容忍(Partition tolerance)——系統中任意資訊的丟失或失敗不會影響系統的繼續運作。

因此,當代的分散式資料儲存服務,均是針對各自服務的內容、性質取捨。

NoSQL資料庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三大類。

 

 

關係型資料庫的設計原則與事務管理遵循ACID規則:

ACID

事務(transaction),具有如下四個特性:

  • A (Atomicity) 原子性——事務裡的所有操作要麼全部做完,要麼都不做,事務成功的條件是事務裡的所有操作都成功,只要有一個操作失敗,整個事務失敗,需要回滾。
  • C (Consistency)一致性——資料庫要一直處於一致的狀態,事務的執行不會改變資料庫原本的約束。
  • I (Isolation) 獨立性——併發的事務是相互隔離的,一個事務的執行不能被其他事務干擾。
  • D (Durability) 永續性——是指一旦事務提交後,它所做的修改將會永久的儲存在資料庫上,即使系統崩潰也不會丟失。

 

 

基於CAP定理演化而來BASE資料庫設計原則:

BASE

包括:Basically Available(基本可用)、Soft state(軟狀態)、Eventually consistent(最終一致性)。

針對資料庫系統要求的可用性、一致性,BASE放寬要求,形成基本可用和軟狀態/柔性事務。而一致性是最終目的。

 

 

ACID vs.BASE