入門MongoDB,你需要注意的4個技巧
原創【51CTO經典譯文】我之所以喜歡MongoDB,主要是因為在動態語言中使用它是如此的簡單,自然。到目前為止,我已經在兩個項目(Encode 和 Sparrw)中使用過它了,雖然對這個選擇我非常滿意,但是有些問題我還是沒有注意到,這些問題讓我抓了好幾個小時的頭皮才解決。如果你有多臺機器,然后為數據庫多分配幾臺機器,那么有些問題可以迎刃而解,但是我的項目是運行在單個(虛擬)服務器之上的低流量Web應用程序。
(關于MongoDB,具體可以參考:http://www.mongodb.org/)
(關于作者的兩個項目Encode 和 Sparrw,分別可以參考:http://en.co.de/和http://sparrw.com/)
這些問題都很簡單,都是一些文檔化的東西,不是什么Bug(當然,這要看你問誰了)。如果你讀過所有的文檔,那么這些問題可能你基本都見過了。我也是,但是在那之后,當再次遇到它們的時候,我就把文檔中的內容都忘到腦后了,然后,我不得不再次修復它們。
使用64位的版本
32位的版本最多只能存儲2.5GB的數據。當然,如果隨便玩玩的話,這可能已經足夠了。但是當你開始配置你的生產性(或用于演示的)系統的時候,記住要選擇64位的版本,因為以后你無法通過“修復”來解決這個問題,你只能重新安裝。
在另外一臺機器上創建一個從數據庫
如果你的MongoDB實例崩潰了(或者由于OOM掛掉了,或者整個系統都崩潰了),那么誰也無法保證你的數據會怎么樣。你可以進行修復,但是這有點像運行fsck或買彩票——你永遠都無法知道你將會得到什么結果。所以你應該創建一個從數據庫(或者做一個“replica set”),并且,你應該把這個從數據庫放到另外一個服務器上。如果一個VPS(Virtual Private Server 虛擬專用服務器)剛好可以滿足你的(或其他人的)需要,那么這的確是一件麻煩事,但是,如果你珍惜你的數據的話,這是不可避免的。
讓它更安全
在默認情況下,MongoDB不會進行身份驗證,并且,它會監聽所有的網絡接口(對于你直接從他們的官方站點上獲得的那個版本來說,這就是事實;各種Linux發行版(例如:Debian 和 Ubuntu)在默認情況下,都只綁定到127.0.0.1,這是十分明智的),這就是說,在世界上的任何地方,任何人都可以訪問你的數據庫。如果你在一個面向公眾的服務器上使用它,那么這的確是一個問題。你可以把它設置成必須進行身份驗證,也可以讓MongoDB只監聽localhost。我比較喜歡后者,因為在我的服務器上,我是唯一一個用戶。
總是使用getLastError
如果你不需要閃電般的速度,花一點時間來確保你的變更對于這個數據庫來說是OK的,并且對數據進行修改并沒有造成什么問題絕對是值得的——如果存在什么問題的話,那么應該在你的應用程序中把它們記錄下來,讓你知道數據庫發生了一些故障。或者,如果你確定你需要使用getLastEror(),那么至少不要混合使用,也不要在同一個集合上使用它。MongoDB無法確保命令會按照指定的順序來執行。在我的測試代碼中,我做了一個“異步的”remove()調用(也就是說,我無需等待這個函數執行完畢),然后,在remove()愉快地移除它們(可能已經把它們全部移除,也可能只是移除了其中的一部分,還可能什么也沒有移除,這主要取決于競爭)以前,我插入了一些新的條目。這讓我困惑了好幾個小時。
有許多在線的文檔,在各種論壇,也可以找到很多這方面的信息,如果你能通過更簡潔的方式獲得這方面的信息,那也不錯。對于這方面來說,我發現《MongoDB: The Definitive Guide book》 和 10gen videos都很有幫助——例如,deployment strategies視屏對于入門來說,是絕佳的視頻教程。
(關于《MongoDB: The Definitive Guide book》 ,具體可以參考:http://oreilly.com/catalog/0636920001096)
(關于10gen videos,具體可以參考:http://www.10gen.com/video)
(關于deployment strategies,具體可以參考:http://www.10gen.com/video/mongosv2010/deployment)
我希望我總結的這幾個技巧可以幫助你避免我使用MongoDB的時候曾經犯過的幾個錯誤:-)
原文標題:4 Tips for MongoDB Beginners
延伸閱讀
MongoDB Logo
Mongo是一個高性能,開源,無模式的文檔型數據庫,它在許多場景下可用于替代傳統的關系型數據庫或鍵/值存儲方式。Mongo使用C++開發,提供了以下功能:
◆面向集合的存儲:適合存儲對象及JSON形式的數據。
◆動態查詢:Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
◆完整的索引支持:包括文檔內嵌對象及數組。Mongo的查詢優化器會分析查詢表達式,并生成一個高效的查詢計劃。
◆查詢監視:Mongo包含一個監視工具用于分析數據庫操作的性能。
◆復制及自動故障轉移:Mongo數據庫支持服務器之間的數據復制,支持主-從模式及服務器之間的相互復制。復制的主要目標是提供冗余及自動故障轉移。
◆高效的傳統存儲方式:支持二進制數據及大型對象(如照片或圖片)。
◆自動分片以支持云級別的伸縮性(處于早期alpha階段):自動分片功能支持水平的數據庫集群,可動態添加額外的機器。
MongoDB的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統的RDBMS系統(豐富的功能)架起一座橋梁,集兩者的優勢于一身。根據官方網站的描述,Mongo適合用于以下場景:
◆網站數據:Mongo非常適合實時的插入,更新與查詢,并具備網站實時數據存儲所需的復制及高度伸縮性。
◆緩存:由于性能很高,Mongo也適合作為信息基礎設施的緩存層。在系統重啟之后,由Mongo搭建的持久化緩存層可以避免下層的數據源過載。
◆大尺寸,低價值的數據:使用傳統的關系型數據庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統的文件進行存儲。
◆高伸縮性的場景:Mongo非常適合由數十或數百臺服務器組成的數據庫。Mongo的路線圖中已經包含對MapReduce引擎的內置支持。
◆用于對象及JSON數據的存儲:Mongo的BSON數據格式非常適合文檔化格式的存儲及查詢。
自然,MongoDB的使用也會有一些限制,例如它不適合:
◆高度事務性的系統:例如銀行或會計系統。傳統的關系型數據庫目前還是更適用于需要大量原子性復雜事務的應用程序。
◆傳統的商業智能應用:針對特定問題的BI數據庫會對產生高度優化的查詢方式。對于此類應用,數據倉庫可能是更合適的選擇。
◆需要SQL的問題
MongoDB支持OS X、Linux及Windows等操作系統,并提供了Python,PHP,Ruby,Java及C++語言的驅動程序,社區中也提供了對Erlang及.NET等平臺的驅動程序。
【編輯推薦】






















