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