Google BigTable 資料庫實現的典範

2021-09-30 03:32:31 字數 1849 閱讀 7642

google bigtable**剛出來的時候匆匆讀過,沒什麼感想,只記得是乙個分布式多維對映表。今天重讀一遍**,再對照資料庫裡的相關技術,感覺有點意思了。一般來說,資料庫的技術專家大多數時間都在研究一些具體的演算法等問題,對乙個資料庫系統(或乙個資料儲存系統)從總體上如何實現的問題卻不太做考慮,這方面的學術資料也就比較少。

當要開發乙個新的資料庫系統或資料儲存系統時,最難決定的就是各種技術應該如何選擇的問題。比如,應該使用面向屬性還是面向記錄的儲存模型、應該使用基於鎖還是多版本的併發控制、應該對資料進行本地更新還是將修改記錄在別處、如何進行資料分割槽、如何做索引、需要提供什麼樣的併發控制和事務功能等等。每個地方都有很多選擇,即使你知道這些選擇是如何實現的,各種選擇有什麼優缺點,你還是很難選擇。但今天看了bigtable的**後發現bigtable實在算得上是資料庫實現的典範,bigtable中採用的所有技術都來自於資料庫領域的已有研究成果,但bigtable最成功的是很多技術的選擇、取捨都恰到好處。

bigtable中最重要的選擇是將資料儲存分為兩部分,主體部分是不可變的,以sstable的格式儲存在gfs中,最近的更新則儲存在記憶體(稱為memtable)中。讀操作需要根據sstable和memtable還綜合決定要讀取的資料的值。這一技術在資料庫系統中不太常用,但其實也有很多研究。最早的應該是lsm tree

,這一索引結構會在記憶體中快取對傳統b+樹索引的更新,隔一段時間後再將記憶體中的更新合併後主索引中去,在合併的時候就可以對鍵值進行排序,這樣就將對索引的隨機更新轉換為順序更新,提高了效能。stonebraker設計的c-store

系統也採用這一架構。這一技術的使用案例還有很多,比如mysql的innodb儲存引擎中insert buffer

,mysql新的事務型儲存引擎falcon

(只快取記錄更新,不快取索引更新)。新的ssd硬碟的順序寫效能很高,但隨機寫效能很差,因此ssd更新時也不會更新原資料,而是將新資料順序寫在一塊集中的位置,這就是來自於資料庫system r中的影子頁技術。使用不可變的儲存的好處是多方面的,可以使用非常激進的壓縮演算法,可以不需要考慮併發控制的問題。假如bigtable不採用這一選擇,整個系統的設計都會完全不同,而且實現將會嚴重複雜化。

第二個重要的決定是不支援事務,只保證對單條記錄的原子性。事務是好東西,但事務也是導致資料庫實現複雜化、效能下降最主要的根源。bigtable的開發者通過調研後發現其實大家對事務都沒什麼需求,只要保證對單條記錄的更新是原子的就可以了。這樣,為了支援事務所要考慮的序列化、事務的回滾等、死鎖檢測(一般認為,分布式環境中的死鎖檢測是不可能的,一般都用超時解決)等等複雜問題都不見了。系統實現進一步簡化。

除了這兩**擇,bigtable裡用到的資料庫技術還有非常多,這些技術都不是bigtable的開發者發明的,但都被它們非常好的進行了整合,最終產生乙個架構簡潔、模型明晰、易於實現、易於使用、可伸縮性和穩定性優秀的系統。這些技術如:

1. locality groups: 指定將一組屬性儲存在單獨的sstable中,這是資料庫中垂直分割槽技術的直接應用;

2. tablet的分割與定位: 用資料庫的術語來說就是水平分割槽,使用global index;

3. 布隆過濾器

(bloom filter): 一種不精確的索引,可以判定乙個鍵值是否不存在,布隆過濾器可能會說乙個本來不存在的鍵值存在,但決不會說乙個本來存在的值不存在。bigtable主要的瓶頸是從gfs中讀取的資料量,用這個過濾器處理處理就夠了,不需要建精確的索引,這樣索引占用的空間也會非常小。

總之,bigtable的**值得仔細閱讀。

最後再說一點,bigtable的設計決定了它處理隨機讀取小型記錄的效能是比較差的,這是因為要讀的資料再少,也要從gfs中傳輸乙個至少8k的塊。需要可以在客戶端做一些快取,但除非資料訪問熱點非常明顯,這些快取估計沒太大用處,因為一般來說客戶端的快取容量比起總的資料量來說實在是太小了。

Google BigTable 中文翻譯

題記 google 的成功除了乙個個出色的創意外,還因為有 jeff dean 這樣的軟體架構天才。歡迎訂閱作者微博 編者 官方的 google reader blog 中有對bigtable 的解釋。這是google 內部開發的乙個用來處理大資料量的系統。這種系統適合處理半結構化的資料比如 rss...

Catalan數(卡特蘭數)

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...

卡特蘭數 Catalan數

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...