MongoDB權威指南 第八章 管理 管理MongoDB不管是備份仍是帶有複製的多節點系統,都有快捷的方式。系統會自動完成各類配置。 1.MongoDB是一個普通命令行程序,用mongod調用。 2.MongoDB提供了內置的管理接口和監控功能,易與第三方監控包集成。 3.MongoDB支持基本的,數據庫級別的用戶認證,包括只讀用戶,以及獨立的管理員權限。 4.多種方式備份MongoDB。 8.1 啓動中止MongoDB 8.1.1 命令行啓動 命令行啓動,能夠mongod --help查看全部選項。 --dbpath 默認值爲/data/db/。每一個Mongod進程都須要獨立的數據目錄,要有三個mongod實例,必需要有三個獨立的數據目錄。mongodb啓動時,會在數據目錄喜好建立mongod.lock文件,防止其餘mongod進程使用該數據目錄。 --port 指定監聽端口,默認爲27017,運行多個mongod進程,須要指定不一樣的端口號。 --fork 以守護進程運行mongodb,建立服務器進程。 --logpath 指定日誌輸出路徑,而不是輸出命令行,它會覆蓋已有文件,清除原來的日記記錄。若是要保留,須要使用--logappend選項。 --config 指定配置文件,加載命令行未指定的各類選項。 8.1.2 配置文件 MongoBD支持從文件獲取配置信息。指定配置文件能夠用-f或者--config選項。例如: # mongod --config ~/.mongodb.conf cat > ~/.mongodb.conf <<EOF port = 10001 fork = true logpath = /data/mongodb.log dbpath = /data/node2 logappend = true EOF 8.1.3 中止MongoDB 數據庫關閉方法: 1. kill -2 SIGTERM或者kill -2 SIGINT,能夠穩妥退出,會等到當前運行的操做或者文件預分配,關閉全部打開的鏈接,將緩存的數據刷新到磁盤,最後中止。 不能kill -9(SIGKILL),這樣會致使數據文件損毀。 2. 使用管理命令{"shutdown" : 1} > use admin > db.shutdownServer(); 8.2 監控 8.2.1 使用管理接口 啓動MongoDB時,會啓動一個很是基本的HTTP服務器,該服務器監聽的端口比主服務器大1000。呈現的信息能夠經過shell查看,也能夠經過web頁面查看。 要利用好管理接口,須要用--reset選項開啓REST支持。也能夠在啓動時使用--nohttpinterface關閉管理接口。 8.2.2 serverStatus serverStatus呈現了MongoDB內部詳細信息,好比服務器的版本,運行時間,當前鏈接數。 MongoDB shell version: 2.4.9 connecting to: 127.0.0.1:10001/test > db.runCommand({serverStatus : 1}) "globalLock"表示全局寫入鎖佔用了服務器多少時間(微秒)。"mem"包含服務器內存映射了多少數據,服務器進程的虛擬內存和常駐內存佔用狀況; "indexCounters"表示B樹在磁盤檢索和內存檢索的次數; "backgroudFlushing"表示後臺作了多少次fsync以及用了多少時間; "opcounters"包含了每種主要操做的次數。 8.2.3 mongostat mongostat輸出serverStatus提供的重要信息。每秒鐘輸出新的一行,比以前看到的靜態計數實時性更好。分別爲insert/s,commands/s,vsize和%locked。 8.2.4 第三方插件 支持Nagios,Munin,Ganglia,Cacti的MongbDB插件。 8.3 安全 MongoDB支持對單個鏈接的認證。 8.3.1 認證的基礎知識 每一個MongoDB實例中的數據庫均可以有不少用戶。開啓認證後,只有數據庫認證用戶才能執行讀寫操做。 認證後,管理員能夠讀寫全部的數據庫,執行特定的管理命令。 開啓安全認證前,須要有管理員賬號。 > use admin switched to db admin > db.addUser("root", "root123"); { "user" : "root", "readOnly" : false, "pwd" : "81c5bca573e01b632d18a459c6cec418", "_id" : ObjectId("530bd17622cceb4323a2b500") } > use test switched to db test > db.addUser("test_user", "root123", true); { "user" : "test_user", "readOnly" : true, "pwd" : "d436badec207e3821abbaf337fcbdd06", "_id" : ObjectId("530bd24322cceb4323a2b501") } 在shell中建立只讀用戶將adduser的第三個參數設爲true。調用addUser()必須對數據庫有寫權限。 addUser不只能夠增長新用戶,還能修改用戶口令或只讀狀態。 重啓服務器,加入--auth選項,開啓安全檢查。 > use admin switched to db admin > db.auth("root", "root123"); 1 8.3.2 認證的工做原理 數據庫用戶賬戶以文檔形式存儲在system.users集合裏面。 > use admin switched to db admin > db.system.users.find(); { "_id" : ObjectId("530bd17622cceb4323a2b500"), "user" : "root", "readOnly" : false, "pwd" : "81c5bca573e01b632d18a459c6cec418" } 能夠執行db.system.users.remove({"user":"root"});刪除賬號。 用戶認證時,服務器將認證和鏈接綁定來跟蹤認證。 8.3.3 其餘安裝考慮 除了認證還有許多選項來鎖定MongoDB實例。即使使用認證,MongoDB傳輸協議是不加密的。如需加密,須要使用SHH隧道或相似作客戶端和服務器之間的加密。 MongoDB服務器建議佈置在防火牆或內網中,可是若是須要被外部訪問,使用--bindip選項,能夠指定mongod綁定在本機IP地址。 能夠用--noscripting徹底禁止服務器端JavaScript的執行。 8.4 備份和修復 8.4.1 數據文件備份 MongoDB將全部數據存放在數據目錄下。只要簡單的備份數據目錄下的全部文件的副本就能夠了。 除非服務器作了完整的fsync,還不容許寫入,不然創建副本並不安全。 須要關閉MongoDB,而後複製數據目錄。 下面介紹不停機備份方式 8.4.2 mongodump和mongorestore mongodump對運行的MongoDB作查詢,而後將全部查到的文檔寫入磁盤。備份時的查詢對其餘客戶端的性能產生不利影響。 [root@test02 ~]# mongodump --help [root@test02 ~]# mongodump --port 10001 -d test -o backup [root@test02 ~]# mongorestore --port 10001 -d foo --drop backup/test/ -d指定了要恢復的數據庫,就是foo。--drop表明在恢復前刪除集合(若存在)。 8.4.3 fsync和鎖 MongoDB的fsync命令能夠在運行時複製數據目錄還不損壞數據。 fsync命令會強制服務器將全部緩衝區寫入磁盤。還能夠選擇上鎖阻止對數據庫的進一步寫入,直到釋放鎖位置。寫入鎖是fsync在備份時發揮做用的關鍵。 > db.runCommand({"fsync" : 1, "lock", 1}); Tue Feb 25 07:50:36.145 SyntaxError: Unexpected token , > db.runCommand({"fsync" : 1, "lock" : 1}); { "info" : "now locked against writes, use db.fsyncUnlock() to unlock", "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand", "ok" : 1 } 至此,數據目錄的數據就是一致的,且爲數據的實時快照。由於上了寫入鎖,能夠安全的將數據目錄副本做爲備份。要是在數據庫運行在有快照功能的文件系統上時,好比LVM或EBS,就很是有效了。 備份好了,就要解鎖: > db.$cmd.sys.unlock.findOne(); { "ok" : 1, "info" : "unlock completed" } > db.currentOp(); { "inprog" : [ ] } 運行db.currentOp()是爲了確保已經解鎖了。 惟一的影響是寫入操做被暫時阻塞了。惟一不耽誤讀寫的方法是經過從服務器備份。 8.4.4 從屬備份 上面的幾種方式都不如在從服務器上備份,從服務器幾乎與主服務器同步。由於從服務器再也不會性能或者讀寫,就能夠隨意選擇上面的3種備份方式:關停,轉儲和恢復工具或fsync命令。 8.4.5 修復 作備份是爲了防止不測,總有機器宕機,又沒有備份的狀況。MongoDB的存儲方式不能保證磁盤上的數據可用。MongoDB內置的修復功能會試着恢復損毀的數據文件。 [root@test02 ~]# mongod --config ~/.mongodb.conf --repair 修復服務器的過程是將全部文檔導出而後立刻導入,忽略無效的文檔。完成後,會重建索引。 修復運行中的服務器數據庫 > use test switched to db test > db.repairDatabase() { "ok" : 1 }