對于學習NoSQL的人來說,Google的BigTable的論文是必不可少要閱讀的。在NoSQL領域,BigTable算是比較早的也是比較成熟的運用在應用上的産品。Google這麼多年的穩定性能足以說明BigTable的優秀。于是最近我也看了BigTable的論文和網上一些關于BigTable的文章,對BigTable有了初步的了解。
1.簡單說說BigTable
BigTable是Google提出的一個分布式的海量資料存儲系統。Google将其運用在一些資料量較大的應用中。衆所周知,對于一個大型的具有海量PV和海量資料的系統來說,其分布式服務是可以通過簡單的增加節點進行擴充,但是底層的海量資料則因其單點和需要保持一緻性等特點,成為一些大型系統的瓶頸。Google的BigTable就是底層海量資料的一個很好解決方案。從CAP理論來看的話,BigTable的思想是通過在一定程度上放棄底層資料的高可用性,主要加強的資料一緻性和可擴充性。
2.BigTable的作用
每一個系統的設計都是為了實作一個問題的解決方案。那麼BigTable的作用是什麼,是為了解決什麼問題的呢?BigTable的設計是為了對海量的資料進行快速存取,相對與普通的資料庫而言,BigTable更加注重的是高效的存取性能,而不需要複雜的SQL邏輯。BigTable中無論是資料采用key-value的形式來進行存儲,還是采用B+樹的資料結構都是為了實作一個高性能的存取為目标的。BigTable用于海量資料,就比如google搜尋引擎,google地圖這樣的操作相對簡單的海量資料。而對于一些經常要改變的非海量資料,則使用傳統的SQL資料比較合适。
3.BigTable的實作
BigTable将資料存在一個三維有序的表中,這個表除了傳統二維表的row,column以外還增加了第三維TimeStamp,用來表示版本。這樣rowid,colume family和timestamp就構成了一個三維有序的大表,資料就存儲在這張大表中(當然這裡的3維存儲的格式和傳統的資料庫有一些不同)。
從上層來看的話,一個資料表就是一個三維有序的表的樣子,而在底層來說,這個大表的實作方式則比較巧妙。每個大表被切分成若幹個部分稱為tablet,各個tablet分布在各個不同的tablet伺服器上,這些tablet伺服器都包含了緩存,日志和持久存儲(這裡的持久存儲是将資料存儲到GFS(Google File System)上去)。在每個伺服器上緩存,日志和持久存儲互相協作,最大程度的保證了資料的存取性能和安全性能。tablet伺服器之間的負載均衡是通過合并與切分tablet來動态實作的,保證了伺服器的高效利用。
當然為了提高性能和提高安全性,BigTable有一些其他機制。除了Tablet伺服器以外還有Root伺服器和Meta伺服器,從Root伺服器到Meta伺服器再到Tablet伺服器使用了B+樹的資料結構,使得PV性能提高。在Tablet伺服器之間存在一個Mater伺服器用于統籌管理所有伺服器的狀态。BigTable還與Chubby緊密聯系,添加了BigTable的安全性能。
4.關于BigTable用戶端
對于使用BigTable的人來說,需要有一個BigTable的用戶端來對BigTable進行調用,通過調用用戶端的API來進行操作。BigTable叢集中有一個Master伺服器用來管理所有的tablet伺服器,但是用戶端幾乎不和Master打交道,用戶端存取資料的時候是通過Root-Meta-Tablet伺服器的順序找到相應的tablet,進而直接與tablet進行互動,并且将該tablet的位置緩存在用戶端本地,後面則可以跳過Root-Meta伺服器直接與tablet伺服器互動。
5.BigTable和Google File System(GFS),MapReduce等
BigTable的設計者是SanjayGhemawat,他是Google公司在分布式系統方面很有成就的一個專家,他設計出了Google的這一套産品,包括GFS,MapReduced等等,這就導緻了這一套産品之間是有着很大聯系的,BigTable的設計很大程式上受到了其他幾個産品的影響。BigTable的底層資料存儲是建立在GFS之上的,其分布式的特點和GFS有着極其重大的聯系。對于BigTable來說,如果要提高系統的PV性能的話需要擴充其tablet伺服器,以減少每個tablet伺服器的負載,而要提高系統存儲性能的話需要擴充其底層的GFS伺服器,擴充其資料的規模。這樣将PV的擴充和資料量的擴充分離,使得整個系統更便于管理。另一方面,BigTable與MapReduce可以無縫的連接配接,不需要将資料從BigTable系統中取出來跑在獨立的MapReduce的機器上進行MapReduce的job,可以直接在BigTable的伺服器上進行MapReduce的計算。
以下是BigTable和Google其他産品的一些聯系:
§GFS. Bigtable uses theGoogle FileSystemto store data and log files. Regular StorageMojo.com readers knowGFS imparts all kinds of performance and availability advantages without costlyRAID arrays.
§Cluster management. Google has aclustermanagement systemwhich so far seems publicly undocumented (maybethey’re embarrassed) that schedules, monitors and manages the Bigtable’scluster.
§SSTable. This is the underlying fileformat used to store Bigtable data. SSTables are designed so that a data accessrequires, at most, a single disk access. An SSTable, once created, is neverchanged. If new data is added, a new SSTable is created. Once an old SSTable isno longer needed, it is set out for garbage collection. SSTable immutability isat the core of Bigtable’s data checkpointing and recovery routines.
§Chubby. Cute name, huh? Chubby is thedistributed lock server that allows a multi-thousand node Bigtable cluster tostay coordinated. Chubby itself is a cluster app that maintains five activereplicas, one of which is the master. Like GFS’s master node, Chubby isarchitected to keep lock management traffic very light. Chubby also rules overtablet server life and death, stores access control lists, data schemas and thebootstrap location of Bigtable data.
6.關于BigTable的資料持久化
BigTable的資料存儲持久化在GFS上,在每個tablet伺服器上都有緩存,當緩存的資料達到一定的條件的時候即将資料以SSTable的形式持久化到GFS上去,在持久化的時候可以選擇使用哪種方式進行壓縮以提高壓縮率。在GFS上的資料通常會有3個備份,這樣就保證的資料的可用性。雖然說GFS是有3個備份,具有高可用性,為什麼還說BigTable的資料是單點的,可用性不高呢?因為BigTable的資料存取入口是在tablet伺服器上的,每個資料隻可能存在于一個tablet伺服器上,這就是所謂的單點,而一旦這個唯一的伺服器挂了以後,在一段時間内這個資料就是無法通路的,這就限制了其高可用性。
7.來看看BigTable的運作情況
The tabletservers were configured to use 1 GB of memory and to write to a GFS cellconsisting of 1786 machines with two 400 GB IDE hard drives each. . . . Each[client]machine had two dual-core Opteron 2 GHz chips, enough physical memoryto hold the working set of all running processes, and a single gigabit Ethernetlink. The machines were arranged in a two-level tree-shaped switched networkwith approximately 100-200 Gbps of aggregate bandwidth available at the root.All of the machines were in the same hosting facility and therefore theround-trip time between any pair of machines was less than a millisecond.
8.關于機器的利用
下面是伺服器的一份配置
The tabletservers and master, test clients, and GFS servers all ran on the same set ofmachines. Every machine ran a GFS server. Some of the machines also ran eithera tablet server, or a client process, or processes from other jobs that wereusing the pool at the same time as these experiments.
可見在一台機器上可以同時運作GFS伺服器和BigTable伺服器,而且還可以運作一些程序。其實,對于機器的利用,需要的是不同種類程序之間的互補,像GFS這樣的伺服器,比較多的消耗的是磁盤I/O,而對于CPU和記憶體來說則有很多空閑,BigTable主要消耗記憶體和磁盤I/O,用戶端程序則主要消耗CPU,這樣将幾個進行互補,則可以充分的利用機器,使其最大程度的為我們服務。
9.BigTable的啟示
(1)打破舊框框。對于計算機領域來說,沒有什麼是真理,一切都是人為創造出來的,而我們所學習所使用的東西隻是在一段時間内能夠适應需求而已,再過一段時間,或許他們都會被淘汰,而這其中也必然包括了這篇文章提高的BigTable。對于傳統資料庫不能有效的提供海量資料的存儲,Google提出了BigTable的NoSQL方案是一種颠覆性的創造,打破了原有的資料庫舊框框,實作了一種可以适應需求的新的系統。這是我們需要學習和提倡的。當然,敢于創造新的事物也是需要付出相當大的努力的,你無法想象BigTable背後有多少辛酸苦辣。
(2)簡單即使美。從整體來說BigTable的整體結構是簡單的,而簡單的方法往往也是最有效的方法。聽淘寶的放翁前輩說過,很多設計出來的系統起初很簡單,但是為了解決存在的問題使得系統越來越複雜,而結果往往是引入了更多的問題,這樣一個複雜的系統就是由于人為的創造問題而産生的。而簡單,不僅僅是一種美,更多的是一種睿智和優雅的展現。
參考文獻:
http://labs.google.com/papers/bigtable-osdi06.pdf
http://storagemojo.com/2006/09/07/googles-bigtable-distributed-storage-system-pt-i/
http://storagemojo.com/2006/09/08/google%E2%80%99s-bigtable-distributed-storage-system-pt-ii/