mongod.conf
$ vi /etc/mongod.conf
手冊
https://docs.mongodb.com/manual/reference/configuration-options
進程管理
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
名稱 |
說明 |
fork |
運行在后台 |
pidFilePath |
PID 文件路徑 |
網絡
net:
port: 27017
bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces.
名稱 |
說明 |
port |
端口 |
bindIp |
綁定外網 op 多個用逗號分隔 |
maxIncomingConnections |
進程允許的最大連接數 默認值為 65536 |
wireObjectCheck |
當客戶端寫入數據時 檢測數據的有效性 (BSON) 默認值為 true |
ipv6 |
默認值為 false |
存儲
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
名稱 |
說明 |
dbPath |
mongod 進程存儲數據目錄,此配置僅對 mongod 進程有效 |
indexBuildRetry |
當構建索引時 mongod 意外關閉,那么再次啟動是否重新構建索引;索引構建失敗,mongod 重啟后將會刪除尚未完成的索引,但是否重建由此參數決定。默認值為 true。 |
repairPath |
配合 --repair 啟動命令參數,在 repair 期間使用此目錄存儲臨時數據,repair 結束后此目錄下數據將被刪除,此配置僅對 mongod 進程有效。不建議在配置文件中配置,而是使用 mongod 啟動命令指定。 |
engine |
存儲引擎類型,mongodb 3.0 之后支持 “mmapv1”、“wiredTiger” 兩種引擎,默認值為“mmapv1”;官方宣稱 wiredTiger 引擎更加優秀。 |
journal |
是否開啟 journal 日志持久存儲,journal 日志用來數據恢復,是 mongod 最基礎的特性,通常用於故障恢復。64 位系統默認為 true,32 位默認為 false,建議開啟,僅對 mongod 進程有效。 |
directoryPerDB |
是否將不同 DB 的數據存儲在不同的目錄中 默認值為 false |
syncPeriodSecs |
mongod 使用 fsync 操作將數據 flush 到磁盤的時間間隔,默認值為 60(單位:秒)強烈建議不要修改此值 mongod 將變更的數據寫入 journal 后再寫入內存,並間歇性的將內存數據 flush 到磁盤中,即延遲寫入磁盤,有效提升磁盤效率 |
mmapv1 |
僅對 MMAPV1 引擎 |
quota: |
|
enforced:false |
配額管理,是否限制每個 DB 所能持有的最大文件數量 默認值為 false |
maxFilesPerDB:8 |
如果 enforce 開啟,每個 DB 所持有的存儲文件不會超過此閥值 |
smallFiles: false |
是否使用小文件存儲數據;如果此值為 true mongod 將會限定每個數據文件的大小為 512M(默認最大為 2G),journal 降低到 128M(默認為 1G)。如果 DB 的數據量較大,將會導致每個 DB 創建大量的小文件,這對性能有一定的影響。在 production 環境下,不建議修改此值,在測試時可以設置為 true,節約磁盤。 |
journal: |
|
commitIntervalMs: 100 |
mongod 進程提交 journal 日志的時間間隔,即 fsync 的間隔。單位:毫秒 |
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 來同步數據,只能全量同步。 |
enableMajorityReadConcern: false |
是否開啟 readConcern 的級別為 “majority”,默認為 false;只有開啟此選項,才能在 read 操作中使用 “majority”。(3.2 + 版本) |
replSetName: <無默認值> |
“復制集” 的名稱,復制集中的所有 mongd 實例都必須有相同的名字,sharding 分布式下,不同的 sharding 應該使用不同的 replSetName |
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 請求,它將: |
1、找出復制集中 ping 值最小的 member。 |
|
2、將延遲值被此值允許的 members,構建一個列表 |
|
3、從列表中隨機選擇一個 member。 |
|
ping 值是動態值,每 10 秒計算一次。mongos 將客戶端請求轉發給延遲較小(與此值相比)的某個 secondary 節點。 |
sharding 架構
sharding:
名稱 |
說明 |
clusterRole: <無默認值> |
在 sharding 集群中,此 mongod 實例的角色,可選值: |
1、configsvr:此實例為 config server,此實例默認偵聽 27019 端口 |
|
2、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 實例必須配置一樣,否則可能帶來不必要的問題。 |
chunkSize: 64 |
sharded 集群中每個 chunk 的大小,單位:MB,默認為 64,此值對於絕大多數應用而言都是比較理想的。chunkSize 太大會導致分布不均,太小會導致分裂成大量的 chunk 而經常移動. 整個 sharding 集群中,此值需要保持一致,集群啟動后修改此值將不再生效。 |
系統日志
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
名稱 |
說明 |
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) |
與安全有關的配置
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /srv/mongodb/keyfile
javascriptEnabled: true
setParameter:
enableLocalhostAuthBypass: true
authenticationMechanisms: SCRAM-SHA-1
名稱 |
說明 |
authorization |
disabled 或者 enabled,僅對 mongod 有效;表示是否開啟用戶訪問控制(Access Control),即客戶端可以通過用戶名和密碼認證的方式訪問系統的數據,默認為 “disabled”,即客戶端不需要密碼即可訪問數據庫數據。(限定客戶端與 mongod、mongos 的認證) |
clusterAuthMode |
集群中 members 之間的認證模式,可選值為 “keyFile”、“sendKeyFile”、“sendX509”、“x509”,對 mongod/mongos 有效;默認值為 “keyFile”,mongodb 官方推薦使用 x509,不過我個人覺得還是 keyFile 比較易於學習和使用。不過 3.0 版本中,mongodb 增加了對 TLS/SSL 的支持,如果可以的話,建議使用 SSL 相關的配置來認證集群的 member,此文將不再介紹。(限定集群中 members 之間的認證) |
keyFile |
當 clusterAuthMode 為 “keyFile” 時,此參數指定 keyfile 的位置,mongodb 需要有訪問此文件的權限。 |
javascriptEnabled |
true 或者 false,默認為 true,僅對 mongod 有效;表示是否關閉 server 端的 javascript 功能,就是是否允許 mongod 上執行 javascript 腳本,如果為 false,那么 mapreduce、group 命令等將無法使用,因為它們需要在 mongod 上執行 javascript 腳本方法。如果你的應用中沒有 mapreduce 等操作的需求,為了安全起見,可以關閉 javascript。 |
setParameter |
允許指定一些的 Server 端參數,這些參數不依賴於存儲引擎和交互機制,只是微調系統的運行狀態,比如 “認證機制”、“線程池參數” 等。參見【parameter】 |
enableLocalhostAuthBypass |
true 或者 false,默認為 true,對 mongod/mongos 有效;表示是否開啟 “localhost exception”,對於 sharding cluster 而言,我們傾向於在 mongos 上開啟,在 shard 節點的 mongod 上關閉。 |
authenticationMechanisms |
認證機制,可選值為 “SCRAM-SHA-1”、“MONGODB-CR”、“PLAN” 等,建議為“SCRAM-SHA-1”,對 mongod/mongos 有效;一旦選定了認證機制,客戶端訪問 databases 時需要與其匹配才能有效。 |
性能有關的參數
setParameter:
connPoolMaxShardedConnsPerHost: 200
connPoolMaxConnsPerHost: 200
notablescan: 0
名稱 |
說明 |
connPoolMaxShardedConnsPerHost |
默認值為 200,對 mongod/mongos 有效;表示當前 mongos 或者 shard 與集群中其他 shards 鏈接的鏈接池的最大容量,此值我們通常不會調整。連接池的容量不會阻止創建新的鏈接,但是從連接池中獲取鏈接的個數不會超過此值。維護連接池需要一定的開支,保持一個鏈接也需要占用一定的系統資源。 |
connPoolMaxConnsPerHost |
默認值為 200,對 mongod/mongos 有效;同上,表示 mongos 或者 mongod 與其他 mongod 實例之間的連接池的容量,根據 host 限定。 |
配置樣例
systemLog:
quiet: false
path: /data/mongodb/logs/mongod.log
logAppend: false
destination: file
processManagement:
fork: true
pidFilePath: /data/mongodb/mongod.pid
net:
bindIp: 127.0.0.1
port: 27017
maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
storage:
dbPath: /data/mongodb/db
indexBuildRetry: true
journal:
enabled: true
directoryPerDB: false
engine: mmapv1
syncPeriodSecs: 60
mmapv1:
quota:
enforced: false
maxFilesPerDB: 8
smallFiles: true
journal:
commitIntervalMs: 100
wiredTiger:
engineConfig:
cacheSizeGB: 8
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
operationProfiling:
slowOpThresholdMs: 100
mode: off
如果你的架構模式為 replication Set,那么還需要在所有的 “復制集”members 上增加如下配置:
replication:
oplogSizeMB: 10240
replSetName: rs0
secondaryIndexPrefetch: all
如果為 sharding Cluster 架構,則需要在 shard 節點增加如下配置:
sharding:
clusterRole: shardsvr
archiveMovedChunks: true
systemLog:
quiet: false
path: /data/mongodb/logs/mongod.log
logAppend: false
destination: file
processManagement:
fork: true
pidFilePath: /data/mongodb/mongod.pid
net:
bindIp: 127.0.0.1
port: 37017
maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
replication:
localPingThresholdMs: 15
sharding:
autoSplit: true
configDB: m1.com:27018,m2.com:27018,m3.com:27018
chunkSize: 64
mongos 實例不需要存儲實際的數據,對內存有一定的消耗,在 sharding 架構模式下使用;mongos 需接收向客戶端請求(后端的 sharded 和 replication set 則不需要讓客戶端知道),它可以將客戶端請求轉發到一個分片集群上(分片集群基於復制集)延遲相對較小的 secondary 上,同時還負責 chunk 的分裂和遷移工作。
repair 修復
“修復” 數據庫,當 mongodb 運行一段時間之后,特別是經過大量刪除、update 操作之后,我們可以使用 repair 指令對數據存儲進行 “repair”,它將整理、壓縮底層數據存儲文件,重用磁盤空間,相當於數據重新整理了一遍,對數據優化有一定的作用。
$ ./mongod --dbpath=/data/mongodb/db --repair
mongodump 與 mongorestore
我們通常會使用到 mongodb 數據的備份功能,或者將一個備份導入到一個新的 mongod 實例中(數據冷處理),那么就需要借助這兩個指令。
-
備份
>./mongodump --host m1.com --port 27017 -u root -p pass --out /data/mongodb/backup/dump_2015_10_10
-
還原
./mongorestore --db mydatabase /data/mongodb/backup/dump_2015_10_10
mongoimport 和 mongoexport
mongoexport 將數據導出為 JSON 或者 CSV 格式,以便其他應用程序解析。
mongo shell
1)help:列出所有的 function
2)show dbs:展示當前實例中所有的 databases。
3)use :切換到指定的 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..help():展示出可以在 colleciton 上進行的操作。
原文來自:https://blog.csdn.net/MatrixGod/article/details/82585778