1. 程式人生 > 其它 >Mongo伺服器管理之啟動和停止MongoDB

Mongo伺服器管理之啟動和停止MongoDB

  本章主要介紹

    • 常用選項;
    • 啟動和停止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-l11T22: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訊號)或kill10014 (傳送 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命令,完成日誌級別(loglevel)的更改。

>  db.adminCommand({"setParameter" : 1, "logLevel" : 3})

  記得將日誌級別重設為0,否則日誌中會存在過多不必要的內容。可將日誌級別調高至5,這時mongod會在日誌中記錄幾乎所有的操作,包括每一個請求所處理的內容。由於mongod將所有內容都寫入了日誌檔案,因此可產生大量的磁碟讀寫操作(IO),從而拖慢一個忙碌的系統。如需即時看到正在進行的所有操作,開啟分析器不失為更好的方法:

  MongoDB預設記錄耗時超過100毫秒的査詢資訊。如100毫秒不適用於應用,可通過setProf ilingLevel命令來更改此閾值:

>  //只id錄耗時超過500毫秒的査詢操作
>  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,則不能對日誌進行分割。

作者:小家電維修

相見有時,後會無期。