谷歌分析存儲了大量統(tǒng)計數(shù)據(jù),包括來自世界各地的互聯(lián)網(wǎng)網(wǎng)站統(tǒng)計數(shù)據(jù)。檢索功能可以從如此巨量的數(shù)據(jù)中快速返回要求谷歌具備特殊的解決方案,必須要滿足在任何時候有更多數(shù)據(jù)需要存儲時能很容易地擴展。
在谷歌,任何時候都要能給基礎(chǔ)設(shè)施中添加任意數(shù)量的應(yīng)用,每個應(yīng)用都可能帶來極其繁重的負(fù)載。這類請求的資源很難被滿足,尤其是在有限時間內(nèi)要把必要的更新做完。
如果谷歌在單個服務(wù)器節(jié)點上使用經(jīng)典的關(guān)系型數(shù)據(jù)庫,那么每次容量達(dá)到極限,他們都需要升級硬件。考慮到待創(chuàng)建應(yīng)用程序和數(shù)據(jù)的量是被谷歌使用的,這類更新可能很有必要成為一項每天都做的日常工作。
負(fù)載也可以在多個服務(wù)器節(jié)點共享,但是一旦需要更多節(jié)點,系統(tǒng)會變得非常復(fù)雜而極其難以維護(hù)。
考慮到這些因素,標(biāo)準(zhǔn)的關(guān)系數(shù)據(jù)庫配置就不再是特別適合的選擇,因為對系統(tǒng)這么大規(guī)模的升級和維護(hù)太困難了。
尋找可擴展解決方案
為保證速度和可靠性,這種快速應(yīng)急升級的做法是不必要的。谷歌使用自己的數(shù)據(jù)存儲解決方案,叫做“BigTable”。與存儲在關(guān)系型表中的數(shù)據(jù)不同,數(shù)據(jù)是以多維排序映射存儲的。
這種類型的實現(xiàn)立足于廣為人知的一種存儲方式,就是“key-value”(鍵值)存儲方式。這種存儲方式可以提供一些性能優(yōu)勢,是擴展過程更容易。
關(guān)系型數(shù)據(jù)庫中的信息存儲 關(guān)系型數(shù)據(jù)庫在一個地方存儲每一條信息,通常稱為表中的列。對于關(guān)系型數(shù)據(jù)庫,保證數(shù)據(jù)規(guī)范化非常重要。這個過程可以確保在其它表或者列中沒有重復(fù)數(shù)據(jù)。
例如,客戶的名字總是應(yīng)該存儲在特定表的特定列中。如果客戶名字在數(shù)據(jù)庫的另一個表或另一列中出現(xiàn)了,那么它應(yīng)該刪除掉,應(yīng)該引用從原來的表和列中提取信息。
這種結(jié)構(gòu)的缺點是數(shù)據(jù)庫內(nèi)部會變得十分復(fù)雜。甚至相對簡單的查詢也會經(jīng)過許多路徑才能執(zhí)行,在運行時候必須找到所有這些路徑評估其運行時間才能知道如何做性能最優(yōu)。數(shù)據(jù)庫變得越復(fù)雜,運行時需要判斷查詢路徑就會需要越多的資源。
以key/Value(鍵值)形式存儲的信息 在key/Value鍵值形式的存儲結(jié)構(gòu)中,復(fù)制數(shù)據(jù)是可以接受的。主要思路是利用磁盤空間而不是其它硬件資源,磁盤空間相對容易獲取,成本效率更容易升級(尤其是在云環(huán)境中),其它硬件資源要提速代價更昂貴。
從簡化查詢方面考慮,數(shù)據(jù)復(fù)制是非常有益的,因為相關(guān)信息可以存儲在一起,避免查詢數(shù)據(jù)時需要經(jīng)過許多路徑。
與關(guān)系型數(shù)據(jù)庫使用表結(jié)構(gòu)不同,鍵值存儲方式使用域的概念。域是一個存放數(shù)據(jù)的存儲區(qū),它不需要預(yù)定義結(jié)構(gòu)。域內(nèi)的數(shù)據(jù)片段是通過“鍵”定義的,這些“鍵”可以有任意數(shù)量的屬性與它們相關(guān)聯(lián)。
屬性可以是簡單的字符串值,也可以是更復(fù)雜的結(jié)構(gòu),可以與流行編程語言中的數(shù)據(jù)類型相匹配。包括數(shù)組,對象,整數(shù),浮點數(shù),布爾型值,以及編程中的其它基本數(shù)據(jù)類型。
在鍵值存儲方式中,數(shù)據(jù)完整性和邏輯在應(yīng)用程序代碼中處理(需要使用一個或者多個API),而不是通過數(shù)據(jù)庫本身的結(jié)構(gòu)來處理。這樣一來,數(shù)據(jù)提取就變成了使用正確的編程邏輯的事,而不是依賴于數(shù)據(jù)庫優(yōu)化器基于需要訪問的關(guān)系從大量可能路徑中選擇查詢路徑。
獲得結(jié)果 谷歌需要存儲和提取許多應(yīng)用程序的大量數(shù)據(jù),包括谷歌分析、谷歌地圖、Gmail和熱門搜索的web索引數(shù)據(jù)。此外,在任何時候都要添加更多應(yīng)用和數(shù)據(jù)存儲,這個因素就使得BigTable的鍵值存儲成為可擴容性的理想方案。
BigTable是谷歌自己的定制解決方案,那么企業(yè)如何獲得類似性能和擴展性使其用戶獲得更好的體驗?zāi)?好消息是還有其它鍵值存儲方案可用,有的可以在云服務(wù)中作為服務(wù)運行。這類服務(wù)很容易擴展,因為在云環(huán)境中更多數(shù)據(jù)存儲很容易購買獲得。
鍵值存儲方案 有幾種鍵值存儲數(shù)據(jù)庫可供選擇。其中之一就是Mongo,它是以對象數(shù)據(jù)庫形式設(shè)計的,以JSON格式存儲信息。這種格式在web應(yīng)用中很理想,因為JSON數(shù)據(jù)很容易作為一種標(biāo)注格式在各種需要的應(yīng)用之間傳遞數(shù)據(jù)。
例如,Mongo是MEAN堆棧的一部分:Mongo,Express,AngularJS和NodeJS是程序員們開發(fā)應(yīng)用的一套流行搭配。每一部分都需要與其它部分發(fā)送交互數(shù)據(jù)。所有的一切,包括數(shù)據(jù)庫,都可以使用JSON格式,在各部分之間傳遞數(shù)據(jù)變得更加容易和規(guī)范統(tǒng)一。
如何使用Mongo Mongo可以在各種操作系統(tǒng)上安裝使用,包括Windows,Linux和OSX。這樣,數(shù)據(jù)庫的擴展就簡單了,只要在所安裝的服務(wù)器上添加存儲空間就行了。
另一種方案是在云環(huán)境中把Mongo用作服務(wù)。這樣便于擴展,任何時候都可以向服務(wù)同樣是發(fā)起請求要求必要的存儲空間。這樣一來,新的應(yīng)用和更多數(shù)據(jù)存儲需求就可以快速高效地處理了。
Morpheus就是這種服務(wù)中的出色候選者,它在云環(huán)境中提供Mongo服務(wù)高擴展性:
Morpheus的用戶可以有三個共享的節(jié)點,完整數(shù)據(jù)集,可以無縫提供MongoDB實例。
此外,所有服務(wù)都運行在高性能固態(tài)硬盤(SSD)基礎(chǔ)設(shè)施上,這是非常可靠的數(shù)據(jù)存儲介質(zhì)。使用Morpheus高擴展性數(shù)據(jù)庫即服務(wù)可以在任何時候保持運行狀態(tài)。