本章主要介紹
-
- 常用選項;
- 啟動和停止MongoDB;
- 安全相關選項;
- 使用日志時的注意事項。
1.從命令行啟動
執行mongod程序即可啟動MongoDB服務器,mongod在啟動時可使用許多可配置選項,在命令行中運行mongod --help可列出這些選項。下列選項十分常用,需着重注意。
- --dbpath
使用此選項可指定一個目錄為數據目錄。其默認值為/data/db/ (在Windows中則為MongoDB可執行文件所在磁盤卷中的\data\db目錄)。機器上的每個mongod進程都需要屬於自己的數據目錄,即若在同一機器上運行三個mongod實例,則需三個獨立的數據目錄。mongod啟動時,會在其數據目錄中創建一個mongod.lock文件,以阻止其他mongod進程使用此數據目錄。若嘗試啟動另一個使用相同數據目錄的MongoDB服務器,則會出現錯誤提示:
"Unable to acquire lock for lockfilepath: /data/db/mongod.lock."
- --port
此選項用以指定服務器監聽的端口號。mongod默認占用27017端口,除其他mongod進程外,其余程序不會使用此端口。若要在同一機器上運行多個mongod 進程,則需為它們指定不同的端口。若嘗試在已被占用的端口啟動mongod,則會出現錯誤提示:
"Address already in use for socket: 0.0.0.0:27017"
- --fork
啟用此選項以調用fork創建子進程,在后台運行MongoDB。
首次啟動mongod而數據目錄為空時,文件系統需幾分鍾時間分配數據庫文件。 預分配結束,mongod可接收連接后,父進程才會繼續運行。因此,fork可能會發生掛起。可查看日志中的最新記錄得知正在進行的操作。啟用--fork選項時,必須同時啟用--logpath選項。
- --logpath
使用此選項,所有輸出信息會被發送至指定文件,而非在命令行上輸出。假設我們擁有該目錄的寫權限,若指定文件不存在,啟用該選項后則會自動生成一個文件。若指定日志文件已存在,選項啟用后則會覆蓋掉該文件,並清除所有舊的日志條目。如需保留舊日志,除--logpath選項外,強烈建議使用--logappend選項。
- --directoryperdb
啟用該選項可將每個數據庫存放在單獨的目錄中。我們可由此按需將不同的數據庫掛載到不同的磁盤上。該選項一般用干將本地數據庫或副本放置於單獨的磁盤上,或在磁盤空間不足時將數據庫移動至其他磁盤。也可將頻繁操作的數據庫掛載到速度較快的磁盤上,而將不常用的數據庫放到較慢的磁盤上。總之該選項能使我們在今后更加靈活地操作數據庫。
- --config
額外加載配置文件,未在命令行中指定的選項將使用配置文件中的參數。該選項通常用於確保每次重新啟動時的選項都是一樣的。
例如,要在后台啟動一個服務器,監聽5586端口,並將所有輸出信息發送至 mongodb.log文件中,可運行如下命令:
$ ./mongod --port 5586 --fork --logpath mongodb.log --logappend forked process: 45082 all output going to: mongodb.log
注意:mongod可能在意識到自身啟動前,便開始預配置日志文件。這時,直到預配置完成,fork命令才會返回命令提示符。可査看mongodb.log文件(或重定向日志文件)末尾,觀察這一操作過程。
首次安裝啟動MongoDB時,應査看一下日志。這一點很容易被忽視,尤其是使用初始化腳本來啟動MongoDB的時候。但日志中常包含重要的警告信息,及時解決這些問題可預防隨之而來的錯誤。如啟動時沒有出現任何警告,那么就一切就緒了。(啟動時發出的警告信息會同時出現在shell里。)
如在啟動時出現了警告信息,應把它們記錄下來。MongoDB會因以下問題發出警告:運行在行於32位的機器上(MongoDB並非為32位機器設計),啟用了 NUMA (Non-UniformMemory Access,非均勾訪存模型,啟用此會嚴重拖慢應用的運行速度);或者系統所允許打開的文件描述符(descriptor)數目過少(MongoDB需使用大量的文件描述符)。
重啟數據庫時,日志的前部不會發生更改,所以一旦了解了日志內容,就完全可以使用初始化腳本來運行MongoDB,而不用去考慮日志。然而,在安裝、升級,或從崩潰中恢復后,都應重新檢査日志,以確保MongoDB和系統相契合。
啟動數據庫時,MongoDB會將一個文檔寫入local.startup_log集合中,該集合包含了 MongoDB的版本、其所基於的系統,以及所用的標記:
> db.startup_log.findOne() { "_id" : "spock-1360621972547", "hostname" : "spock", "startTime" : ISODate("2013-02-11T22:32:52Z"), "startTimeLocal" : "Mon Feb 11 17:32:52.547", "cmdLine" : { }, "pid" : 28243, "buildinfo" : { "version" : "2.4.0-rc1-pre-", ... "versionArray" : [ 2, 4, 0, -9 ], "javascriptEngine" : "V8", "bits" : 64, "debug" : false, "maxBsonObjectSize" : 16777216 } }
該集合可用干跟蹤數據庫升級或更改后的運行狀況。
1.1 使用配置文件
MongoDB支持從文件中讀取配置信息。當使用的選項很多,或自動化啟動任務時,使用配置文件就十分實用。使用-f或--config標記,告知服務器使用配置文件。例如,運行 mongod --config ~/.mongodb.conf,從而使用 ~/.mongodb.conf作為配置文件。
配置文件中支持的參數和在命令行中的參數完全相同。以下是一個配置文件的例子:
# Start MongoDB as a daemon on port 5586 port = 5586 fork = true # daemonize it! logpath = /var/log/mongodb.log logappend = true
該配置文件指定的參數與之前啟動時在命令行中指定的參數相同。文件中也展現了 MongoDB配置文件的主要內容:
- #后的內容,會被作為注釋忽略掉;
- 指定參數的語法是option = value,其中option的名稱區分大小寫;
- 在命令行中類似--fork的開關選項,應把fork的值設為true。
2.停止MongoDB
安全停止運行中的MongoDB服務器,與安全啟動該服務器一樣重要。有若干不同選項可有效地完成這一操作。
關閉運行中的服務器,最簡潔的方法是使用shutdown命令--{"shutdown": 1 }。這是一個管理員命令,必須運行在admin數據庫上。shell提供了一個輔助函數,用以簡單地執行shutdown命令:
> use admin switched to db admin > db.shutdownServer() server should be down…
在主節點(primary)上運行shutdown命令時,服務器在關閉前,會先等待備份節點(secondary)追趕(catch up)主節點以保持同步。這將回滾的可能性降至最低,但shutdown操作有失敗的可能性。如幾秒鍾內沒有備份節點成功同步,則shutdown操作失敗,主節點亦不會停止運行:
> db.shutdownServer() { "closest" : NumberLong(1349465327), "difference" : NumberLong(20), "errmsg" : "no secondaries within 10 seconds of my optime", "ok" : 0 }
可使用force選項,強制關閉主節點:
db.adminCommand({"shutdown" : 1, "force" : true})
這相當於發送一個SIGINT或SIGTERM信號(三種做法都能使MongoDB安全地停止運行,但可能會有數據未能完成同步)。如服務器正在終端中作為前台進程運行,那么按下Ctrl-C快捷鍵也能發送一個SIGINT信號。另外,kill之類的命令也可用於發送這些信號。假設mongod的PID (Process identifier,進程標識符)為10014,那么相應的命令就是kill -2 10014 (發送SIGINT信號)或kill 10014 (發送 SIGTERM 信號)。
mongod收到SIGINT或SIGTERM信號后,會安全地停止運行。這意味着mongod 會等當前正在進行的操作或文件預分配結束(耗時一定時間),再關閉所有打開的連接,將緩存寫入磁盤,繼而結束運行。
3.安全性
不要將MongoDB服務器直接暴露在外網上。應盡可能地限制外部對MongoDB的訪問。最好的方式是設置防火牆,只允許內部網絡地址對MongoDB的訪問。
除使用防火牆外,也可在配置文件中加入以下選項來增強安全性。
- --bind-ip
指定MongoDB監聽的接口。我們通常將其設置為一個內部IP地址,從而保證應用服務器和集群中其他成員的訪問,同時拒絕外網的訪問。如MongoDB與應用服務器運行於同一台機器上,則可將其設為localhost。但配置服務器和分片需要其他機器的訪問,所以不應設為localhost。
- --nohttpinterface
MongoDB啟動時,默認在端口 1000啟動一個微型的HTTP服務器。該服務器可提供一些系統信息,但這些信息均可在其他地方找到。對於一個可能只需通過SSH訪問的機器,沒有必要將這些信息暴露在外網上。
除非正在進行開發,否則請關閉此選項。
- --nounixsocket
如不打算使用UNIX socket來進行連接,則可禁用此選項。只有在本地,即應用服務器和MongoDB運行在同一台機器上時,才能使用socket進行連接。
- --noscripting
該選項完全禁止服務器端JavaScript腳本的運行。大多數報告的MongoDB安全問題都與JavaScript有關。如程序允許的話,禁止JavaScript通常會更安全一些。
一些shell中的輔助函數依賴於服務器端的JavaScript,尤其是sh.status()。 在一台禁止了 JavaScript的服務器上運行這些輔助函數時,會出現錯誤提示。
不要啟用REST操作界面。該界面是默認禁用的,開啟后可在服務器上執行很多命 令,但並非為生產環境所設計。
3.1 數據加密
MongoDB很久之前還未提供內置數據加密機制。如需對數據進行加密,可使用加密文件系統。另一種做法是手動加密某些字段,但MongoDB無法査詢加密的值。(現在是否有加密功能,請翻閱官網文檔)
3.2 SSL安全連接
連接至MongoDB傳輸的數據默認不被加密。然而,MongoDB支持使用SSL連接。由於授權的原因,默認版本中並未包含SSL,可從http://www.10gen.com下載一個支持SSL的版本。也可以自己編譯MongoDB的源代碼啟用SSL。請査閱本國語言的驅動程序文檔,了解創建SSL連接的方法。
4.日志
mongod默認將日志發送至stdout (標准輸出,通常為終端)。大多初始化腳本會使用--logpath選項,將日志發送至文件。如在同一台機器上有多個MongoDB實例(比如說一個mongod和一個mongos),注意保證各實例的日志分別存放在單獨的文件中。確保知道日志的存放位置,並擁有文件的讀訪問權限。
MongoDB會輸出大量日志消息,但請不要使用--quiet選項(該選項會隱藏部分日志消息)。保持日志級別為默認值通常不錯,此時日志中有足夠的信息進行基本調試(如耗時過長或啟動異常的原因等),但日志占用的空間並不大。調試應用某特定問題時,可使用一些選項從日志中獲取更多信息。
首先,在重啟McmgoDB時,可通過在參數中附加數目更多的“v”(即-v、-vv、-vvv、-vvvv或-vvvvv),或運行如下setParameter命令,完成日志級別(log level)的更改。
> db.adminCommand({"setParameter" : 1, "logLevel" : 3})
記得將日志級別重設為0,否則日志中會存在過多不必要的內容。可將日志級別調高至5,這時mongod會在日志中記錄幾乎所有的操作,包括每一個請求所處理的內容。由於mongod將所有內容都寫入了日志文件,因此可產生大量的磁盤讀寫操作(IO),從而拖慢一個忙碌的系統。如需即時看到正在進行的所有操作,打開分析器不失為更好的方法:
MongoDB默認記錄耗時超過100毫秒的査詢信息。如100毫秒不適用於應用,可通過setProf ilingLevel命令來更改此閾值:
> // Only log queries that take longer than 500ms > db.setProfilingLevel(1, 500) { "was" : 0, "slowms" : 100, "ok" : 1 } > db.setProfilingLevel(0) { "was" : 1, "slowms" : 500, "ok" : 1 }
上述第二條指令將關閉分析器,但第一條指令中以毫秒為單位的值將繼續作為所有數據庫中日志記錄的閾值而生效。也可使用--slowms選項重啟MongoDB來更改這一閾值。
最后,設置一個計划任務以便每天或每周分割(rotate)日志文件。如使用--logpath選項啟動MongoDB,向進程發送一個SlGUSR1信號即使其對日志進行分割。也可使用logRotate命令以達到相同目的:
> db.adminCommand({"logRotate" : 1})
如不是通過--logpath選項啟動的MongoDB,則不能對日志進行分割。
