Bigtable NotesBigtable Notes
0.設(shè)計目標(biāo):
管理海量結(jié)構(gòu)化數(shù)據(jù) 1.介紹
廣泛適應(yīng)性 2.數(shù)據(jù)模型
Rows
每一行的rowkey可以是任意字符,最多64KB。 Column Family
基本的訪問控制單位,由多個column組成。 Column
Column的格式是"family:qualifier",family必須是由可打印的字符組成的,qualifier可以是任意字符。 Timestamps
64bit整型,由系統(tǒng)決定或者用戶指定。 3.Dependency
GFS分布式文件系統(tǒng)(相比較HBase是HDFS) Bigtable使用GFS來存貯日志和數(shù)據(jù)。Bigtable數(shù)據(jù)存貯格式的是SSTable. SSTable 是由排序的,不可修改的key-value對組成的。 SSTable是由很多block組成,每個block的是64KB. SSTable有一個block index在文件的末尾,這樣就能快速定位block(使用二分法) SSTable可以完整的映射到memory,這樣讀的時候可以不用讀磁盤。 Cubby高可用的分布式鎖服務(wù) (相比較HBase是zookeeper)Cubby使用Paxos算法來保證數(shù)據(jù)的一致性。(Paxos 算法解決的問題是一個分布式系統(tǒng)如何就某個值(決議)達(dá)成一致) Cubby提供了目錄和小文件,他們都可以用做鎖,讀寫一個文件都是原子的。 每一個Cubby Client維護(hù)找一個session,當(dāng)session過期,它就會失去擁有的鎖和句柄。 Cubby Client可以設(shè)置callback,這樣當(dāng)文件改變就能得到通知。 Bigtable用Cubby: 保證最多只有一個活動的master node 存貯啟動的數(shù)據(jù) 存貯表的schema 存貯CF的訪問控制列表 4.實現(xiàn)Bigtable實現(xiàn)由三部分組成Client端、一個master server和多個tablet server。Master server把tablet指配給某個tablet server處理檢查新加的或者過期的tablet server 平衡tablet server的負(fù)載 回收GFS上面的過期數(shù)據(jù) 處理表的創(chuàng)建或者schema的修改 由于大部分Bigtable client并不需要和Master server通訊,而是直接和tablet server通訊,所以master server的負(fù)載相對較輕。 Tablet server讀寫數(shù)據(jù)切分tablet,當(dāng)tablet過大 Tablet locationBigtable使用了三層結(jié)構(gòu)。Chubby file-->ROOT tablet(never split)-->METADATA tablet-->User Tablet The Chubby file contains the location of ROOT tablet. Tablet Assignment每一個tablet被分配給一個tablet server.Master server保留著活著的tablet server的列表以及tablet和tablet server的對應(yīng)關(guān)系。 Bigtable使用Cubby來跟蹤tablet server的狀態(tài) 每一個tablet server啟動的時候,會在Cubby特定的文件夾生成一個文件,并得到這個文件鎖。 當(dāng)這個tablet server下線的時候,這個文件就會被刪除。反之,如果刪除該文件,tablet server也會結(jié)束自己。 Master server的失敗不會影響對現(xiàn)有tablet的分配。 新的Master server啟動的時候,會做以下動作: 1.獲得master鎖,這樣避免有多個master server起來 2.掃描Clubby里server的目錄,這樣就知道所有活著的tablet server 3.詢問每一個tablet server,這樣就知道每一個tablet server處理的tablet 4.掃描METADATA tablet,獲得tablet列表 Tablet Serving寫操作:當(dāng)更新時,首先會寫入commit log(放在GFS),用于記錄 最近的更新都是放在memory里面,memtable 老的更新才會寫到SSTable中 當(dāng)發(fā)生異常情況,比如掉電,內(nèi)存的數(shù)據(jù)丟失,這時候就可以根據(jù)commit log來恢復(fù)Tablet 讀操作: 會合并所有的SSTable和memtable的結(jié)果 當(dāng)Tablet進(jìn)行合并和split,讀寫操作都可以正常進(jìn)行 Compactionminor compaction:把memtable轉(zhuǎn)成SSTable,減少內(nèi)存使用major compaction:把一個Tablet所有的SSTable合成一個SSTable,刪除過期數(shù)據(jù) 5.優(yōu)化Locality groups用戶可以把多個CF綁在一個Locality groups里面,相對應(yīng)于一個SSTable這樣就可以減少磁盤IO,不必一次讀到所有數(shù)據(jù) 另外,對于一個locaity groups 有一個 in-memory屬性,這個屬性對那些數(shù)據(jù)量不大,但是頻繁讀寫,可以提高性能。 Compression用戶可以指定壓縮算法,這個用來壓縮每一個SSTable的每一個block。這樣做的好處是,不需要解壓整個SSTable文件 用戶可以指定兩步的壓縮算法,可以達(dá)到更好的壓縮比(10:1),這是因為相臨的數(shù)據(jù)一般比較相似 讀操作cache兩級cache:Scan cache(highlevel)- cache由SSTable返回的key-value對 對那些重復(fù)的讀操作很有用 Block cache (lowlevel)- cache SSTable 對那些讀附近的數(shù)據(jù)比較有用(順序讀) 布隆過濾器(Bloom Filter)布隆過濾器可以用于檢索一個元素是否在一個集合中。布隆過濾器可以用來減少對磁盤的讀操作。 尤其對于查詢一個不存在的rowkey,可以不需要訪問磁盤。 commit-log的實現(xiàn)如果對于每一個Tablet都有一個commit log的話,這樣會導(dǎo)致同時會寫多個log文件所以BigTable對同一個Tablet server使用同一個commit log 使用“table; row name; log sequence number"三元組作為log的key 這樣的好處就是相同table的log將在一起,以便于tablet的恢復(fù) 考慮到GFS的latency問題,Bigtable使用兩個線程來寫log,每一個線程都寫自己的log,這樣就會有兩份commit log,但兩個線程同時只有一個active 加速tablet的恢復(fù)當(dāng)master把一個tablet從一個tablet server移到另外一個tablet serer,分為四步:源tablet server做一次minor compaction,把memory寫到磁盤 源tablet server停止服務(wù)該tablet 源tablet server再做一次minor compaction,這次會很快 正式轉(zhuǎn)移到另外一個tablet server 利用不可修改性SSTable被設(shè)計成不可修改的,這樣做的主要好處是不需要同步。另外,SSTable的不可修改性,使得回收過期的SSTable變得簡單。 最后,不可修改使得tablet split起來非常迅速,子tablet可以跟父tablet share相同的SSTable文件 而memtable是可以修改的,對每一行使用了copy-on-write,這樣讀寫就可以并行處理 |
|
|