大數據導論(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM