1. 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。
2. 如何查看IT大數據中ElasticSearch組件的數據存儲路徑
如果是默認配置的話,就是放在ES目錄下的data文件夾下
如果是默認配置的話,就是放在ES目錄下的data文件夾下
-