天天看點

從Megastore看RDBMS和NOSQL系統結合

RDBMS的優勢在于功能,包括事務,強一緻性,同時支援随機讀和順序掃描,索引。NOSQL系統的優勢在于擴充性和性能。Google的經驗告訴我們,系統設計的關鍵點還是在于可擴充性,依賴于底層GFS+Bigtable提供的無與倫比的可擴充性,Megastore能夠在上層不斷完善功能,兼具RDBMS和NOSQL系統的優點。

1, 兼顧随機讀和順序掃描。Bigtable底層的存儲引擎為MemTable + SSTable構成的Merge-Dump存儲引擎,SSTable設計成8K ~ 64K的塊,塊之間有序,随機讀取型應用可以選擇較小的塊尺寸。和傳統關系型資料庫的B+樹存儲引擎不同的是,Merge-Dump存儲引擎中的SSTable是隻讀的,是以可以做得簡單有效。之是以能夠使用Merge-Dump存儲引擎是因為Bigtable把大表分成一個一個100MB~200MB的子表,存儲引擎隻需要處理百MB級别資料,而關系型資料庫的假設是整台機器維護一顆B+樹,存儲引擎處理的資料規模為百GB級别。

2, 索引層面。Megastore支援兩種索引,一種是local index,另外一種是global index。其中local index是單個Entity Group内部的索引,用于OLTP型的随機讀取應用。global index是分布式索引,解決類似全文索引,關聯推薦這樣的問題。由于大多數的通路局限于單個Entity Group内部,local index的效果與RDBMS的單機索引類似,而global index與NOSQL系統的索引方法類似,Megastore的索引同時具有RDBMS和NOSQL系統索引的優點。

3, 事務。Megastore要提供的功能就是在滿足事務功能的前提下不犧牲可擴充性和性能。同樣是通過劃分Entity Group,使得大多數的事務操作局限在Entity Group内部,通過Bigtable的單行事務保證單個Entity Group内部寫redo log的原子性,在保證可擴充性和性能的前提下支援事務功能;而跨Entity Group的事務操作很不頻繁,通過Two-phase commit協定支援這個功能,即使犧牲一些性能也不至于有太大影響。是以,可以認為Entity Group是RDBMS和NOSQL系統結合的神器。

4, 存儲引擎。關系型資料庫的存儲引擎一般都是基于行的存儲引擎,而NOSQL系統往往支援OLAP應用,是以,也會用到列式存儲引擎。Bigtable的Locality Group讓使用者可以通過schema配置資料的行列存儲模式。

5, Compaction。Compaction會影響讀取類操作的響應時間,因為可能需要讀取多個SSTable。然而,Bigtable的Compaction操作基本能夠做到自适應。如果Bigtable Tablet Server接收寫入的速度太快,單個子表可能同時有多個SSTable,但這樣的應用往往都是MapReduce計算型應用,對延時要求不會太高;線上的OLTP應用寫入一般比較慢,很少出現一個子表同時有多個SSTable的情況,往往隻需要讀取一個SSTable,再合并記憶體表MemTable中的資料即可。

6, MapReduce支援。Megastore基本保留了GFS + Bigtable的全部優點,是以,對分布式計算,比如MapReduce,支援非常友好。

7, OLAP實時計算支援。OLAP單次通路可能需要複雜的計算,比如千萬條記錄的實時計算,通路延遲要求相對較低,比如3~5秒。OLAP應用的磁盤讀取模式一般為順序掃描,通過分布式方法将資料分散到多機,計算時才能充分發揮多機的叢集效應。OLAP實時計算相當于一次線上的MapReduce,可以增加一些協調者節點,将實時計算任務發送到協調者,協調者将任務拆分成不同子表的子任務發送到對應的多台Bigtable Tablet Server。每台Bigtable Tablet Server完成計算後,協調者進行合并彙總,如排序,分組,運算,等等。

總之,通過劃分Entity Group,Megastore在單個Entity Group内部的操作能夠擷取RDBMS的優勢,同時又不會對Bigtable原有的性能,可擴充性,支援的操作有所影響。跨Entity Group的操作通過分布式系統中的方法支援,如Two-phase commit, global index,允許犧牲部分性能或者一緻性。Google的這種思路除了比較複雜,總體看來還是挺完美的。