![](http://pic.cr173.com/up/2011-10/2011102291356.jpg)
- 類型:編程控件大。191KB語(yǔ)言:中文 評(píng)分:6.6
- 標(biāo)簽:
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由C++語(yǔ)言編寫。旨在為WEB應(yīng)用提供可護(hù)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB是一款分布式文檔數(shù)據(jù)庫(kù),支持類似關(guān)型數(shù)據(jù)庫(kù)的主從結(jié)構(gòu),文檔以二進(jìn)制Json形式存儲(chǔ),無(wú)鎖,無(wú)事務(wù),有索引。
1. MongoDB的啟動(dòng)與停止
MongoDB的啟動(dòng)之前已經(jīng)談過,但是需要注意的MongoDB在啟動(dòng)時(shí)有很多可配置的啟動(dòng)選項(xiàng)。在命令行運(yùn)行mongod –help可以查看所有選項(xiàng)。
其中有一項(xiàng)是--config,可以支持從文件中獲取配置項(xiàng)信息。例如:
1 D:\> mongod --config mongodb.conf
配置文件中的內(nèi)容如下:
1 port = 5586 2 3 logpath = mongodb.log 4 5 …
注意:文件中以#開頭的行是注釋;指定選項(xiàng)的語(yǔ)法就是這種“選項(xiàng)=值”的形式,其中選項(xiàng)是區(qū)分大小寫的;命令行中那些如--fork的開關(guān)選項(xiàng),其值要設(shè)為true。
一種穩(wěn)妥的停止MongoDB服務(wù)的方式就是使用shutdown命令,即{“shutdown” : 1},這是管理命令,要在admin數(shù)據(jù)庫(kù)下使用。shell提供了輔助函數(shù),如下:
1 >use admin 2 3 switched to db admin 4 5 >db.shutdownServer(); 6 7 server should be down…
若MongoDB服務(wù)器是最為前臺(tái)進(jìn)程運(yùn)行在終端,那么可以直接關(guān)閉命令行窗口即可。
2. 安全和認(rèn)證
每個(gè)MongoDB實(shí)例中的數(shù)據(jù)庫(kù)可以有許多用戶,如果開啟了安全性檢查,則只有數(shù)據(jù)庫(kù)認(rèn)證用戶才能執(zhí)行讀或者寫操作。在數(shù)據(jù)庫(kù)中添加用戶,如下所示:
1 >use test 2 3 >db.addUser(“test_user”, “efgh”)
addUser()函數(shù)中的第三個(gè)參數(shù)為可選項(xiàng)true或者false,表示該用戶是否為只讀用戶。
注意:addUser不僅能添加用戶,還能修改用戶口令或者只讀狀態(tài)。
要開啟安全性檢查,重啟服務(wù)器,同時(shí)加--auth命令行選項(xiàng)。然后通過shell重新連接數(shù)據(jù)庫(kù),操作如下:
1 >use test 2 >db.auth(“test_user”, “efgh”)
之后用戶就可以在自己的權(quán)限范圍內(nèi)進(jìn)行操作了。
數(shù)據(jù)庫(kù)的用戶賬戶以文檔的形式存儲(chǔ)在system.users集合里面。文檔的結(jié)構(gòu)如下:
1 {“user” : username, “readOnly” : true, “pwd” : password hash}
其中password hash是根據(jù)用戶名和密碼生成的散列。
用戶認(rèn)證時(shí),服務(wù)器將認(rèn)證和連接綁定來(lái)跟蹤認(rèn)證。所以如果驅(qū)動(dòng)程序或是工具使用了連接池或是因故障切換到另一個(gè)節(jié)點(diǎn),所有認(rèn)證用戶必須對(duì)每個(gè)新連接重新認(rèn)證。有的驅(qū)動(dòng)程序能夠?qū)⑦@步透明化,但要是沒有,就得手動(dòng)完成了。
除了認(rèn)證還有許多選項(xiàng)值得考慮來(lái)鎖定MongoDB實(shí)例。建議將MongoDB服務(wù)器布置在防火墻后或者布置在只有應(yīng)用服務(wù)器能訪問的網(wǎng)絡(luò)中。但要是MongoDB必須能被外面訪問到的話,建議使用—bindip選項(xiàng),可以指定mongod綁定到的本地IP地址。例如,只能從本機(jī)應(yīng)用服務(wù)器訪問,可以運(yùn)行“mongod –bindip localhost”。
3. 數(shù)據(jù)文件備份
MongoDB的所有數(shù)據(jù)都在數(shù)據(jù)目錄(/data/db/)下,備份MongoDB就是創(chuàng)建數(shù)據(jù)目錄中所有文件的副本。但是在運(yùn)行MongoDB時(shí)復(fù)制數(shù)據(jù)目錄是不安全的。
Mongodump是MongoDB自帶的工具,它能在運(yùn)行MongoDB時(shí)備份數(shù)據(jù)。用法如下:
1 D:\> mongodump -d test -o backup
-d指定了要備份的數(shù)據(jù)庫(kù),-o指定了備份文件所在的目錄,這里會(huì)自動(dòng)創(chuàng)建該目錄。
MongoDB還提供了從備份中恢復(fù)數(shù)據(jù)的工具mongorestore。用法如下:
1 D:\> mongorestore -d foo --drop backup/test/
-d指定了要恢復(fù)的數(shù)據(jù)庫(kù),--drop代表在恢復(fù)前刪除集合(若存在)。否則數(shù)據(jù)就會(huì)與現(xiàn)有集合數(shù)據(jù)合并,可能會(huì)覆蓋一些文檔。
雖然使用mongodump和mongorestore能不停機(jī)備份,但有兩個(gè)問題。
(1) mongodump使用普通的查詢機(jī)制,所以產(chǎn)生的備份不一定是服務(wù)器數(shù)據(jù)的實(shí)時(shí)快照。
(2) mongodump備份時(shí)的查詢會(huì)對(duì)其他客戶端的性能產(chǎn)生不利影響。
所以還有MongoDB的fsync命令能在MongoDB運(yùn)行時(shí)復(fù)制數(shù)據(jù)目錄還不會(huì)損毀數(shù)據(jù)。用法如下:
1 >use admin 2 >db.runCommand({“fsync” : 1, “l(fā)ock” : 1});
至此,數(shù)據(jù)目錄的數(shù)據(jù)就是一致的,且為數(shù)據(jù)的實(shí)時(shí)快照,因?yàn)樯狭藢懭腈i,可以安全地將數(shù)據(jù)目錄副本用做備份。備份好了,就要解鎖,如下:
1 >db.$cmd.sys.unlock.findOne(); 2 >db.currentOp();
運(yùn)行fsync命令是為了確保已經(jīng)解鎖了。
唯一不耽誤讀寫還能保證實(shí)時(shí)快照的備份方式就是通過從服務(wù)器備份。