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