分布式存儲系統架構圖
⑴ 如何實現企業數據 大數據平台 分布式存放
Hadoop在可伸縮性、健壯性、計算性能和成本上具有無可替代的優勢,事實上已成為當前互聯網企業主流的大數據分析平台。本文主要介紹一種基於Hadoop平台的多維分析和數據挖掘平台架構。作為一家互聯網數據分析公司,我們在海量數據的分析領域那真是被「逼上樑山」。多年來在嚴苛的業務需求和數據壓力下,我們幾乎嘗試了所有可能的大數據分析方法,最終落地於Hadoop平台之上。
1. 大數據分析大分類
Hadoop平台對業務的針對性較強,為了讓你明確它是否符合你的業務,現粗略地從幾個角度將大數據分析的業務需求分類,針對不同的具體需求,應採用不同的數據分析架構。
按照數據分析的實時性,分為實時數據分析和離線數據分析兩種。
實時數據分析一般用於金融、移動和互聯網B2C等產品,往往要求在數秒內返回上億行數據的分析,從而達到不影響用戶體驗的目的。要滿足這樣的需求,可以採用精心設計的傳統關系型資料庫組成並行處理集群,或者採用一些內存計算平台,或者採用HDD的架構,這些無疑都需要比較高的軟硬體成本。目前比較新的海量數據實時分析工具有EMC的Greenplum、SAP的HANA等。
對於大多數反饋時間要求不是那麼嚴苛的應用,比如離線統計分析、機器學習、搜索引擎的反向索引計算、推薦引擎的計算等,應採用離線分析的方式,通過數據採集工具將日誌數據導入專用的分析平台。但面對海量數據,傳統的ETL工具往往徹底失效,主要原因是數據格式轉換的開銷太大,在性能上無法滿足海量數據的採集需求。互聯網企業的海量數據採集工具,有Facebook開源的Scribe、LinkedIn開源的Kafka、淘寶開源的Timetunnel、Hadoop的Chukwa等,均可以滿足每秒數百MB的日誌數據採集和傳輸需求,並將這些數據上載到Hadoop中央系統上。
按照大數據的數據量,分為內存級別、BI級別、海量級別三種。
這里的內存級別指的是數據量不超過集群的內存最大值。不要小看今天內存的容量,Facebook緩存在內存的Memcached中的數據高達320TB,而目前的PC伺服器,內存也可以超過百GB。因此可以採用一些內存資料庫,將熱點數據常駐內存之中,從而取得非常快速的分析能力,非常適合實時分析業務。圖1是一種實際可行的MongoDB分析架構。
圖1 用於實時分析的MongoDB架構
MongoDB大集群目前存在一些穩定性問題,會發生周期性的寫堵塞和主從同步失效,但仍不失為一種潛力十足的可以用於高速數據分析的NoSQL。
此外,目前大多數服務廠商都已經推出了帶4GB以上SSD的解決方案,利用內存+SSD,也可以輕易達到內存分析的性能。隨著SSD的發展,內存數據分析必然能得到更加廣泛的應用。
BI級別指的是那些對於內存來說太大的數據量,但一般可以將其放入傳統的BI產品和專門設計的BI資料庫之中進行分析。目前主流的BI產品都有支持TB級以上的數據分析方案。種類繁多,就不具體列舉了。
海量級別指的是對於資料庫和BI產品已經完全失效或者成本過高的數據量。海量數據級別的優秀企業級產品也有很多,但基於軟硬體的成本原因,目前大多數互聯網企業採用Hadoop的HDFS分布式文件系統來存儲數據,並使用MapRece進行分析。本文稍後將主要介紹Hadoop上基於MapRece的一個多維數據分析平台。
數據分析的演算法復雜度
根據不同的業務需求,數據分析的演算法也差異巨大,而數據分析的演算法復雜度和架構是緊密關聯的。舉個例子,Redis是一個性能非常高的內存Key-Value NoSQL,它支持List和Set、SortedSet等簡單集合,如果你的數據分析需求簡單地通過排序,鏈表就可以解決,同時總的數據量不大於內存(准確地說是內存加上虛擬內存再除以2),那麼無疑使用Redis會達到非常驚人的分析性能。
還有很多易並行問題(Embarrassingly Parallel),計算可以分解成完全獨立的部分,或者很簡單地就能改造出分布式演算法,比如大規模臉部識別、圖形渲染等,這樣的問題自然是使用並行處理集群比較適合。
而大多數統計分析,機器學習問題可以用MapRece演算法改寫。MapRece目前最擅長的計算領域有流量統計、推薦引擎、趨勢分析、用戶行為分析、數據挖掘分類器、分布式索引等。
2. 面對大數據OLAP大一些問題
OLAP分析需要進行大量的數據分組和表間關聯,而這些顯然不是NoSQL和傳統資料庫的強項,往往必須使用特定的針對BI優化的資料庫。比如絕大多數針對BI優化的資料庫採用了列存儲或混合存儲、壓縮、延遲載入、對存儲數據塊的預統計、分片索引等技術。
Hadoop平台上的OLAP分析,同樣存在這個問題,Facebook針對Hive開發的RCFile數據格式,就是採用了上述的一些優化技術,從而達到了較好的數據分析性能。如圖2所示。
然而,對於Hadoop平台來說,單單通過使用Hive模仿出SQL,對於數據分析來說遠遠不夠,首先Hive雖然將HiveQL翻譯MapRece的時候進行了優化,但依然效率低下。多維分析時依然要做事實表和維度表的關聯,維度一多性能必然大幅下降。其次,RCFile的行列混合存儲模式,事實上限制死了數據格式,也就是說數據格式是針對特定分析預先設計好的,一旦分析的業務模型有所改動,海量數據轉換格式的代價是極其巨大的。最後,HiveQL對OLAP業務分析人員依然是非常不友善的,維度和度量才是直接針對業務人員的分析語言。
而且目前OLAP存在的最大問題是:業務靈活多變,必然導致業務模型隨之經常發生變化,而業務維度和度量一旦發生變化,技術人員需要把整個Cube(多維立方體)重新定義並重新生成,業務人員只能在此Cube上進行多維分析,這樣就限制了業務人員快速改變問題分析的角度,從而使所謂的BI系統成為死板的日常報表系統。
使用Hadoop進行多維分析,首先能解決上述維度難以改變的問題,利用Hadoop中數據非結構化的特徵,採集來的數據本身就是包含大量冗餘信息的。同時也可以將大量冗餘的維度信息整合到事實表中,這樣可以在冗餘維度下靈活地改變問題分析的角度。其次利用Hadoop MapRece強大的並行化處理能力,無論OLAP分析中的維度增加多少,開銷並不顯著增長。換言之,Hadoop可以支持一個巨大無比的Cube,包含了無數你想到或者想不到的維度,而且每次多維分析,都可以支持成千上百個維度,並不會顯著影響分析的性能。
而且目前OLAP存在的最大問題是:業務靈活多變,必然導致業務模型隨之經常發生變化,而業務維度和度量一旦發生變化,技術人員需要把整個Cube(多維立方體)重新定義並重新生成,業務人員只能在此Cube上進行多維分析,這樣就限制了業務人員快速改變問題分析的角度,從而使所謂的BI系統成為死板的日常報表系統。
3. 一種Hadoop多維分析平台的架構
整個架構由四大部分組成:數據採集模塊、數據冗餘模塊、維度定義模塊、並行分 析模塊。
數據採集模塊採用了Cloudera的Flume,將海量的小日誌文件進行高速傳輸和合並,並能夠確保數據的傳輸安全性。單個collector宕機之後,數據也不會丟失,並能將agent數據自動轉移到其他的colllecter處理,不會影響整個採集系統的運行。如圖5所示。
數據冗餘模塊不是必須的,但如果日誌數據中沒有足夠的維度信息,或者需要比較頻繁地增加維度,則需要定義數據冗餘模塊。通過冗餘維度定義器定義需要冗餘的維度信息和來源(資料庫、文件、內存等),並指定擴展方式,將信息寫入數據日誌中。在海量數據下,數據冗餘模塊往往成為整個系統的瓶頸,建議使用一些比較快的內存NoSQL來冗餘原始數據,並採用盡可能多的節點進行並行冗餘;或者也完全可以在Hadoop中執行批量Map,進行數據格式的轉化。
維度定義模塊是面向業務用戶的前端模塊,用戶通過可視化的定義器從數據日誌中定義維度和度量,並能自動生成一種多維分析語言,同時可以使用可視化的分析器通過GUI執行剛剛定義好的多維分析命令。
並行分析模塊接受用戶提交的多維分析命令,並將通過核心模塊將該命令解析為Map-Rece,提交給Hadoop集群之後,生成報表供報表中心展示。
核心模塊是將多維分析語言轉化為MapRece的解析器,讀取用戶定義的維度和度量,將用戶的多維分析命令翻譯成MapRece程序。核心模塊的具體邏輯如圖6所示。
圖6中根據JobConf參數進行Map和Rece類的拼裝並不復雜,難點是很多實際問題很難通過一個MapRece Job解決,必須通過多個MapRece Job組成工作流(WorkFlow),這里是最需要根據業務進行定製的部分。圖7是一個簡單的MapRece工作流的例子。
MapRece的輸出一般是統計分析的結果,數據量相較於輸入的海量數據會小很多,這樣就可以導入傳統的數據報表產品中進行展現。
⑵ 雲存儲架構分哪些層次,各自實現了什麼功能_雲存儲架構包含哪些內容
(1)存儲層
雲存儲系統對外提供多種不同的存儲服務,各種服務的數據統一存放在雲存儲系統中,形成一個海量數據池。從大多數網路服務後台數據組織方式來看,傳統基於單伺服器的數據組織難以滿足廣域網多用戶條件下的吞吐性能和存儲容量需求;基於P2P架構的數據組織需要龐大的節點數量和復雜編碼演算法保證數據可靠性。相比而言,基於多存儲伺服器的數據組織方法能夠更好滿足在線存儲服務的應用需求,在用戶規模較大時,構建分布式數據中心能夠為不同地理區域的用戶提供更好的服務質量。
雲存儲的存儲層將不同類型的存儲設備互連起來,實現海量數據的統一管理,同時實現對存儲設備的集中管理、狀態監控以及容量的動態擴展,實質是一種面向服務的分布式存儲系統。
(2)基礎管理層
雲存儲系統架構中的基礎管理層為上層提供不同服務間公共管理的統一視圖。通過設計統一的用戶管理、安全管理、副本管理及策略管理等公共數據管理功能,將底層存儲與上層應用無縫銜接起來,實現多存儲設備之間的協悔早同工作,以更好的性能對外提供多種服務。
(3)應用介面層
應用介面層是雲存儲平台中可以靈活擴展的、直接面向用戶的部分。根據用戶需求,可以開發出不同的應用介面,提供相應的服務。比如數據存儲服務、空間租賃服務、公共資源服務、多用戶數據共享服務、數據備份服務等。
(4)訪問層
通過訪問層,任何一個授權用戶都可以在任何地方,使用一台聯網的終端設備,按照標準的公用應用介面來登錄雲存儲平台,享受雲存儲服務。
2雲存儲技術的優勢
作為新興的存儲技術,與傳統的購買存儲設備和部署存儲軟體相比,雲存儲方式存在以下優點:
(1)成本低、見效快
傳統的購買存儲設備或軟體定製方式下,企業根據信息化管理的需求,一次性投入大量資金購置硬體設備首飢、搭建平台。軟體開發則經過漫長的可行性分析、需求調研、軟體設計、編碼、測試這一過程。往往在軟體開發完成以後,業務需求發生變化,不得不對軟體進行返工,不僅影響質量,提高成本,更是延誤了企業信息化進程,同時造成了企業之間的低水平重復投資以及企業內部周期性、高成本的技術升級。在雲存儲方式下,企業除了配置必要的終端設備接收存儲服務外,不需要投入額外的資金來搭建平台。企業只需按用戶數分期租用服務,規避了一次性投資的風險,降低了使用成本,而且對於選定的服務,可以立即投入使用,既方便又快捷。
(2)易者前返於管理
傳統方式下,企業需要配備專業的IT人員進行系統的維護,由此帶來技術和資金成本。雲存儲模式下,維護工作以及系統的更新升級都由雲存儲服務提供商完成,企業能夠以最低的成本享受到最新最專業的服務。
(3)方式靈活
傳統的購買和定製模式下,一旦完成資金的一次性投入,系統無法在後續使用中動態調整。隨著設備的更新換代,落後的硬體平台難以處置;隨著業務需求的不斷變化,軟體需要不斷地更新升級甚至重構來與之相適應,導致維護成本高昂,很容易發展到不可控的程度。而雲存儲方式一般按照客戶數、使用時間、服務項目進行收費。企業可以根據業務需求變化、人員增減、資金承受能力,隨時調整其租用服務方式,真正做到「按需使用」。
3雲存儲技術趨勢
隨著寬頻網路的發展,集群技術、網格技術和分布式文件系統的拓展,CDN內容分發、P2P、數據壓縮技術的廣泛運用,以及存儲虛擬化技術的完善,雲存儲在技術上已經趨於成熟,以「用戶創造內容」和「分享」為精神的Web2.0推動了全網域用戶對在線服務的認知
⑶ 海量分布式存儲系統Doris原理概述
Doris( https://github.com/itisaid/Doris )是一個海量分布式 KV 存儲系統,其設計目 標是支持中等規模高可用可伸縮的 KV 存儲集群。
Doris可以實現海量存儲,線性伸縮、平滑擴容,自動容錯、故障轉移,高並發,且運維成本低。部署規模,建議部署4-100+台伺服器。
Doris採用兩層架構,Client 和 DataServer+Store。
有四個核心組件,Client、DataServer、Store、Administration。
應用程序通過Client SDK進行Doris的訪問,
每台伺服器上部署一個Data Sever做伺服器的管理,每台伺服器上有自己的存儲Store,整個集群的數據存儲,每台機器獨立部署。數據通過路由選擇寫入到不同的機器中。
Administration為管理中心,提供配置、管理和監控。
config指,應用程序啟動一個Data Server,在啟動時要配置管理中心的ip地址,通關管理中心。管理中心會修改配置項感知到集群中加了新機器,對新機器管理,擴容等。待機器處於可用狀態,將該機器的配置項通知給KV Client。從而KV Client進行新的路由選擇。
擴容、下線機器等的控制台界面通過Management管理。
Monitor監控機器是否正常。
client寫數據,綁定產品的namespace(邏輯隔離),構成新key,路由到具體機器上讀寫。
路由解析演算法是設計的一個關鍵點,決定集群的管理方式,也決定了集群擴容的復雜性和難度。
Doris的演算法類似redis,有桶的概念,key映射到1w個虛擬節點,虛擬節點在映射到物理節點。
由於Doris設計時,用於4-100+規模的集群。因此,Doris分了1w個虛擬節點,當伺服器超過100會導致負載不均衡,1000會更差,相當於每一個集群上有10個虛擬節點,虛擬節點會有10%的影響。
擴容時,需要調節虛擬節點指向新的位置。具體過程為,暴利輪詢新節點添加後,一個伺服器上應該承載的虛擬節點個數,將超出的虛擬節點遷移到新機器即可。如上圖左圖有2個物理節點,擴容後,有3個物理節點,變為右圖。
為了保證高可用。doris所有服務分成2個組,兩組伺服器對等。兩個group是可以有不同數量的伺服器。
寫操作時,client的路由演算法在兩個group分別選2個伺服器,分別(同時)寫入,兩個伺服器全部返回後,再繼續向下進行。讀操作時,從兩個伺服器隨機選一個讀。這樣,提高可用性,數據持久性,不會丟失。
集群管理的重要角色Config Server,有一個功能是負責發現故障伺服器。
發現故障的方式有2種:
節點失效分為:瞬間失效、臨時失效、永久失效
應用伺服器向伺服器寫,如果寫失敗,為 瞬間失效 。接著應用伺服器進行3次重試。3次都失敗,通知管理伺服器,進行服務的失效判斷。
管理伺服器再寫一次,如果寫成功,認為是客戶端自己通信通信問題。如果寫入失敗,判斷為 臨時失效 ,通知所有client,伺服器失效,不要寫,也不讀。
如果2小時恢復,則節點為臨時失效。如果2小時沒有恢復,認為是 永久失效 。
如圖,如果節點2失效,進入臨時失效階段。
如圖,節點2臨時失效2個小時還未恢復,判定為永久失效。進入永久失效的恢復。
設計中,有臨時日誌節點(備份節點),有空白節點。實際使用中沒有節點3空白節點。原因:1 自動遷移有風險,還是需要手動遷移。2 幾年宕機1台,一直有一個空白節點standby浪費。一般晚上報警失效也沒有事情,第二天,找機器擴容即可。認為24小時之內,同樣編號的2台機器連續down掉,概率很低。
物理節點分成2個group,寫的時候,向2個group同時寫。當其中一個group擴容機器時,該group上的所有節點進入臨時失效狀態。停止讀寫,將數據遷移到新的伺服器上。
由於是虛擬節點的映射在調整,所以遷移是按照虛擬節點調整。為了遷移方便,虛擬節點物理化,一個虛擬節點對應一個文件。遷移時其實就是拷貝文件。這時,如果group1有節點失效也會出現不一致,但是,通常擴容的過程很快,因為,是scp拷貝文件,瓶頸為網路帶寬,通常幾十T數據,幾分鍾遷移完成,十來分鍾進行數據恢復。
⑷ 什麼是分布式存儲系統
分布式存儲系統,是將數據分散存儲在多台獨立的設備上。傳統的網路存儲系統採用集中的存儲伺服器存放所有數據,存儲伺服器成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。分布式網路存儲系統採用可擴展的系統結構,利用多台存儲伺服器分擔存儲負荷,利用位置伺服器定位存儲信息,它不但提高了系統的可靠性、可用性和存取效率,還易於擴展。
(4)分布式存儲系統架構圖擴展閱讀:
分布式存儲,集中管理,在這個方案中,共有三級:
1、上級監控中心:上級監控中心通常只有一個,主要由數字矩陣、認證伺服器和VSTARClerk軟體等。
2、本地監控中心:本地監控中心可以有多個,可依據地理位置設置,或者依據行政隸屬關系設立,主要由數字矩陣、流媒體網關、iSCSI存儲設備、VSTARRecorder軟體等組成;音視頻的數據均主要保存在本地監控中心,這就是分布式存儲的概念。
3、監控前端:主要由攝像頭、網路視頻伺服器組成,其中VE4000系列的網路視頻伺服器可以帶硬碟,該硬碟主要是用於網路不暢時,暫時對音視頻數據進行保存,或者需要在前端保存一些重要數據的情況。
⑸ 基於Spring+SpringMVC+Mybatis分布式敏捷開發系統架構(附源碼)
前言
zheng項目不僅僅是一個開發架構,而是努力打造一套從 前端模板 - 基礎框架 - 分布式架構 - 開源項目 - 持續集成 - 自動化部署 - 系統監測 - 無縫升級 的全方位J2EE企業級開發解決方案。
項目介紹
基於Spring+SpringMVC+Mybatis分布式敏捷開發系統架構,提供整套公共微服務服務模塊:內容管理、支付中心、用戶管理(包括第三方)、微信平台、存儲系統、配置中心、日誌分析、任務和通知等,支持服務治理、監控和追蹤,努力為中小型企業打造全方位J2EE企業級開發解決方案。
技術
名稱
官網
技術
名稱
官網
架構圖
模塊依賴
Spring+SpringMVC+Mybatis框架集成公共模塊,包括公共配置、MybatisGenerator擴展插件、通用BaseService、工具類等。
基於bootstrap實現的響應式Material Design風格的通用後台管理系統,zheng項目所有後台系統都是使用該模塊界面作為前端展示。
各個子系統前台thymeleaf模板,前端資源模塊,使用nginx代理,實現動靜分離。
本系統是基於RBAC授權和基於用戶授權的細粒度許可權控制通用平台,並提供單點登錄、會話管理和日誌管理。接入的系統可自由定義組織、角色、許可權、資源等。用戶許可權=所擁有角色許可權合集+用戶加許可權-用戶減許可權,優先順序:用戶減許可權>用戶加許可權>角色許可權
文件存儲系統,提供四種方案:
阿里雲OSS
服務網關,對外暴露統一規范的介面和包裝響應結果,包括各個子系統的交互介面、對外開放介面、開發加密介面、介面文檔等服務,可在該模塊支持驗簽、鑒權、路由、限流、監控、容錯、日誌等功能。示例圖:
API網關
內容管理系統:支持多標簽、多類目、強大評論的內容管理,有基本單頁展示,菜單管理,系統設置等功能。
統一掃碼支付
通用用戶管理系統, 實現最常用的用戶注冊、登錄、資料管理、個人中心、第三方登錄等基本需求,支持擴展二次開發。
微信公眾號管理平台,除實現官網後台自動回復、菜單管理、素材管理、用戶管理、消息群發等基礎功能外,還有二維碼推廣、營銷活動、微網站、會員卡、優惠券等。
微信小程序後台
基於Netty實現SocketIO的實時推送系統。支持命名空間、二進制數據、SSL、ACK等功能。
環境搭建
開發指南
maven編譯安裝zheng/pom.xml文件即可
啟動演示
約定優於配置(convention over configuration),此框架約定了很多編程規范,下面一一列舉:
資料庫模型
拓撲圖
⑹ Bigtable---分布式的結構化數據存儲系統
sina
Bigtable 是一個分布式的結構化數據存儲系統,它被設計用來處理海量數據:通常是分布在數千台普通伺服器上的PB 級的數據。Google 的很多項目使用Bigtable 存儲升唯數據,包括Web 索引、GoogleEarth、Google Finance。這些應用對Bigtable 提出的要求差異非常大,無論是在數據量上(從URL到網頁到衛星圖像)還是在響應速度上(從後端的批量處理到實時數據服務)。
Bigtable 已經實現了下面的幾個目標:適用性廣泛、可擴展、高性能和高可用性,Bigtable 是一個稀疏的、分布式的、持久化存儲的多維度排序Map。
圖一:一個存儲Web 網頁的例子的表的片斷。行名是一個反向URL。contents 列族存放的是網頁的內容,anchor 列族存放引用該網頁的錨鏈接文本(alex 註:如果不知道HTML 的Anchor,請Google一把)。CNN 的主頁被Sports Illustrater和MY-look 的主頁引用,因此該行包含了名為「anchor:cnnsi.com」和「anchhor:my.look.ca」的列。每個錨鏈接只有一拿缺個版本(alex 註:注意時間戳標識了列的版本,t9 和t8 分別標識了兩個錨鏈接的版本);而contents 列則有三個版本,分別由時間戳t3,t5,和t6 標識。
行
Bigtable 通過行關鍵字的字典順序來組織數據。表中的每個行都可以動態分區。每個分區叫做一個」Tablet」,Tablet 是數據分布和負載均衡調整的最小單位。
列族
Webtable 有個列族language,language 列族用來存放撰寫網頁的語言。
我們在language 列族中只使用一個列關鍵字,用來存放每個網頁的語言標識ID。Webtable 中另一個有用的列族是anchor;這個列族的每一個列關鍵字代表一個錨鏈接,如圖一所示。Anchor 列族的限定詞是引用該網頁的站點名;Anchor 列族每列的數據項存放的是鏈接文本。訪問控制、磁碟和內存的使用統計都是在列族層面進行的。
時間戳
不同版本的數據通過時間戳來索引。Bigtable 時間戳的類型是64 位整型。
Bigtable 可以給時間戳賦值,用來表示精確到毫秒的「實時」時間;用戶程序也可以給時間戳賦值。如果應用程序需要避免數據版本沖突,那麼它必須自己生成具有唯一性的時間戳。數據項中,不同版本的數據按照時間戳倒序排序,即最新的數據排在最前面。為了減輕多個版本數據的管理負擔,我們對每一個列族配有兩個設置參數, Bigtable 通過這兩個參數可以對廢棄版本的數據自動進行垃圾收集。用戶可以指定只保存最後n 個版本的數據,或者只保存「足夠新」的版本的數據(比如,只保存最近7 天的內容寫入的數據)。
Bigtable支持的其他特性
1、Bigtable 支持單行上的事務處理,利用這個功能,用戶可以對存儲在一個行關鍵字下的數據進行原子性的讀-更新-寫操作。
2、Bigtable 允許把數據項用做整數計數器。
3、Bigtable 允許用戶在伺服器的地址空間內執行腳本程序
4、Bigtable 可以和MapRece一起使用,MapRece 是Google 開發的大規模並行計算框架。我們已經開發了一些Wrapper 類,通過使用這些Wrapper 類,Bigtable 可以作為MapRece 框架的輸入和輸出。
Bigtable依賴於google的幾項技術。用GFS來存儲日誌和數據文件;按SSTable文件格式存儲數據;用Chubby管理元數據:
Bigtable是建立在其它的幾個Google基礎構件上的。BigTable 使用Google 的分布式文件系統(GFS)存儲日誌文件和數據文件。BigTable 集群通常運行在一個共享的機器池中,池中的機器還會運行其它的各種各樣的分布式應用程序,BigTable 的進程經消笑辯常要和其它應用的進程共享機器。BigTable 依賴集群管理系統來調度任務、管理共享的機器上的資源、處理機器的故障、以及監視機器的狀態。
BigTable 內部存儲數據的文件是Google SSTable 格式的。SSTable 是一個持久化的、排序的、不可更改的Map 結構,而Map 是一個key-value 映射的數據結構,key 和value 的值都是任意的Byte串,從內部看,SSTable 是一系列的數據塊(通常每個塊的大小是64KB,這個大小是可以配置的)。。SSTable 使用塊索引(通常存儲在SSTable 的最後)來定位數據塊;在打開SSTable的時候,索引被載入到內存。每次查找都可以通過一次磁碟搜索完成:首先使用二分查找法在內存中的索引里找到數據塊的位置,然後再從硬碟讀取相應的數據塊。也可以選擇把整個SSTable 都放在內存中,這樣就不必訪問硬碟了。
BigTable 還依賴一個高可用的、序列化的分布式鎖服務組件,叫做Chubby。Chubby有五個活躍副本,同時只有一個主副本提供服務,副本之間用Paxos演算法維持一致性,Chubby提供了一個命名空間(包括一些目錄和文件),每個目錄和文件就是一個鎖,Chubby的客戶端必須和Chubby保持會話,客戶端的會話若過期則會丟失所有的鎖。
Bigtable 包括了三個主要的組件:鏈接到客戶程序中的庫、一個Master主伺服器和多個Tablet片 伺服器。
Bigtable會將表(table)進行分片,片(tablet)的大小維持在100-200MB范圍,一旦超出范圍就將分裂成更小的片,或者合並成更大的片。每個片伺服器負責一定量的片,處理對其片的讀寫請求,以及片的分裂或合並。片伺服器可以根據負載隨時添加和刪除。這里片伺服器並不真實存儲數據,而相當於一個連接Bigtable和GFS的代理,客戶端的一些數據操作都通過片伺服器代理間接訪問GFS。主伺服器負責將片分配給片伺服器,監控片伺服器的添加和刪除,平衡片伺服器的負載,處理表和列族的創建等。注意,主伺服器不存儲任何片,不提供任何數據服務,也不提供片的定位信息。
客戶端需要讀寫數據時,直接與片伺服器聯系。因為客戶端並不需要從主伺服器獲取片的位置信息,所以大多數客戶端從來不需要訪問主伺服器,主伺服器的負載一般很輕。
Master 伺服器主要負責以下工作:為Tablet 伺服器分配Tablets、檢測新加入的或者過期失效的Table 伺服器、對Tablet 伺服器進行負載均衡、以及對保存在GFS 上的文件進行垃圾收集。除此之外,它還處理對模式的相關修改操作,例如建立表和列族。
我們使用一個三層的、類似B+樹的結構存儲Tablet 的位置信息。
第一層是一個存儲在Chubby 中的文件,它包含了Root Tablet 的位置信息。這個Chubby文件屬於Chubby服務的一部分,一旦Chubby不可用,就意味著丟失了root tablet的位置,整個Bigtable也就不可用了。
第二層是root tablet。root tablet其實是元數據表(METADATA table)的第一個分片,它保存著元數據表其它片的位置。root tablet很特別,為了保證樹的深度不變,root tablet從不分裂。
第三層是其它的元數據片,它們和root tablet一起組成完整的元數據表。每個元數據片都包含了許多用戶片的位置信息。
片的數據最終還是寫到GFS里的,片在GFS里的物理形態就是若干個SSTable文件。下圖展示了讀寫操作基本情況。
BigTable和GFS的關系
集群包括主伺服器和片伺服器,主伺服器負責將片分配給片伺服器,而具體的數據服務則全權由片伺服器負責。但是不要誤以為片伺服器真的存儲了數據(除了內存中memtable的數據),數據的真實位置只有GFS才知道,主伺服器將片分配給片伺服器的意思應該是,片伺服器獲取了片的所有SSTable文件名,片伺服器通過一些索引機制可以知道所需要的數據在哪個SSTable文件,然後從GFS中讀取SSTable文件的數據,這個SSTable文件可能分布在好幾台chunkserver上。
一個簡化的Bigtable結構圖:
結構圖以Webtable表為例,表中存儲了網易、網路和豆瓣的幾個網頁。當我們想查找網路貼吧昨天的網頁內容,可以向Bigtable發出查詢Webtable表的(com..tieba, contents:, yesterday)。
假設客戶端沒有該緩存,那麼Bigtable訪問root tablet的片伺服器,希望得到該網頁所屬的片的位置信息在哪個元數據片中。使用 METADATA.Webtable.com..tieba 為行鍵在root tablet中查找,定位到最後一個比它大的是 METADATA.Webtable.com..www ,於是確定需要的就是元數據表的片A。訪問片A的片伺服器,繼續查找 Webtable.com..tieba ,定位到 Webtable.com..www 是比它大的,確定需要的是Webtable表的片B。訪問片B的片伺服器,獲得數據。
這里需要注意的是,每個片實際都由若干SSTable文件和memtable組成,而且這些SSTable和memtable都是已排序的。這就導致查找片B時,可能需要將所有SSTable和memtable都查找一遍;另外客戶端應該不會直接從元數據表獲得SSTable的文件名,而只是獲得片屬於片伺服器的信息,通過片伺服器為代理訪問SSTable。