視覺中國潘凡談MongoDB應用實踐

受訪人 潘凡 採訪人 黃玲豔 發佈於 2011年8月25日   前端

概要
本次採訪中,來自視覺中國的技術總監兼架構師潘凡分享了視覺中國網站在技術選型中的一些經驗,根據網站業務需求及數據量,最終選擇MongoDB的過程,講述了網站從MySQL到MongoDB遷移經歷的過程,分享了MongoDB對於較大併發的處理方案,同時也強調進行數據備份的好處,介紹了備份的一些方法。潘凡在訪談中還分享了一些關於MongoDB的客戶端開發與使用的狀況,分享了MongoDB的一些性能和穩定性方面的經驗,也大概介紹了MongoDB文件系統的標準GridFS,最後也就視覺中國的MongoDB應用實踐中的一些經驗和教訓作了簡單分享。

我的簡介
潘凡,2000 年前曾前後供職於賽迪網和賽迪數據,從事電子商務相關研究工做。2001年起創業,致力於將互聯網應用架構引入傳統零售行業,構建了基於web服務的零售 商業應用,實現了PDA移動終端/POS/PC基於互聯網整合成功案例,前後在部分500強企業成功實施運行至今。在創業期間又和朋友一塊兒建立了視覺中國網站。目前供職於視覺中國網站,擔任技術總監和架構師,關注領域包括可伸縮的網站架構,NoSQL應用實踐以及後現代的Perl編程。

關於會議
QCon全球企業開發大會(QCon Enterprise Software Development Conference)是由C4Media媒體集團InfoQ網站主辦的全球頂級技術盛會,每一年在倫敦、舊金山、東京、北京召開。自2007年3月份在倫敦召開首次舉辦以來,已經有包括金融、電信、互聯網、航空航天等領域的近萬名架構師、項目經理、團隊領導者和高級開發人員參加過QCon大會。
您好,謝謝您做爲QCon的演講嘉賓爲觀衆帶來了精彩的演講,也謝謝您接受咱們的訪問。首先請您簡單地介紹一下本身,以及如今一些工做的情況?
你們好,我叫潘凡,我來自視覺中國網站,我如今在視覺中國主要從事一些網站的架構,還有一些底層數據技術方案的研究和管理工做。
您此次演講的主題是視覺中國MongoDB的應用實踐,針對這個主題我想問一下,視覺中國爲何會選擇MongoDB呢?
視覺中國選擇MongoDB其實是有一個過程,最初咱們是想選擇一個KV的方案。在選擇KV的過程當中,偶然發現MongoDB,而後就對MongoDB的特性作了一些研究,最後很是驚奇地發現,MongoDB的一些特性正好符合咱們的要求。由於咱們視覺中國網站自己不是一個大公司,是一箇中小規模的公司,網站的數據量不大不小。MongoDB它比較簡單、實用,運維方面也比較簡單。這樣會減輕咱們團隊的壓力,因此咱們最終選擇了MongoDB。
你是說主要是基於業務應用數據量不算特別大,又易維護這樣的一些特性?
對,由於MongoDB其實是一個文檔型數據庫,這種模式與普通傳統的好比關係型數據庫不同,與普通的基於簡單KV的這種數據庫也不太同樣,它正好處在中間,就是可以既有KV的靈活性,又有MySQL那些關係型數據庫大部分的操做,尤爲是針對互聯網的應用,我以爲在開發方面它提高了開發的效率。在使用MongoDB的過程當中咱們發現,你能夠基於你所使用的開發語言中最基本的一些內容,例如數據類型像數組、散列,基於這種形式去作一些查詢、更新,還有刪除的工做,而不用再去研究SQL優化這樣的東西。
根據我瞭解的資料,視覺中國以前採用的MySQL,在從MySQL到MongoDB的遷移過程當中,是怎樣的執行過程呢?
實際上咱們是分了好幾個階段,在初期是MySQL和MongoDB並行,可是這個時間不長,大概也就兩個月。以後就把它切到了MongoDB上,咱們是從一個小產品,一個叫原創網的小產品,把它作爲使用MongoDB生產環境的一個測試。三到六個月之後,咱們把剩餘的一些主要產品陸陸續續地切到了MongoDB上。實際上這個切換的過程持續了一年多,咱們經歷了MongoDB的版本從最先0.9版到最近的1.6版,固然如今新的1.8版本咱們尚未使用。
目前MongoDB客戶端的支持作得怎麼樣?
MongoDB最主要的官方客戶端,主要有這幾種比較好,Ruby的、PHP的,還有Perl的。最好的兩個,一個是Ruby的,一個PHP的。從它一開始出來,這兩個就作爲官方支持的客戶端,後來加入了一個Perl的。到如今,它的客戶端已經很豐富了。官方最近把.NET也加進來了,其餘的,咱們能想到那些經常使用的小語種,可能都會有,例如像Node.js都有客戶端。
好的,今天咱們的訪問就到這裏,謝謝你接受咱們的訪問,謝謝。
謝謝。
也就是說MongoDB它有很豐富的客戶端?適用大小各類語言?
對,在09年以前,它的客戶端相對來講少一點。可是在去年一年,它的各類客戶端出來的特別快,基本上現能夠說大多數的客戶端都有,並且都處於一種活躍的狀態。
其實MongoDB它客戶端方面作得是比較好的。除了客戶端這方面,MongoDB在性能方面的表現怎麼樣呢?
MongoDB的單機性能如今看其實不錯,穩定性也挺好。咱們本身在使用的時候,它對於資源的消耗小,CPU都佔的很小。通常像咱們本身的服務,MongoDB並非一個獨立服務器,每每和其餘一些應用服務器,或者是一些Web Server混在一塊兒,並且通常是一臺物理機器會放大概四到五個實例。數據量方面,由於如今是咱們本身控制它的數據量,在每個組裏,數據量大概是六七百萬到七八千萬。
在性能這方面,大家有一些實測數據嗎?
如今咱們天天繁忙的時候,天天大概一萬到兩萬QBS,這是很常見的,再高一點,實際上幾十萬也作過,可是那個數據是比較有限的。如今在生產上,可能由於前端也作了一些限制,相對原先咱們本身的MySQL來講,吞吐量有一點提高。
MongoDB有一個特色,就是處理較大的併發,它是怎麼去作的?在運行的穩定性方面表現得怎麼樣?
其實它所謂處理較大併發,可能一方面它是去掉了原先咱們發現數據庫的好比不少事務和一些限制;另外它鎖的使用概率相對小一點。在穩定性上,說實在的,MongoDB自身的穩定性,從單機來看還不是過高。它的穩定性是經過集羣,經過這種主從,或是如今叫ReplicaSet的這種模式來保證的。1.8版之後,增長了一個寫文件,可以提升單機的可靠性。可是可能這點上作得比MySQL要弱一些。
其實它相對來講一種是用備份的方式,另一種是用預讀後寫的方式?
對,可是由於這種預讀剛剛實現,或多或少還會有一些問題,好比剛發佈的時候,它修復了Memory use在預寫的時候索引不正常。因此可能對於單機問題,MongoDB的確有這樣的弱點,如今它是一個弱點,但我相信在2.0之後,可能這部分就不會是一個大問題了。
MongoDB在文件系統方面使用的是GridFS嗎?
不是,GridFS其實只是它的一個標準。
是它的一個標準?
由於MongoDB中是使用GridFS來作存儲的,它有一部分限制,就是單個文檔不能超過4兆,在1.8版之後把這個限制擴展到8兆。這樣的話,若是咱們但願在數據庫中存比較大的文件,好比,它不像傳統關係數據庫中一個BLOG相似的字段,它只能使用GridFS這個標準了。它的本質是把大於4兆的數據給你切成一片一片的,分紅了兩個collection把它插進去。可是這個通常是怎麼實現的呢,其實服務端並不實現,而是經過你的驅動,也就是客戶端去實現。
客戶端,對嗎?
對。
它是一個文件存儲的、處理數據的方式,是這樣的嗎?
只能說它是可以存儲超過4兆大小文件的一個處理方法。只不過派生出來講,存儲通常的文件也是沒有問題的,就是中小規模的文件。
MongoDB在視覺中國已經使用一段時間了,在MongoDB使用和開發的過程當中,你有什麼經驗和教訓能夠和你們分享呢?
教訓挺多的。經驗嗎,其實我剛纔PPT中也講了一些,咱們認爲可能比較嚴重的教訓有一點,就是說MongoDB自己它還算比較年輕的一個產品,因此它的問題,就是成熟度確定沒有傳統MySQL那麼成熟穩定。因此在使用的時候,第一,儘可能使用穩定版,不要在線上使用開發版,這是一個大原則;另一點,備份很重要,MongoDB若是出現一些異常狀況,備份必定是要能跟上。除了經過傳統的複製的方式來作備份,離線備份也仍是要有,無論你是用什麼方式,都要有一個完整的離線備份。每每最後出現了特殊狀況,它能幫助到你;另外,MongoDB性能的一個關鍵點就是索引,索引是否是能有比較好的使用效率,索引是否是可以放在內存中,這樣可以提高隨機讀寫的性能。若是你的索引不能徹底放在內存中,一旦出現隨機讀寫比較高的時候,它就會頻繁地進行磁盤交換,這個時候,MongoDB的性能就會急劇降低,會出現波動。另外,MongoDB還有一個最大的缺點,就是它佔用的空間很大,由於它屬於典型空間換時間原則的類型。那麼它的磁盤空間比普通數據庫會浪費一些,並且到目前爲止它尚未實如今線壓縮功能,在MongoDB中頻繁的進行數據增刪改時,若是記錄變了,例如數據大小發生了變化,這時候容易產生一些數據碎片,出現碎片引起的結果,一個是索引會出現性能問題,另一個就是在必定的時間後,所佔空間會莫明其妙地增大,因此要按期把數據庫作修復,按期從新作索引,這樣會提高MongoDB的穩定性和效率。在最新的版本里,它已經在實如今線壓縮,估計應該在2.0版左右,應該可以實如今線壓縮,能夠在後臺執行如今repair DataBase的一些操做。若是那樣,就解決了目前困擾咱們的大問題。
根據你的說明,其實在視覺中國使用MongoDB的過程當中,仍是在性能和一些開發版與正式版的版本方面是有一些經驗教訓的。
對,很是多,由於MongoDB畢竟是比較新的東西,並且在咱們剛開始使用的時候,相關的資源比較少,資料不齊全,包括MongoDB的手冊也不是很齊全,不少時候問題解決不了,你只能經過閱讀它的源碼來找問題。如今可能不會那麼複雜了,各類各樣的應用案例,各類各樣的分享PPT都有,並且它自身的一些文檔,包括中文版如今也有不少人在翻譯,書籍也出了兩本,因此我以爲如今來講,MongoDB的學習過程會更簡單一點。
相關文章
相關標籤/搜索