BigTable學習

沒有時間操作,這裏其實這是整理下了網上的資料,稍微看了看沒做別的什麼。所以,有幫助,但效果不明顯。

1)    BigTable

BigTable是Google 在GFS文件系統的基礎上設計的一種分佈式數據庫系統。用戶的應用程序將通過BigTable存儲結構施作用於GFS文件系統,其工作流程等同於一般關係數據庫和的文件系統。但與一般關係數據庫不同的是BigTable採用多級映射的數據結構,支持大規模數據處理及存儲、高容錯性和自我管理等功能,可部署到上千臺服務器,整個集羣系統處理速度可達每秒數百萬次讀寫操作。BigTable正在爲Google六十多種產品和項目提供存儲和獲取結構化數據的支撐平臺,其中包括GooglePrint,Orkut,GoogleMaps,GoogleEarth和Blogger等,在Google內部至少運行着500個BigTable集羣。

²  BigTable數據模型

BigTable爲客戶提供簡單數據模型,客戶可以利用這個模型動態控制數據的分佈式存儲及其存儲模式。此數據模型是一個稀疏的、分佈式的、持久化存儲的多維度排序Map。Map的索引是行關鍵字、列關鍵字及時間戳,Map的值是未經解析的字符串。

其中行關鍵字可以使用任意字符串,BigTable對行關鍵字的讀寫操作具有原子性, 將行關鍵字按字典順序組織數據,表中的每行都可以動態分區,每個分區叫子表(tablet),子表是數據分佈和負載均衡調整的最小單位,有效的提高數據訪問時的效率。BigTable中列關鍵字組成的集合叫“列族”,列族是訪問控制的最小單位,存放在同一列族下的所有數據通常屬於同一類型。BigTable中不同版本的數據通過時間戳進行索引,可採用精確到毫秒的實時時間表示,也可由用戶程序爲時間戳賦值。

上圖爲Google存儲網頁的數據模型。圖中行關鍵字爲url的倒序:com.cnn.www,列關鍵字有網頁內容content,網頁對應不同索引文件:anchor:cnnis.com和my.look.ca三個組成。時間戳控制不同網頁的時間或版本信息如:網頁內容(content)的t3,t5,t6,新聞網頁1(anchor:consi.com)的t9,新聞網頁2(anchor:my.loot.ca)的t8爲同一類信息的不同時間。用戶讀寫BigTable中數據時,需要以上三個關鍵字共同定位數據才能訪問到所需內容。

²  BigTable組件

BigTable包括三個主要的組件:連接到客戶端的庫,一個Master服務器和多個子表服務器。針對系統工作負載的變化情況,可以動態向集羣中添加或者刪除子表服務器。Master服務器的主要功能是爲子表服務器分配子表,監測新加或者過時的子表服務器,對子表服務器提供負載均衡以及對保存在GFS上的文件進行垃圾收集等功能。客戶端讀取的數據不經過Master服務器,而是由客戶程序直接和子表服務器通信進行讀寫操作,所以,Master服務器的負載很輕。子表服務器負責處理它所加載的所有子表的讀寫操作,以及在子表過大時,對其進行分割的操作,子表的大小一般維持在100-200mb之間。

 

²  BigTable文件存儲及讀寫操作

BigTable子表存儲採用多級映射結構,使用一個三層、類似B+樹的結構存儲子表的位置信息,如圖所示。

第一層是一個存儲在Chubby中的文件,包含了RootTablet的位置信息,RootTablet中包含MetaData表的第一個子表,此表包含MetaData中所有子表的位置信息。MetaData表中的每個子表都包含一個用戶子表的集合,各子表的位置信息存儲在行關鍵字中。

BigTable數據的存儲分爲兩部分,最近的更新存儲在memtable中,較早的更新則以SSTable的格式存儲在GFS中,數據存儲中後者爲主體部分,是不可變的數據。寫操作的內容插入到memtable中時,直到memtable的大小達到一個閥值時就會被凍結,創建出一個新的memtable,舊的數據則轉爲SSTable寫入GFS。

BigTable進行讀操作時爲了恢復一個子表需綜合考慮memtable和SSTable,子表服務器首先從MetaData中讀取他的元數據,子表的元數據包含了組成這個子表的SSTable的列表,以及一系列的已提交的讀寫日誌記錄。子表服務器把SSTABLE的索引讀進內存,通過重複讀寫日誌提交的更新重建memtable。

對tablet服務器進行寫操作時,tablet服務器首先讀取chubby文件中的讀寫權限信息,檢查這個操作發起者是否有執行權限,檢查操作格式是否正確。成功的修改操作將被記錄在提交日誌中。BigTable採用批量提交的方式提高包含大量小修改操作的應用程序的吞吐量。一個寫操作被提交後,待寫的內容插入到memtable中;

²  BigTable讀寫操作的優化設計

BigTable對用戶的讀寫操作做了多方面的優化措施。

²  局部性羣組:允許客戶端將多個列族組合成一個局部性羣組,對子表中的每個局部性羣組都生成一個單獨的SSTable,將通常不會一起訪問的列族分割成不同的局部性羣組大大提高讀取操作的效率;

²  採用“兩遍”、可定製的壓縮方式。壓縮時以列族的方式組合數據,使得壓縮數據中包含大量重複內容,壓縮速度達100-200MB/S,解壓速度達400-1000MB/S.壓縮率達到10:1。大大節約了存儲空間的同時,壓縮解及壓縮速度都令人非常滿意;

²  子表服務器使用二級緩存策略。第一級緩存是掃描緩存,緩存子表服務器通過SSTABLE接口獲取的map鍵值對,block緩存是第二級緩存是從GFS讀取的SSTable的block,對於經常讀取剛剛讀過的數據附近的數據的應用程序,這兩種緩存都能有效的減少I/O的讀取操作;

²  定製Bloom過濾器。通過允許客戶程序對特定局部性羣組的SSTable制定Bloom過濾器減少硬盤的訪問次數,使用Bloom過濾器查詢一個SSTABLE是否包含特定行和列的數據,使用少量、用於存儲Bloom過濾器的內存的代價,換取讀操作顯著減少的磁盤訪問次數;

²  爲每個子表服務器設置一個提交日誌文件,把修改操作已追加方式寫入同一個日誌文件,避免日誌文件的搜索及實現批量提交任務的效果。

²  提供兩個日誌的寫入線程,應對單線程效率低得情況;利用SSTable的不變性而省掉文件系統訪問操作的同步,實現高效的對行的並行操作,同時對內存採用COW (copy on write)機制,允許讀寫操作的並行執行。將永久被標記爲“刪除”的SSTable的數據轉交Master服務器的垃圾回收服務處理。

發佈了66 篇原創文章 · 獲贊 9 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章