NoSQL數(shù)據(jù)庫漸入佳境 國內(nèi)應用案例盤點
隨著互聯(lián)網(wǎng)的不斷發(fā)展,各種類型的應用層出不窮,所以導致在這個云計算的時代,對技術提出了更多的需求。雖然關系型數(shù)據(jù)庫已經(jīng)在業(yè)界的數(shù)據(jù)存儲方面占據(jù)不可動搖的地位,但是由于其天生的幾個限制,使其很難滿足上面這幾個需求:擴展困難、讀寫慢、成本高、有限的支撐容量。業(yè)界為了解決上面提到的幾個需求,推出了新類型的 “NoSQL”數(shù)據(jù)庫??偟膩碚f,在設計上,它們非常關注對數(shù)據(jù)高并發(fā)地讀寫和對海量數(shù)據(jù)的存儲等,與關系型數(shù)據(jù)庫相比,它們在架構(gòu)和數(shù)據(jù)模型方量面做了”減法”,而在擴展和并發(fā)等方面做了”加法”。
現(xiàn)今的計算機體系結(jié)構(gòu)在數(shù)據(jù)存儲方面要求具備龐大的水平擴展性,而NoSQL致力于改變這一現(xiàn)狀。目前Google、Yahoo、Facebook、Twitter、Amazon都在大量應用NoSQL型數(shù)據(jù)庫。本文以NoSQL在國內(nèi)知名的互聯(lián)網(wǎng)公司應用為案例,為大家細數(shù)國內(nèi)NoSQL數(shù)據(jù)庫的應用情況。
一、新浪微博
大家都知道,在美國有一個非常有名的信息分享平臺叫做Twitter,而在中國,我們也有同樣的方式,就是現(xiàn)在非常流行的新浪微博,它還有個非常溫馨的名字,叫做圍脖。
▲新浪微博
新浪微博從技術上來說,每天用戶發(fā)表特別容易,這造成每天新增的數(shù)據(jù)量都是百萬級的、上千萬級的這樣一個量。這樣你經(jīng)常要面對的一個問題就是增加服務器,因為一般一臺MySQL服務器,它可能支撐的規(guī)模也就是幾千萬,或者說復雜一點只有幾百萬,這樣,你可能每天都要增加服務器,從而解決所你面對的這些問題。
目前新浪微博是Redis全球最大的用戶,在新浪有200多臺物理機,400多個端口正在運行著Redis, 有+4G的數(shù)據(jù)跑在Redis上來為微博用戶提供服務。
在新浪NoSQL和MySQL在大多數(shù)情況下是結(jié)合使用的,根據(jù)應用的特點選擇合適存儲方式。譬如:關系型數(shù)據(jù),例如:索引使用MySQL存儲,非關系數(shù)據(jù)庫,例如:一些K/V需求的,對并發(fā)要求比較高的放入Redis存儲。
Redis通過修改源碼滿足自己的業(yè)務需求:完善它的replication機制,加入position的概念,讓維護更容易,同時failover能力也大大增強。改善Hashset在rdb里面的存儲方式,提升復雜數(shù)據(jù)類型的加載速度。
二、淘寶數(shù)據(jù)平臺
淘寶網(wǎng)擁有國內(nèi)最具商業(yè)價值的海量數(shù)據(jù)。截至當前,每天有超過30億的店鋪、商品瀏覽記錄,10億在線商品數(shù),上千萬的成交、收藏和評價數(shù)據(jù)。如何從這些數(shù)據(jù)中挖掘出真正的商業(yè)價值,進而幫助淘寶、商家進行企業(yè)的數(shù)據(jù)化運營,幫助消費者進行理性的購物決策,是淘寶數(shù)據(jù)平臺與產(chǎn)品部的使命。
▲淘寶數(shù)據(jù)平臺
數(shù)據(jù)產(chǎn)品的一個最大特點是數(shù)據(jù)的非實時寫入,正因為如此,可以認為在一定的時間段內(nèi),整個系統(tǒng)的數(shù)據(jù)是只讀的。這為設計緩存奠定了非常重要的基礎。一些對實效性要求很高的數(shù)據(jù),例如針對搜索詞的統(tǒng)計數(shù)據(jù),希望能盡快推送到數(shù)據(jù)產(chǎn)品前端,所以在內(nèi)存中做實時計算,并把計算結(jié)果在盡可能短的時間內(nèi)刷新到 NoSQL存儲設備中,供前端產(chǎn)品調(diào)用。
淘寶Oceanbase的設計之初,是這樣的。公司通過對淘寶的在線存儲需求進行分析發(fā)現(xiàn):
淘寶的數(shù)據(jù)總量比較大,未來一段時間,比如五年之內(nèi)的數(shù)據(jù)規(guī)模為百TB級別,千億條記錄,另外,數(shù)據(jù)膨脹很快,傳統(tǒng)的分庫分表對業(yè)務造成很大的壓力,必須設計自動化的分布式系統(tǒng)。所以有了淘寶Oceanbase,它以一種很簡單的方式滿足了未來一段時間的在線存儲需求,并且還獲得了一些其它特性,如高效支持跨行跨表事務,這對于淘寶的業(yè)務是非常重要的。
淘寶Tair是由淘寶自主開發(fā)的Key/Value結(jié)構(gòu)數(shù)據(jù)存儲系統(tǒng),并且于 2010年6月30號在淘寶開源平臺上正式對外開源,在淘寶網(wǎng)有著大規(guī)模的應用。用戶在登錄淘寶、查看商品詳情頁面或者在淘江湖和好友“搗漿糊”的時候,都在直接或間接地和Tair交互。淘寶將Tair開源,希望有更多的用戶能從我們開發(fā)的產(chǎn)品中受益,更希望依托社區(qū)的力量,使Tair有更廣闊的發(fā)展空間。
三、視覺中國網(wǎng)站
在視覺中國成立之初,他們選用的數(shù)據(jù)庫是MySQL,09年之后他們才選用了MongoDB作為系統(tǒng)的支撐數(shù)據(jù)庫。
▲視覺中國
采用MongoDB的最初階段困難是肯定有的,而且還有很多。困難的來源一方面來源于MongoDB的年輕。雖說它的發(fā)展很快,但是畢竟是年輕的產(chǎn)品,技術不是特別的成熟,所以會出現(xiàn)很多很多的問題。但是MongoDB有一個好的技術團隊,對產(chǎn)品的版本更新速度很快,對問題的響應速度很快,這對解決問題是很大的支撐。一方面是技術,遇到困難,解決困難,在這個過程中,也得到了很多經(jīng)驗,為后續(xù)的工作做了很好的準備;
視覺中國的數(shù)據(jù)量是有限的,只能到千萬級別,所以將數(shù)據(jù)進行分組,大概分為四組,每組的平均數(shù)據(jù)量大概是幾百萬到幾千萬。但是,根據(jù)國外的案例來看,數(shù)據(jù)量已經(jīng)達到十億、百億的級別,MongoDB的使用基本沒有出現(xiàn)過太大的問題。如果現(xiàn)在不通過auto-sharding,自己手動切片,也是很不錯的。
無論選用哪種數(shù)據(jù)庫,都要根據(jù)公司的情況來判斷,畢竟這種轉(zhuǎn)移是十分耗費成本的。SQL+NoSQL的方法,十分值得關注。另外優(yōu)化是十分重要的,但是優(yōu)化是有技巧的,萬不可胡亂優(yōu)化。
#p#
四、優(yōu)酷運營數(shù)據(jù)分析
優(yōu)酷作為一家大型視頻網(wǎng)站,擁有海量播放流暢的視頻。它秉承注重用戶體驗這一產(chǎn)品技術理念,將絕大部分存儲用在視頻資源上。通過建設專用的視頻CDN,建立了可自由擴展、性能優(yōu)異的架構(gòu),在提供更好用戶體驗的同時優(yōu)化了存儲資源。在除視頻資源外的其他方面,優(yōu)酷也累積了海量數(shù)據(jù):僅運營數(shù)據(jù),每天收集到的網(wǎng)站各類訪問日志總量已經(jīng)達到TB級,經(jīng)分析及壓縮處理后留存下來的歷史運營數(shù)據(jù)已達數(shù)百TB,很快將會達到 PB級,5年后數(shù)據(jù)量將會達到幾十PB級。
▲優(yōu)酷
目前優(yōu)酷的在線評論業(yè)務已部分遷移到MongoDB,運營數(shù)據(jù)分析及挖掘處理目前在使用Hadoop/HBase;在Key-Value產(chǎn)品方面,它也在尋找更優(yōu)的 Memcached替代品,如Redis,相對于Memcached,除了對Value的存儲支持三種不同的數(shù)據(jù)結(jié)構(gòu)外,同一個Key的Value進行部分更新也會更適合一些對Value頻繁修改的在線業(yè)務;同時在搜索產(chǎn)品中應用了Tokyo Tyrant;對于Cassandra等產(chǎn)品也進行過研究。
對于優(yōu)酷來說,仍處于飛速發(fā)展階段,已經(jīng)在考慮未來自建數(shù)據(jù)中心,提高數(shù)據(jù)處理能力,從網(wǎng)站的運營中發(fā)掘出更多信息,為用戶提供更好的視頻服務。
五、飛信空間
飛信的SNS平臺數(shù)據(jù)量大,增長快,目前的狀態(tài)如下:
▲飛信空間
- 日活躍用戶100W,平均主動行為1.3次
- 平均好友20個
- 平均每條動態(tài)存儲數(shù)據(jù)量1.5K
- 數(shù)據(jù)容量 2600W*1.5KB=40GB
- 以關系型數(shù)據(jù)庫估計,占用存儲這僮100GB左右
SNS類型應用中,F(xiàn)eed的數(shù)據(jù)量最大,F(xiàn)eed數(shù)據(jù)的存儲與讀寫操作往往是技術難度最高的部分,由于Feed要求的高并發(fā)寫入,弱一致性,使HandlerSocket成為NoSQL技術的主要應用戰(zhàn)場。
HandlerSocket還幫飛信解決了緩存的問題,因為Innodb已經(jīng)有了成熟的解決方案,通過參數(shù)可以配置用于緩存數(shù)據(jù)的內(nèi)存大小,這樣只要分配合理的參數(shù),就能在應用程序無需干涉的情況下實現(xiàn)熱點數(shù)據(jù)的緩存,降低緩存維護的開發(fā)成本。
HandlerSocket是日本DeNA公司的架構(gòu)師Yoshinori開發(fā)的一個NoSQL產(chǎn)品,以MySQL Plugin的形式運行。其主要的思路是在MySQL的體系架構(gòu)中繞開SQL解析這層,使得應用程序直接和Innodb存儲引擎交互,通過合并寫入、協(xié)議簡單等手段提高了數(shù)據(jù)訪問的性能,在CPU密集型的應用中這一優(yōu)勢尤其明顯。
因為HandlerSocket是MySQL的一個 Plugin,集成在mysqld進程中,對于NoSQL無法實現(xiàn)的復雜查詢等操作,仍然可以使用MySQL自身的關系型數(shù)據(jù)庫功能來實現(xiàn)。在運維層面,原來廣泛使用的MySQL主從復制等經(jīng)驗可以繼續(xù)發(fā)揮作用,相比其他或多或少存在一些bug的NoSQL產(chǎn)品,數(shù)據(jù)安全性更有保障。
六、豆瓣社區(qū)
BeansDB 是一個由國內(nèi)知名網(wǎng)站豆瓣網(wǎng)自主開發(fā)的主要針對大數(shù)據(jù)量、高可用性的分布式KeyValue存儲系統(tǒng),采用HashTree和簡化的版本號來快速同步保證最終一致性(弱),一個簡化版的Dynamo,它在伸縮性和高可用性方面有非常好的表現(xiàn)。
▲豆瓣社區(qū)
它采用類似memcached的去中心化結(jié)構(gòu),在客戶端實現(xiàn)數(shù)據(jù)路由。目前只提供了Python版本的客戶端,其它語言的客戶端可以由memcached的客戶端稍加改造得到。
它具有如下特性:
- 高可用:通過多個可讀寫的用于備份實現(xiàn)高可用
- 最終一致性:通過哈希樹實現(xiàn)快速完整數(shù)據(jù)同步(短時間內(nèi)數(shù)據(jù)可能不一致)
- 容易擴展:可以在不中斷服務的情況下進行容量擴展。
- 高性能:異步網(wǎng)絡IO, 日志結(jié)構(gòu)的存儲方式Bitcask.
- 簡單協(xié)議:Memcache兼容協(xié)議,大量可用客戶端
目前,BeansDB在豆瓣主要部署了兩個集群:一個集群用于存儲數(shù)據(jù)庫中的大文本數(shù)據(jù),比如日記、帖子一類;另外一個豆瓣FS集群,主要用于存儲媒體文件,比如用戶上傳的圖片、豆瓣電臺上的音樂等。
BeansDB采用Key-Value存儲架構(gòu),其最大的特點是具有高度的可伸縮性;在BeansDB的架構(gòu)下,在大數(shù)據(jù)量下,擴展數(shù)據(jù)節(jié)點將輕而易舉,只需要添加硬件,安裝軟件,修改相應的配置文件即可。
BeansDB在可用性方面也有很大的優(yōu)勢,任何一個節(jié)點宕機都不會受到影響,數(shù)據(jù)是自動伸縮冗余的。在運維方面也很簡單,基本上沒有什么用戶數(shù)據(jù)的冗余殘余,所有數(shù)據(jù)通過一個同步腳本可以快速同步。
總結(jié)
綜合來看,NoSQL數(shù)據(jù)庫正在逐漸地成為數(shù)據(jù)庫領域中不可或缺的一部分,它彌補了關系型數(shù)據(jù)庫在某些應用場景的不足,但是它也并非萬能,方法得當?shù)脑挘塬@得很多的好處。企業(yè)應該謹慎行事,要充分地認識到這些數(shù)據(jù)庫的一些限制和問題。按照毛爺爺?shù)脑捴v就是:前途是光明的,道路是曲折的。
【編輯推薦】
- 八種主流NoSQL數(shù)據(jù)庫系統(tǒng)對比
- 為什么說很多NoSQL的Benchmark是扯淡?
- NoSQL在企業(yè)中的發(fā)展歷程
- 解讀NoSQL數(shù)據(jù)庫的四大家族