MongoDB筆記

張包峰發表於2012-07-17

 轉載請註明出處:http://blog.csdn.net/zbf8441372

MongoDB是現今最火的NoSQL之一,暑假終於有時間把《MongoDB權威指南》和NoSQL Fan上關於它的一些文章瀏覽了一些,下面我簡單總結幾點MongoDB吸引人的地方。關於MongoDB的基本操作,運維,使用,大家可以自己去看書或者學習資料。

 

1. 較之別的NoSQL

《MongoDB: The Definition Guide》一書中說,“要是不能用的話,再牛的技術也是空談,MongoDB致力於容易上手、便於使用”。前段時間,阿里的一位搞HBase的師兄,春輝,花了兩個多小時,深入淺出講解了HBase的一些東西,感觸很深。相比於HBase這樣一個基於HDFS的Big Data的實現,它的架構和層次更復雜。而對於Facebook一手捧紅而今又不再維護了的Cassandra,難免讓人覺得不太promising了。

MongoDB的社群還是相當活躍的。MongoDB是一個面向文件的資料庫,目前由10gen開發並維護,它的功能豐富,齊全。

MongoDB使用JSON的變種BSON作為內部儲存的格式和語法。針對MongoDB的操作都使用JSON風格語法,客戶端提交或接收的資料都使用JSON形式來展現。相對於SQL來說,更加直觀,容易理解和掌握。

Schema-less,支援嵌入子文件:MongoDB是一個Schema-free的文件資料庫。一個資料庫可以有多個Collection,每個 Collection是Documents的集合。Collection和Document和傳統資料庫的Table和Row並不對等。無需事先定義 Collection,隨時可以建立。

CRUD更加簡單,支援in-place update:只要定義一個陣列,然後傳遞給MongoDB的insert/update方法就可自動插入或更 新;對於更新模式,MongoDB支援一個upsert選項,即:“如果記錄存在那麼更新,否則插入”。MongoDB的update方法還支援 Modifier,通過Modifier可實現在服務端即時更新,省去客戶端和服務端的通訊。這些modifer可以讓MongoDB具有和Redis、 Memcached等KV類似的功能:較之MySQL,MonoDB更加簡單快速。Modifier也是MongoDB可以作為對使用者行為跟蹤的容器。在實際中使用Modifier來將使用者的互動行為快速儲存到MongoDB中以便後期進行統計分析和個性化定製。

效能高效,速度快: MongoDB使用c++/boost編寫,在多數場合,其查詢速度對比MySQL要快的多,對於CPU佔用非常小。部署也很簡單,對大多數系統,只需下載後二進位制包解壓就可以直接執行,幾乎是零配置。

 

2. 支援多種複製模式

MongoDB支援不同的伺服器間進行復制,包括雙機互備的容錯方案。Master-Slave是最常見的。通過Master-Slave可以實現資料的備份。在我們的實踐中,我們使用的是Master-Slave模式,Slave只用於後備,實際的讀寫都是從Master節點執行。Replica Pairs/Replica Sets允許2個MongoDB相互監聽,實現雙機互備的容錯。

 

3. MongoDB內融合的一些東西

MongoDB的shell命令全面支援js,甚至比js多一些型別,而且可以儲存js函式和變數。MongoDB自帶Mapreduce的功能,只是這個MapReduce功能只支援js語法(函式map和reduce是js寫的),且js引擎的實現導致一個例項只能執行一個map/reduce執行緒。MongoDB允許在服務端執行指令碼,可以用Javascript編寫某個函式,直接在服務端執行,也可以把函式的定義儲存在服務端,下次直接呼叫即可。MongoDB不支援事務級別的鎖定,對於某些需要自定義的“原子性”操作,可以使用Server side指令碼來實
現,此時整個MongoDB處於鎖定狀態。Map/Reduce也是MongoDB中比較吸引人的特性。Map/Reduce可以對大資料量的表進行統 計、分類、合併的工作,完成原先SQL的GroupBy等聚合函式的功能。並且Mapper和Reducer的定義都是用Javascript來定義服務 端指令碼。此外,MongoDB shell下支援的正規表示式是Perl相容的PCRE。MongoDB支援java驅動,可以結合Python,PHP,Ruby這些指令碼語言使用,如PyMongo。

 

4. GridFS

GridFS用於MongoDB中儲存大二檔案,基本思想是將將檔案文成很多塊,每塊作為一個單獨的文件儲存。只要使用./mongofile put filename,檔案就會被存在GridFS內,經md5處理,存在MongoDB的fs.files資料庫內。GridFS可以應用於存視訊,圖片,而MongoDB有Sharding和Replica Set的支援,還順便解決了分佈儲存的問題,所以很誘惑人。附上一個應用例子:
基於MongoDB GridFS的圖片儲存

 

5. 產品的代替和演變

LAMP(linux+apache+mysql+php)是以前web開發中的一盞明燈。而隨著web應用規模的擴大,越來越多的Nginx開始取代apache,快取層將mysql的功能逐漸弱化,越來越多的NoSQL產品以其簡單靈活和高效能向MySQL的地位發起挑戰,由全新的組合:Unix系列系統,加node.js,再加上MongoDB組成一個新的web開發框架。

 

 


相關文章