Mongodb 3.x配置說明,本文內容忽略了Enterprise版和一些不經常使用的配置。javascript
1、配置說明java
在Mongod安裝包中,包含2個進程啓動文件:mongod和mongos;其中mongd是核心基礎進程,用來接收讀寫請求、負責存儲實際數據,mongod實例是構成集羣的基本單位,好比Replication set、Sharding Cluster、Config Servers等;mongos是Sharding Cluster架構模式中的「路由」進程,即客戶端請求訪問mongos,而後有mongos將請求轉發給合適的sharding server執行操做,並將result返回給客戶端,因此mongos基本不存儲數據,只是在內存中緩存部分shard key與sharding server的對應關係,便於路由。linux
在配置文件方面,mongod和mongos有不少相同之處,下文中若有區別之處將會特別指出。算法
在一個節點上,一般同時啓動mongod和mongos進程是正常的,他們之間不存在資源競爭,可是爲了不衝突,咱們但願它們使用各自的配置文件,好比mongod.conf、mongos.conf;mongodb的某些平臺下的安裝包中沒有自帶配置文件,須要開發者本身建立。mongodb
重要配置參數講解以下:shell
一、processManagement:數據庫
fork: <true | false>json
描述:是否以fork模式運行mongod/mongos進程,默認爲false。後端
pidFilePath:<路徑>緩存
描述:配合"fork:true"參數,將mongod/mongos進程ID寫入指定的文件,若是不指定,將不會建立PID文件。
二、net:
bindIp: <127.0.0.1>
描述:mongod/monogs進程綁定的IP,application經過此IP、port創建連接。能夠綁定在任意網卡接口上,若是你的mongos/mongod只須要內網訪問,能夠綁定在內網IP(例如:192.168.1.100),若是須要外網訪問,那麼則綁定外網IP,若是此值爲「0.0.0.0」,則綁定到全部接口即內網、外網IP都可以訪問。(不建議)能夠綁定都多個ip上,ip地址之間用「,」分割。
port: 27017
描述:mongod/mongos偵聽端口,默認爲27017;不過由於mongodb有2種典型的架構模式:replica set和sharding,若是開發者在一個節點上部署多個mongod實例,須要注意修改此端口以免衝突。
maxIncomingConnections: 65536
描述:mongod/mongos進程容許的最大鏈接數,若是此值超過操做系統配置的鏈接數閥值,將不會生效(ulimit);默認值爲65536。一般客戶端將會使用鏈接池機制,能夠有效的控制每一個客戶端的連接個數。
wireObjectCheck: true
描述:當客戶端寫入數據時,mongos/mongod是否檢測數據的有效性(BSON),若是數據格式不良,此insert、update操做將會被拒絕;默認值爲true
ipv6: false
描述:是否支持mongos/mongod多個實例之間使用IPV6網絡,默認值爲false。此值須要在整個cluster中保持一致。
三、storage:
dbPath: db
描述:mongod進程存儲數據目錄,此配置僅對mongod進程有效。默認值爲:/data/db。
indexBuildRetry: true
描述:當構建索引時mongod意外關閉,那麼再次啓動是否從新構建索引;索引構建失敗,mongod重啓後將會刪除還沒有完成的索引,可是否重建由此參數決定。默認值爲true。
repairPath: _tmp
描述:配合--repair啓動命令參數,在repair期間使用此目錄存儲臨時數據,repair結束後此目錄下數據將被刪除,此配置僅對mongod進程有效。不建議在配置文件中配置,而是使用mongod啓動命令指定。
engine: mmapv1
描述:存儲引擎類型,mongodb 3.0以後支持「mmapv1」、「wiredTiger」兩種引擎,默認值爲「mmapv1」;官方宣稱wiredTiger引擎更加優秀。
journal:
enabled: true
描述:是否開啓journal日誌持久存儲,journal日誌用來數據恢復,是mongod最基礎的特性,一般用於故障恢復。64位系統默認爲true,32位默認爲false,建議開啓,僅對mongod進程有效。
directoryPerDB: false
描述:是否將不一樣DB的數據存儲在不一樣的目錄中,dbPath的子目錄,目錄名爲db的名稱。對已經存儲數據的mongod修改此值,須要首先使用mongodump指令將數據導出,而後關閉mongod,再修改此值和指定新的dbPath,而後使用mongorestore指令從新導入數據。(即導出數據,並使用mongorestore將數據從新寫入mongod的新目錄中)
對於replica set架構模式,只須要在每一個secondary依次操做:關閉secondary,而後配置新的dbPath,而後啓動便可(會執行初始化sync,從primary中將數據去徹底同步到本地)。最後操做primary。
此參數僅對mongod進程有效,默認值爲false,不建議修改此值
syncPeriodSecs: 60
描述:mongod使用fsync操做將數據flush到磁盤的時間間隔,默認值爲60(單位:秒),強烈建議不要修改此值;mongod將變動的數據寫入journal後再寫入內存,並間歇性的將內存數據flush到磁盤中,即延遲寫入磁盤,有效提高磁盤效率。此指令不影響journal存儲,僅對mongod有效。
mmapv1:(以下配置僅對MMAPV1引擎生效)
quota:
enforced: false
描述:配額管理,是否限制每一個DB所能持有的最大文件數量,僅對mongod有效,默認值爲false,建議保持默認值。
maxFilesPerDB: 8
描述:若是enforce開啓,每一個DB所持有的存儲文件不會超過此閥值。僅對mongod進程有效。
smallFiles: false
描述:是否使用小文件存儲數據;若是此值爲true,mongod將會限定每一個數據文件的大小爲512M(默認最大爲2G),journal下降到128M(默認爲1G)。若是DB的數據量較大,將會致使每一個DB建立大量的小文件,這對性能有必定的影響。在production環境下,不建議修改此值,在測試時能夠設置爲true,節約磁盤。
journal:
commitIntervalMs: 100
描述:mongod進程提交journal日誌的時間間隔,即fsync的間隔。考慮到磁盤效能,mongod間歇性的flush日誌數據;此值越小,數據丟失的可能性越低,磁盤消耗越大,性能越低。若是但願write操做強制當即寫入journal,能夠傳遞參數選項「j:true」(在客戶端write操做中指定此選項便可),此操做(包括此前還沒有提交的)將會當即fsync到磁盤。僅對mongod有效,單位:毫秒
nsSize: 每一個database的namespace文件的大小,默認爲16,單位:M;最大值能夠設置爲2048,即dbpath下「.ns」後綴文件的大小。16M基本上能夠保存24000條命名條目,新建一個collection或者index信息,即會增長一個namespace條目;若是你的database下須要建立大量的collection(好比數據分析),則能夠適度調大此值。
wiredTiger:(以下配置僅對wiredTiger引擎生效(3.0以上版本)
engineConfig:
cacheSizeGB: 8
描述:wiredTiger緩存工做集(working set)數據的內存大小,單位:GB,此值決定了wiredTiger與mmapv1的內存模型不一樣,它能夠限制mongod對內存的使用量,而mmapv1則不能(依賴於系統級的mmap)。默認狀況下,cacheSizeGB的值爲假定當前節點只部署一個mongod實例,此值的大小爲物理內存的一半;若是當前節點部署了多個mongod進程,那麼須要合理配置此值。若是mongod部署在虛擬容器中(好比,lxc,cgroups,Docker)等,它將不能使用整個系統的物理內存,則須要適當調整此值。默認值爲物理內存的一半。
journalCompressor: snappy
描述:journal日誌的壓縮算法,可選值爲「none」、「snappy」、「zlib」。
directoryForIndexes: false
描述:是否將索引和collections數據分別存儲在dbPath單獨的目錄中。即index數據保存「index」子目錄,collections數據保存在「collection」子目錄。默認值爲false,僅對mongod有效。
collectionConfig:
blockCompressor: snappy
描述:collection數據壓縮算法,可選值「none」、「snappy」、「zlib」。開發者在建立collection時能夠指定值,以覆蓋此配置項。若是mongod中已經存在數據,修改此值不會帶來問題,舊數據仍然使用原來的算法解壓,新數據文件將會採用新的解壓縮算法。
indexConfig:
prefixCompression: true
描述:是否對索引數據使用「前綴壓縮」(prefix compression,一種算法)。前綴壓縮,對那些通過排序的值存儲,有很大幫助,能夠有效的減小索引數據的內存使用量。默認值爲true。
四、operationProfiling:
slowOpThresholdMs: 100
描述:數據庫profiler斷定一個操做是「慢查詢」的時間閥值,單位毫秒;mongod將會把慢查詢記錄到日誌中,即便profiler被關閉。當profiler開啓時,慢查詢記錄還會被寫入「system.profile」這個系統級的collection中。請參看mongod profiler相關文檔。默認值爲100,此值只對mongod進程有效。
mode: off
描述:數據庫profiler級別,操做的性能信息將會被寫入日誌文件中,可選值:
1)off:關閉profiling
2)slowOp:on,只包含慢操做日誌
3)all:on,記錄全部操做
數據庫profiling會影響性能,建議只在性能調試階段開啓。此參數僅對mongod有效。
五、replication:(複製集架構模式配置,若是隻是單點,則無需配置)
oplogSizeMB: 10240
描述:replication操做日誌的最大尺寸,單位:MB。mongod進程根據磁盤最大可用空間來建立oplog,好比64位系統,oplog爲磁盤可用空間的5%,一旦mongod建立了oplog文件,此後再次修改oplogSizeMB將不會生效。此值不要設置的過小, 應該足以保存24小時的操做日誌,以保證secondary有充足的維護時間;若是過小,secondary將不能經過oplog來同步數據,只能全量同步。此值僅對mongod有效。
enableMajorityReadConcern: false
描述:是否開啓readConcern的級別爲「majority」,默認爲false;只有開啓此選項,才能在read操做中使用「majority」。(3.2+版本)
replSetName: <無默認值>
描述:「複製集」的名稱,複製集中的全部mongd實例都必須有相同的名字,sharding分佈式下,不一樣的sharding應該使用不一樣的replSetName。僅對mongod有效。
secondaryIndexPrefetch: all
描述:只對mmapv1存儲引擎有效。複製集中的secondary,從oplog中運用變動操做以前,將會先把索引加載到內存中,默認狀況下,secondaries首先將操做相關的索引加載到內存,而後再根據oplog應用操做。可選值:
1)none:secondaries不將索引數據加載到內容
2)all:sencondaries將此操做有關的索引數據加載到內存
3)_id_only:只加載_id索引
默認值爲:all,此配置僅對mongod有效。
localPingThresholdMs: 15
描述:ping時間,單位:毫秒,mongos用來斷定將客戶端read請求發給哪一個secondary。僅對mongos有效。默認值爲15,和客戶端driver中的默認值同樣。當mongos接收到客戶端read請求,它將:
一、找出複製集中ping值最小的member。
二、將延遲值被此值容許的members,構建一個列表
三、從列表中隨機選擇一個member。
ping值是動態值,每10秒計算一次。mongos將客戶端請求轉發給延遲較小(與此值相比)的某個secondary節點。僅對mongos有效。
六、sharding:(僅對sharding架構模式下有效)
clusterRole: <無默認值>
描述:在sharding集羣中,此mongod實例的角色,可選值:
一、configsvr:此實例爲config server,此實例默認偵聽27019端口
二、shardsvr:此實例爲shard(分片),偵聽27018端口
此配置僅對mongod有效。一般config server和sharding server須要使用各自的配置文件。
archiveMovedChunks: true
描述:當chunks由於「負載平衡」而遷移到其餘節點時,mongod是否將這些chunks歸檔,並保存在dbPath下「moveChunk」目錄下,mongod不會刪除moveChunk下的文件。默認爲true。
autoSplit: true
描述:是否開啓sharded collections的自動分裂,僅對mongos有效。若是全部的mongos都設定爲false,那麼collections數據增加但不能分裂成新的chunks。由於集羣中任何一個mongos進程均可以觸發split,因此此值須要在全部mongos行保持一致。僅對mongos有效。
configDB: <無默認值>
描述:設定config server的地址列表,每一個server地址之間以「,」分割,一般sharded集羣中指定1或者3個config server。(生產環境,一般是3個config server,但1個也是能夠的)。全部的mongos實例必須配置同樣,不然可能帶來沒必要要的問題。僅對mongos有效。
chunkSize: 64
描述:sharded集羣中每一個chunk的大小,單位:MB,默認爲64,此值對於絕大多數應用而言都是比較理想的。chunkSize太大會致使分佈不均,過小會致使分裂成大量的chunk而常常移動
##整個sharding集羣中,此值須要保持一致,集羣啓動後修改此值將再也不生效。僅對mongos有效。
七、sytemsLog:(系統日誌,必須配置)
verbosity: 0
描述:日誌級別,0:默認值,包含「info」信息,1~5,即大於0的值均會包含debug信息
quiet: true
描述:"安靜",此時mongod/mongos將會嘗試減小日誌的輸出量。不建議在production環境下開啓,不然將會致使跟蹤錯誤比較困難。
traceAllExceptions: true
描述:打印異常詳細信息。
path: logs/mongod.log
logAppend: false
描述:若是爲true,當mongod/mongos重啓後,將在現有日誌的尾部繼續添加日誌。不然,將會備份當前日誌文件,而後建立一個新的日誌文件;默認爲false。
logRotate: rename
描述:日誌「迴轉」,防止一個日誌文件特別大,則使用logRotate指令將文件「迴轉」,可選值:
1)rename:重命名日誌文件,默認值。
2)reopen:使用linux日誌rotate特性,關閉並從新打開此日誌文件,能夠避免日誌丟失,可是logAppend必須爲true。
destination: file
描述:日誌輸出目的地,能夠指定爲「 file」或者「syslog」,表述輸出到日誌文件,若是不指定,則會輸出到標準輸出中(standard output)。
八、與安全有關的配置(摘要介紹)
1)authorization:disabled或者enabled,僅對mongod有效;表示是否開啓用戶訪問控制(Access Control),即客戶端能夠經過用戶名和密碼認證的方式訪問系統的數據,默認爲「disabled」,即客戶端不須要密碼便可訪問數據庫數據。(限定客戶端與mongod、mongos的認證)
2)clusterAuthMode:集羣中members之間的認證模式,可選值爲「keyFile」、「sendKeyFile」、「sendX509」、「x509」,對mongod/mongos有效;默認值爲「keyFile」,mongodb官方推薦使用x509,不過我我的以爲仍是keyFile比較易於學習和使用。不過3.0版本中,mongodb增長了對TLS/SSL的支持,若是能夠的話,建議使用SSL相關的配置來認證集羣的member,此文將再也不介紹。(限定集羣中members之間的認證)
3)keyFile:當clusterAuthMode爲「keyFile」時,此參數指定keyfile的位置,mongodb須要有訪問此文件的權限。
4)javascriptEnabled:true或者false,默認爲true,僅對mongod有效;表示是否關閉server端的javascript功能,就是是否容許mongod上執行javascript腳本,若是爲false,那麼mapreduce、group命令等將沒法使用,由於它們須要在mongod上執行javascript腳本方法。若是你的應用中沒有mapreduce等操做的需求,爲了安全起見,能夠關閉javascript。
「setParameter」容許指定一些的Server端參數,這些參數不依賴於存儲引擎和交互機制,只是微調系統的運行狀態,好比「認證機制」、「線程池參數」等。參見【parameter】
1)enableLocalhostAuthBypass:true或者false,默認爲true,對mongod/mongos有效;表示是否開啓「localhost exception」,對於sharding cluster而言,咱們傾向於在mongos上開啓,在shard節點的mongod上關閉。
2)authenticationMechanisms:認證機制,可選值爲「SCRAM-SHA-1」、「MONGODB-CR」、「PLAN」等,建議爲「SCRAM-SHA-1」,對mongod/mongos有效;一旦選定了認證機制,客戶端訪問databases時須要與其匹配纔能有效。
九、與性能有關的參數
1)connPoolMaxShardedConnsPerHost:默認值爲200,對mongod/mongos有效;表示當前mongos或者shard與集羣中其餘shards連接的連接池的最大容量,此值咱們一般不會調整。鏈接池的容量不會阻止建立新的連接,可是從鏈接池中獲取連接的個數不會超過此值。維護鏈接池須要必定的開支,保持一個連接也須要佔用必定的系統資源。
2)connPoolMaxConnsPerHost:默認值爲200,對mongod/mongos有效;同上,表示mongos或者mongod與其餘mongod實例之間的鏈接池的容量,根據host限定。
2、配置樣例
mongodb 3.0以後配置文件採用YAML格式,這種格式很是簡單,使用<key>:<value>表示,開頭使用「空格」做爲縮進。須要注意的是,「:」以後有value的話,須要緊跟一個空格,若是key只是表示層級,則無需在「:」後增長空格(好比:systemLog:後面既不須要空格)。按照層級,每行4個空格縮進,第二級則8個空格,依次輪推,頂層則不須要空格縮進。若是格式不正確,將會出現以下錯誤:
一、mongod.conf
若是你的架構模式爲replication Set,那麼還須要在全部的「複製集」members上增長以下配置:
若是爲sharding Cluster架構,則須要在shard節點增長以下配置:
固然,一個mongod實例便可覺得「複製集」的member之一,也能夠做爲sharding集羣中的一個分片,這取決你的架構模式。
mongod進程能夠作爲「config server」實例,只須要將「clusterRole: configsvr」便可;因而可知,一個mongod實例能夠爲「單點實例」、「config server」、「sharding server」 + 「replication set member」其中一個角色,建議使用不一樣的配置文件啓動它。
二、mongos.conf
mongos實例不須要存儲實際的數據,對內存有必定的消耗,在sharding架構模式下使用;mongos需接收向客戶端請求(後端的sharded和replication set則不須要讓客戶端知道),它能夠將客戶端請求轉發到一個分片集羣上(分片集羣基於複製集)延遲相對較小的secondary上,同時還負責chunk的分裂和遷移工做。
3、其餘
一、啓動與關閉
配置文件中絕大部分參數,均可以經過進程啓動命令指定,一般啓動命令行中的參數將覆蓋配置文件中的參數。
固然,也能夠經過使用多個命令行參數來啓動,以下僅爲示例:
mongod配置中所指定的目錄地址必須首先建立,不然將沒法啓動,這有別與其餘系統。
mongos啓動方式同上。若是但願基於service方式啓動mongod、mongos,請參考其餘文檔。
能夠經過kill指令來關閉mongod進程,不過這種方式有些粗暴,在production環境中可能會致使數據損壞,建議使用mongo shell來「cleanly」關閉mongod進程,這種方式安全並且不會致使數據損壞。
可使用「kill <mongod process ID>」的方式關閉,這種方式也是「cleanly」;若是使用「kill -9 」方式就是強制線程退出,可能會致使數據丟失。若是在非fork下運行mongod,直接在shell上使用「CTRL-C」方式也是「cleanly」退出。對於線上環境,最好不要「kill -9」。
二、repair
「修復」數據庫,當mongodb運行一段時間以後,特別是通過大量刪除、update操做以後,咱們可使用repair指令對數據存儲進行「repair」,它將整理、壓縮底層數據存儲文件,重用磁盤空間,至關於數據從新整理了一遍,對數據優化有必定的做用。
若是mongod沒有開啓journaling日誌功能,repair指令能夠在系統異常crash以後,用於整理數據、消除損壞數據;若是開啓了journaling日誌功能,咱們則需不要使用repair來修復數據,由於journal就能夠幫助mongod恢復數據。在replication set模式下,可使用repair,可是一般能夠直接刪除舊數據,使用「數據同步」操做,便可達到「恢復」、「整理」數據的目的,效果和repair同樣,並且效率更高。
repair須要磁盤有必定的剩餘空間,爲當前database數據量 + 2GB,能夠經過使用「--repairpath」來指定repair期間存儲臨時數據的目錄。repair指令還會重建indexes,能夠下降索引的數據大小。
若是mongod意外crash,須要首先正常啓動mongod,讓根據journal日誌恢復完數據以後,才能執行repair;若是journal日誌有數據還沒有恢復,那麼使用repair指令啓動mongod將會失敗。
repair時須要關閉mongod進程,執行完畢後再啓動。
mongodb比較傾向於使用shell來repair特定的database,這個操做相對比較可控,其內部工做機制同樣。
三、mongodump與mongorestore
咱們一般會使用到mongodb數據的備份功能,或者將一個備份導入到一個新的mongod實例中(數據冷處理),那麼就須要藉助這兩個指令。
mongodump將整個databases所有內容導出到一個二進制文件中,能夠在其餘mongod使用mongorestore來加載整個文件。須要注意mongodump不會導出「local」數據庫中的數據,固然這個local庫對恢復數據也沒有太大意義。
「-u」參數指定訪問database的用戶名,「-p」指定密碼,「--host」和「--port」指定mongod實例的位置,「--db」指定須要dump的數據庫,若是不指定則dump全部數據庫,「--collection」指定須要dump的集合表,若是不指定則dumpl整個db下的全部collections;「--query <json>」指定dump時的查詢條件,「--out」指定結果輸出文件的路徑:
mongorestore則將dump的數據文件導入到database,mongorestore能夠建立新的database或者將數據添加到現有的database中。若是將數據restore到已經存在的database中,mongorestore僅執行insert,不會執行update,若是數據庫中已經存在相同的「_id」數據,mongorestore不會覆蓋原有的document。mongorestore會從新建立indexes,全部的操做都是insert而不會update。
基本指令相似於mongodump,「--db」指定須要將數據restore到哪一個db中,若是此db不存在,則建立;若是沒有指定「--db」,mongorestore則根據原始數據所屬的db從新建立,這可能會致使數據覆蓋。「--drop」表示在restore數據以前,首先刪除目標db中原有的collections,--drop不會刪除那些在dump文件中沒有的collection。「--stopOnError」表示出錯時強制退出。
四、mongoimport和mongoexport
mongoexport將數據導出爲JSON或者CSV格式,以便其餘應用程序解析。
由於mongodb數據是BSON格式,有些數據類型是JSON不具備的,因此導出JSON格式會仍然會丟失數據類型;因此若是導出的數據是準備給其餘mongodb恢復數據,那麼建議使用mongodump和mongorestore。
命令參數同3)
五、mongostat指令能夠間歇性的打印出當前mongod實例中「數據存儲」、「flush」、讀寫次數、網絡輸出等參數,是查看mongod性能的有效手段。mongotop能夠根據查看各個database下讀寫狀況。
更多關於mongodb的運維操做,稍後介紹。
六、mongo shell操做簡述:
1)help:列出全部的function
2)show dbs:展現當前實例中全部的databases。
3)use <dbname>:切換到指定的db,接下來的操做將會在此db中。
4)show collections:展現出當前db中全部的collections。
5)show users:展現當前db中已經添加的全部用戶。
6)show roles:展現當前db中全部內置的或者自定義的用戶角色。
7)show profile:這涉及到profile相關的配置,默認狀況下展現出最近5個操做耗時超過1秒的操做,一般用於跟蹤慢查詢。
8)db.help():展現出能夠在db上進行的操做function。
9)db.<collection>.help():展現出能夠在colleciton上進行的操做。