1.啟動和停止MongoDB
執行mongod,啟動MongoDB服務器。mongod有很多選項,在命令中執行 mongod --help
主要選項如下:
--dbpath
指定數據目錄,默認值是C:\data\db。每個mongod進程都需要獨立的數據目錄。如果要是有3個mongod
實例,那么必須有3個獨立的數據目錄。當mongod啟動時,會在數據庫目錄中創建mongod.lock文件
這個文件用於防止其他的mongod純凈使用該數據目錄。
--port
指定服務器監聽的端口號,默認端口27017.要運行多個mongod進程,則要給每個指定不同的端口號。
--logpath
指定日志的輸出路徑。如果對文件夾有讀寫權限,系統會在文件不存在時創建它。它會將已有文件覆蓋掉,
清除所有原來的日志記錄。如果想要保留原來的日志,需使用--logappend選項。
--config
指定配置文件,加載命令行未指定的各種選項。
2.從配置文件啟動
MongoDB支持從文件獲取配置信息.當需要配置非常多或者要自動化MongoDB的啟動時會用到.
指定配置文件可以用-f或--config選項.
如:
mongod --config refactorConfig.txt
refactorConfig.txt內容如下:
#start MongoDB
port = 10000
dbpath = "f:\mongo\db"
logpath = "f:\mongo\log\MongoDB.txt"
rest = true
配置文件和命令行的功能一樣
mongod --dbpath "f:\mongo\db" --logpath "f:\mongo\log\MongoDB.txt" --rest --port 10000
配置文件的特點:
a.以#開頭的行是注釋
b.指定選項的語法是這種"選項=值"的形式.選項是區分大小寫的.
c.命令行如--rest的開關選項,值要設為true
3.停止MongoDB
可以使用shutdown命令{"shutdown":1},這個命令要在admin數據庫下使用.shell還提供了輔助函數:
use admin
db.shutdownServer()
4. 監控
使用管理接口,默認情況下,啟動mongod會啟動基本的http服務器,該服務的默認端口是28017.可以在瀏覽器中輸入
localhost:28017.有些鏈接需要在mongod啟動時,用--rest選項開啟rest支持 才能進去.當開啟rest支持后,可以
在mongod啟動時使用--nohttpinterface來關閉管理接口.
5.serverStatus
要獲取運行中的MongoDB服務器統計信息,最基本的工具是serverStatus命令
db.runCommand({"serverStatus":1})
serverStatus返回的鍵解釋:
"globalLock"的值表示全局寫入鎖占用了服務器多少時間(單位微秒)
"mem"包含服務器內存映射了多少數據,服務器進程的虛擬內存和常駐內存的占用情況(單位MB)
"indexCounters"表示B樹在磁盤檢索("misses")和內存檢索("hits")的次數.如果這個比值開始上升,就要考慮加內存了.
"backgroundFlushing"表示后台做了多少次fsync以及用了多少時間
"opcounters"文檔包含了每種主要操作的次數
"asserts"統計了斷言的次數
6.mongostat
serverStatus雖然強大,但對服務器的監控來說不怎么容易.MongoDB提供了mongostat
mongostat輸出一些serverStatus提供的重要信息,它會每秒輸出新的一行,比之前看到的靜態數據實時性要好.
它輸出多個列,分別是 inserts/s commands/s vsize 和 %locked,與serverStatus的數據相對應.
還可以使用第三方插件進行數據庫的監控.
7.安全和認證
認證的基礎知識
每個MongoDB實例中的數據庫都可以有很多用戶,如果開啟了安全性檢查,這只有數據庫認證用戶才能執行讀或寫操作.
在認證的上下文中,MongoDB會將普通的數據作為admin數據庫處理.admin數據庫中的用戶被稱為超級用戶(管理員).
在認證后,管理員可以讀寫所有數據庫,執行特定的管理命令,如listDatabases和shutdown.
在開啟安全檢查前,至少要有個管理員帳號,在shell連接的是沒有開啟安全檢查的服務器
上面添加了管理員refactor_root,在test數據庫添加了兩個普通賬號,其中一個有只讀權限.在shell中創建只讀用戶只要
在addUser的第三個參數設為true.調用addUser必須有響應數據庫的寫權限.這里可以對所有數據庫調用addUser,
因為還沒有開啟安全檢查.
重啟數據庫,重啟時加入 --auth 命令行選項,開啟安全檢查
第一次連接時,不能test數據庫執行任何操作,作為只讀用戶認證后,能查找,不能插入數據.能讀寫用戶認證后,能查找和插入
數據,但不能使用show dbs 來列舉所有數據庫.超級用戶認證后,可以為所欲為了.
8.認證的工作原理
數據庫的用戶帳號以文檔的形式存儲在system.users集合里.文檔的結構是
{
"_id" : ObjectId("5006a037dff37e149322fd83"),
"user" : "refactor_read_write",
"readOnly" : false,
"pwd" : "5a84584ac51d3f702461fce4c46b0d6b"//是根據用戶名和密碼生成的散列
}
知道了用戶信息是如何存儲的以及存儲位置后,就可以進行日常的管理工作了.
如刪除帳戶:
> db.system.users.remove({"user":"refactor_read"})
> db.auth("refactor_read","refactor")
0
用戶認證時,服務器將認證和連接綁定來跟蹤認證,也就是說如果驅動程序或是工具使用了連接池或是因故障切換到
另一個節點,所有認證用戶必須對每個新連接重新認證.
MongoDB的傳輸協議是不加密的,如需加密,可以用ssh隧道或者類似的技術做客戶端和服務器間的加密.
建議將MongoDB服務器放在防火牆或放在只有應用服務器能訪問的網絡中.如果MongoDB必須能被外面訪問到的話,
建議使用--bindip選項,可以指定mongod綁定到的本地ip地址.如:只能從本機應用服務器訪問,可以使用
mongod --bindip localhost
默認情況下MongoDB會開啟一個簡單的http服務器,便於查看運行,鎖,復制等方面的信息,要是不想公開這些信息,可以用
--nohttpinterface來關閉管理接口.
可以用--noscripting完全禁止服務端javascript執行
9.備份和修復
MongoDB將所有數據都存放在 數據目錄 下,默認目錄是C:\data\db\.啟動MongoDB的時候可以用--dbpath指定數據目錄.
不論數據目錄在哪里,它都存放着MongoDB的所有數據.要想備份MongoDB,只要簡單的復制數據目錄中的所有文件即可.
除非服務器做了完整的fsync,還不允許寫入,否則在運行MongoDB時創建數據目錄的副本並不安全,這樣的備份可能已經
破損了,需要修復.
在運行MongoDB時創建數據目錄的副本並不安全,所以就得先把服務器關了,再復制數據目錄.但是關閉數據庫就要停止業務.
10.mongodump和mongorestore
mongodump是一種能在運行時備份的方法.mongodump對運行的MongoDB做查詢,然后將所有查到的文檔寫入磁盤.
因為mongodump是一般的客戶端,所以可供運行的MongoDB使用,即便是正在處理其他請求或是執行寫入也沒有問題.
mongodump使用普通的查詢機制,所以產生的備份不一定是服務器數據的實時快照.服務器在備份過程中處理寫入時,非常明顯.
mongodump備份時的查詢會對其他客戶端的性能產生影響.
mongodump --help 獲得幫助
mongorestore是從備份中恢復數據的工具.
mongorestore獲取mongodump 的輸出結果,並將備份的數據插入運行的MongoDB實例中.
如:將數據庫test備份到backup目錄
mongodump -d test -o backup
使用mongorestore 恢復到testNew 數據庫
mongorestore -d testNew --drop backup/test/
-d指定要恢復的數據庫.--drop指在恢復前刪除集合(若存在),否則數據就會與現有集合數據合並,可能會覆蓋一些文檔.
可以使用mongorestore --help獲得幫助信息
11.fsync和鎖
雖然使用mongodump和mongorestore能不停機備份,但是卻失去了獲取實時數據視圖的能力.MongoDB的fsync命令
能在MongoDB運行時復制數據目錄還不會損壞數據.
fsync命令會強制服務器將所有緩沖區寫入磁盤.還可以選擇上鎖住址對數據庫的進一步寫入,知道釋放鎖為止.寫入鎖是讓
fsync在備份時發揮作用的關鍵.
在shell中,強制執行fsync並獲得寫入鎖:
db.runCommand({"fsync":1,"lock":1})
這時,數據目錄的數據就是一致的,且為數據的實時快照.因為上了鎖,可以安全的將數據目錄副本作為備份.要是數據庫運行在
有快照功能的文件系統上時,比如LVM,EBS,這個很有用,因為拍個數據庫目錄的快照很快.
備份好了,解鎖:
db.$cmd.sys.unlock.findOne()
db.currentOp()
運行db.currentOp()是為了確保已經解鎖了(初次請求解鎖會花點時間)
有了fsync命令,就能非常靈活的備份,不用停掉服務器,也不用犧牲備份的實時性能.要付出的代價就是一些寫入操作被
暫時阻塞了.唯一不耽誤讀寫還能保證實時快照的備份方式就是通過從服務器備份.
12.從屬備份
雖然上面的備份方式很靈活,但都沒有從服務器上備份好.當復制的方式運行MongoDB,前面的提到的備份技術就不僅能用在
主服務器上,也可用在從服務器上.從服務器的數據幾乎與主服務器同步.因為不太在乎從屬服務器的性能或者是能不能讀寫,
於是就能隨意選擇上面的3種備份方式:關停,轉存或恢復工具或fsync命令.從服務器上備份是MongoDB推薦的備份方式.
13.修復
MongoDB的存儲方式不能保證磁盤上的數據還能用,因為可能有損毀.MongoDB內置的修復功能會試着恢復損壞的數據文件.
未正常停止MongoDB后應該修復數據庫.修復數據庫的方式很簡單就是 mongod --repair 來啟動服務器.
修復數據庫的實際過程很簡單:將所有的文檔導出后馬上導入,忽略無效的文檔.完成后,會重建索引.數據量大的話,會花很多時間,
因為所有數據都要驗證,所有索引都要重建(從MongoDB 1.8 以后版本引入了日志系統,使修復時間打打的縮短).
修復后可能會比修復前少些文檔,因為損壞的文檔被刪除了.
修復數據庫還能起到壓縮數據的作用.閑置控件(如刪除體積較大集合,或刪除大量文檔后騰出的空間)在修復后會被重新利用.
修復運行中的服務器上的數據庫,要在shell用repairDatabases.
use test
db.repairDatabase()