1.2 為什么選擇Key-Value Store 大量的互聯(lián)網(wǎng)用戶選擇Key-Value Store的原因具體是什么呢? 主要分為下面的2個(gè)主要原因: 1.2.1 大規(guī)模的互聯(lián)網(wǎng)應(yīng)用 對(duì)于google,ebay這樣的互聯(lián)網(wǎng)企業(yè),每時(shí)每刻都有無數(shù)的用戶在使用它們提供的互聯(lián)網(wǎng)服務(wù),這些服務(wù)帶來的就是大量的數(shù)據(jù)吞吐量,在同一時(shí)間,會(huì)并發(fā)的有成千上萬的連接對(duì)數(shù)據(jù)庫進(jìn)行操作。在這種情況下,單臺(tái)服務(wù)器或者幾臺(tái)服務(wù)器遠(yuǎn)遠(yuǎn)不能滿足這些數(shù)據(jù)處理的需求,簡(jiǎn)單的升級(jí)服務(wù)器性能這樣的scale up的方式也不行,所以唯一可以采用的辦法就是scale out了。scale out的方法有很多種,但大致分為兩類:一類仍然采用RDBMS,然后通過對(duì)數(shù)據(jù)庫的垂直和水平切割將整個(gè)數(shù)據(jù)庫部署到一個(gè)集群上,這種方法的優(yōu)點(diǎn)在于可以采用RDBMS這種熟悉的技術(shù),但缺點(diǎn)在于它是針對(duì)特定應(yīng)用的,就是說,由于應(yīng)用的不同,切割的方法是不一樣的。 還有一類就是google所采用的方法,拋棄RDBMS,采用key-value形式的存儲(chǔ),這樣可 以極大的增強(qiáng)系統(tǒng)的可擴(kuò)展性(scalability),如果要處理的數(shù)據(jù)持續(xù)增大,多加機(jī)器就 可以了。事實(shí)上,key-value的存儲(chǔ)就是由于BigTable等相關(guān)論文的發(fā)表慢慢進(jìn)入人們的 視野的。 1.2.2 云存儲(chǔ) 如果說上一個(gè)問題還有可以替代的解決方案(切割數(shù)據(jù)庫)的話,那么對(duì)于云存儲(chǔ)來說,也許key-value的store就是唯一的解決方案了。云存儲(chǔ)簡(jiǎn)單點(diǎn)說就是構(gòu)建一個(gè)大型的存儲(chǔ)平臺(tái)給別人用,這也就意味著在這上面運(yùn)行的應(yīng)用其實(shí)是不可控的。如果其中某個(gè)客戶的應(yīng)用隨著用戶的增長而不斷增長時(shí),云存儲(chǔ)供應(yīng)商是沒有辦法通過數(shù)據(jù)庫的切割來達(dá)到scale的,因?yàn)檫@個(gè)數(shù)據(jù)是客戶的,供應(yīng)商不了解這個(gè)數(shù)據(jù)自然就沒法作出切割。在這種情況下,key-value的store就是唯一的選擇了,因?yàn)檫@種條件下的scalability必須是自動(dòng)完成的,不能有人工干預(yù)。這也是為什么幾乎所有的現(xiàn)有的云存儲(chǔ)都是key-value形式的,例如Amazon的smipleDB,底層實(shí)現(xiàn)就是key-value,還有google的 GoogleAppEngine,采用的是BigTable的存儲(chǔ)形式。也許唯一可能例外的是MS的解決方案,我在Qcon大會(huì)上聽說MS的Azure平臺(tái)的下一個(gè)版本中就會(huì)推出基于RDBMS的云存儲(chǔ),盡管我本人仍然對(duì)此保持懷疑。 Key-Value Store最大的特點(diǎn)就是它的可擴(kuò)展性,這也就是它最大的優(yōu)勢(shì)。所謂的可擴(kuò)展性,在我看來這里包括了兩方面內(nèi)容。一方面,是指Key-Value Store可以支持極大的數(shù)據(jù)的存儲(chǔ),它的分布式的架構(gòu)決定了只要有更多的機(jī)器,就能夠保證存儲(chǔ)更多的數(shù)據(jù)。另一方面,是指它可以支持?jǐn)?shù)量很多的并發(fā)的查詢。對(duì)于RDBMS,一般幾百個(gè)并發(fā)的查詢就可以讓它很吃力了,而一個(gè)Key-Value Store,可以很輕松的支持上千的并發(fā)查詢。下面而簡(jiǎn)單的羅列了一些特點(diǎn): l Key-value store:一個(gè) key-value 數(shù)據(jù)存儲(chǔ)系統(tǒng),只支持一些基本操作,如:SET(key, value) 和 GET(key) 等; l 分布式:多臺(tái)機(jī)器(nodes)同時(shí)存儲(chǔ)數(shù)據(jù)和狀態(tài),彼此交換消息來保持?jǐn)?shù)據(jù)一致,可視為一個(gè)完整的存儲(chǔ)系統(tǒng)。 l 數(shù)據(jù)一致:所有機(jī)器上的數(shù)據(jù)都是同步更新的、不用擔(dān)心得到不一致的結(jié)果; l 冗余:所有機(jī)器(nodes)保存相同的數(shù)據(jù),整個(gè)系統(tǒng)的存儲(chǔ)能力取決于單臺(tái)機(jī)器(node)的能力; l 容錯(cuò):如果有少數(shù) nodes 出錯(cuò),比如重啟、當(dāng)機(jī)、斷網(wǎng)、網(wǎng)絡(luò)丟包等各種 fault/fail 都不影響整個(gè)系統(tǒng)的運(yùn)行; l 高可靠性:容錯(cuò)、冗余等保證了數(shù)據(jù)庫系統(tǒng)的可靠性。 1.2.3 Redis實(shí)際應(yīng)用案例 目前全球最大的Redis用戶是新浪微博,在新浪有200多臺(tái)物理機(jī),400多個(gè)端口正在運(yùn)行著Redis, 有+4G的數(shù)據(jù)跑在Redis上來為微博用戶提供服務(wù)。 在新浪微博Redis的部署場(chǎng)景很多,大概分為如下的2種: 第一種是應(yīng)用程序直接訪問Redis數(shù)據(jù)庫 第二種是應(yīng)用程序直接訪問Redis,只有當(dāng)Redis訪問失敗時(shí)才訪問MySQL 同時(shí),Digg的一項(xiàng)新功能,添加了對(duì)文章瀏覽數(shù)的顯示,這一功能的一大賣點(diǎn)是其實(shí)時(shí)性。而支持此實(shí)時(shí)瀏覽量計(jì)數(shù)的,正是Redis。
|