MongoDBの設定ファイルについて、使用頻度の高いオプションをまとめます。
前提
公式ドキュメント
参考となる公式ドキュメントを以下に示します。
動作確認済環境
- Rocky Linux 8.6
- MongoDB Server 6.0.2
systemLog
使用頻度の高い設定一覧
systemLogオプションで使用頻度の高いものをまとめます。
パラメタ | 省略時 | 意味 |
---|---|---|
verbosity | 0 | 0から5まででログの詳しさを指定。値が小さい方がログ出力が少ない |
destination | ログの出力先をファイル名またはsyslogで指定する | |
syslogFacility | syslog出力時のfacilityを指定する | |
logAppend | false | ログを加筆するか新規作成するか |
logRotate | rename | SIGUSR1シグナル受信時にログをrenameするかreopenするか |
デバッグログの動作確認
verbosityを変更し、デバッグ用途のログが出力されるかを確認します。/etc/mongod.confを以下のように編集します。
# where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log verbosity: 3 <omitted>
mongodを再起動し設定を反映させます。
systemctl restart mongod.service
ログの出力量が増えた事を確認します。
かなり激しくログ出力されますので、disk IO枯渇やディスク溢れには十分注意ください。
[root@linux010 ~]# tail -f /var/log/mongodb/mongod.log {"t":{"$date":"2022-10-21T13:26:04.503+09:00"},"s":"D3", "c":"REPL", "id":4794601, "ctx":"TopologyVersionObserver","msg":"Observed a topology change"} {"t":{"$date":"2022-10-21T13:26:04.513+09:00"},"s":"D3", "c":"REPL", "id":4794600, "ctx":"TopologyVersionObserver","msg":"Waiting for a topology change"} {"t":{"$date":"2022-10-21T13:26:04.513+09:00"},"s":"D3", "c":"REPL", "id":4794601, "ctx":"TopologyVersionObserver","msg":"Observed a topology change"} {"t":{"$date":"2022-10-21T13:26:04.518+09:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666326364,"ts_usec":518176,"thread":"3285:0x7fe1a1169700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 11/3072"}}} {"t":{"$date":"2022-10-21T13:26:04.524+09:00"},"s":"D3", "c":"REPL", "id":4794600, "ctx":"TopologyVersionObserver","msg":"Waiting for a topology change"} {"t":{"$date":"2022-10-21T13:26:04.524+09:00"},"s":"D3", "c":"REPL", "id":4794601, "ctx":"TopologyVersionObserver","msg":"Observed a topology change"} {"t":{"$date":"2022-10-21T13:26:04.534+09:00"},"s":"D3", "c":"REPL", "id":4794600, "ctx":"TopologyVersionObserver","msg":"Waiting for a topology change"}
syslog出力の動作確認
rsyslogをインストールし、rsyslogを起動します。
dnf install rsyslog systemctl start rsyslog
destinationを変更し、syslogへログが転送されるかを確認します。/etc/mongod.confを以下のように編集します。
# where to write logging data. systemLog: destination: syslog <omitted>
mongodを再起動し設定を反映させます。
systemctl restart mongod.service
rsyslog(/etc/rsyslog.confがデフォルト設定の場合は/var/log/messagesに出力される)にMongoDBのログが転送される事を確認します。
[root@linux010 ~]# tail -f /var/log/messages Oct 21 13:14:26 linux010 mongod[3098]: {"t":{"$date":"2022-10-21T13:14:26.676+09:00"},"s":"I", "c":"REPL", "id":5123008, "ctx":"main","msg":"Successfully registered PrimaryOnlyService","attr":{"service":"TenantMigrationDonorService","namespace":"config.tenantMigrationDonors"}} Oct 21 13:14:26 linux010 mongod[3098]: {"t":{"$date":"2022-10-21T13:14:26.676+09:00"},"s":"I", "c":"REPL", "id":5123008, "ctx":"main","msg":"Successfully registered PrimaryOnlyService","attr":{"service":"TenantMigrationRecipientService","namespace":"config.tenantMigrationRecipients"}} Oct 21 13:14:28 linux010 mongod[3098]: {"t":{"$date":"2022-10-21T13:14:28.069+09:00"},"s":"W", "c":"CONTROL", "id":22120, "ctx":"initandlisten","msg":"Access control is not enabled for the database. Read and write access to data and configuration is unrestricted","tags":["startupWarnings"]} Oct 21 13:14:28 linux010 mongod[3098]: {"t":{"$date":"2022-10-21T13:14:28.069+09:00"},"s":"W", "c":"CONTROL", "id":22178, "ctx":"initandlisten","msg":"/sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'","tags":["startupWarnings"]} Oct 21 13:14:28 linux010 mongod[3098]: {"t":{"$date":"2022-10-21T13:14:28.069+09:00"},"s":"W", "c":"CONTROL", "id":5123300, "ctx":"initandlisten","msg":"vm.max_map_count is too low","attr":{"currentValue":65530,"recommendedMinimum":102400,"maxConns":51200},"tags":["startupWarnings"]} Oct 21 13:14:28 linux010 mongod[3098]: {"t":{"$date":"2022-10-21T13:14:28.082+09:00"},"s":"W", "c":"SHARDING", "id":22074, "ctx":"initandlisten","msg":"Started with --shardsvr, but no shardIdentity document was found on disk. This most likely means this server has not yet been added to a sharded cluster","attr":{"namespace":"admin.system.version"}} Oct 21 13:14:28 linux010 mongod[3098]: {"t":{"$date":"2022-10-21T13:14:28.111+09:00"},"s":"I", "c":"REPL", "id":40440, "ctx":"initandlisten","msg":"Starting the TopologyVersionObserver"} Oct 21 13:14:28 linux010 mongod[3098]: {"t":{"$date":"2022-10-21T13:14:28.112+09:00"},"s":"I", "c":"REPL", "id":40445, "ctx":"TopologyVersionObserver","msg":"Started TopologyVersionObserver"} Oct 21 13:14:28 linux010 mongod[3096]: child process started successfully, parent exiting Oct 21 13:14:28 linux010 systemd[1]: Started MongoDB Database Server.
ログローテーション
デフォルト設定
まずはデフォルト設定のログローテーションの仕組みを確認します。/etc/mongod.confをテキストエディタで編集し、以下のようにデフォルト設定に戻します。
MongoDB 6.0.2時点ではデフォルトでログローテーションされない事に注意ください
# where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log <omitted>
mongodを再起動し設定を反映させます。
systemctl restart mongod.service
明記されていない省略されたパラメタ含めて解説すると、デフォルト設定はlogAppendはtrueで、logRotateはrenameです。logRotateとはMongoDBが備えるログローテションの仕組みに沿ってローテーションされた時の挙動の定義で、SIGUSR1シグナルが送られた時にローテーションが実行されます(参照:Rotate Log Files)
それでは動作確認のために、1時間毎にローテーションされるよう以下のようなcrondを定義します。
[root@linux010 ~]# crontab -l 0 * * * * /bin/kill -SIGUSR1 $(cat /var/run/mongodb/mongod.pid) [root@linux010 ~]#
ログがローテーションされた事を確認します。
[root@linux010 ~]# ls -l /var/log/mongodb/ 合計 8 -rw------- 1 mongod mongod 1827 10月 21 23:00 mongod.log -rw------- 1 mongod mongod 2384 10月 21 23:00 mongod.log.2022-10-21T14-00-01 [/root@linux010 ~]#
logrotatedと併用した場合の操作例
多くのソフトウェアはdnf(yum)でインストールを行うと、自動的にlogrotedの設定がなされます。多くのソフトウェアと同じような感じで、MongoDBのログローテーションを設定してみましょう。
以下のようなlogrotate.dを定義します。
cat << 'EOF' > /etc/logrotate.d/mongodb /var/log/mongodb/*.log { missingok notifempty rotate 4 daily postrotate /bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid 2>/dev/null` 2> /dev/null || true endscript } EOF
logrotated.confの命名に従ったファイルを生成したいので、MongoDBはローテーションせず単にログをreopenする挙動にします。logRotateを暗黙デフォルト設定のrenameからreopenに変更します。
# where to write logging data. systemLog: destination: file logAppend: true logRotate: reopen path: /var/log/mongodb/mongod.log <omitted>
mongodを再起動し設定を反映させます。
systemctl restart mongod.service
手動でlogrotateを実行します。
/usr/sbin/logrotate -f /etc/logrotate.conf
ログがローテーションされた事を確認します。
[root@linux010 ~]# ls -l /var/log/mongodb/ 合計 32 -rw------- 1 mongod mongod 1848 10月 21 19:10 mongod.log -rw------- 1 mongod mongod 26457 10月 21 19:10 mongod.log-20221021 [root@linux010 ~]#
net
使用頻度の高い設定一覧
netオプションで使用頻度の高いものをまとめます。
パラメタ | 省略時 | 意味 |
---|---|---|
port | 27017 | MongoDBがListenするポート番号を指定します。 |
bindIp | 127.0.0.1 | MongoDBがListenするIPアドレスを指定します。デフォルトではローカルホストからの接続しか許可しません。 |
maxIncomingConnections | 65536 | 最大接続数 |
Listenアドレス
デフォルト設定では、127.0.0.1:27017でListenしています。
2015年2月当時の若干古い情報ですが、警視庁からMongoDBをデフォルトポートに対する注意喚起がなされています(参照「MongoDB に対する探索行為の増加について」)。個人的にはポート番号を変えるくらいではセキュリティ対策として無意味だと思っていますが、注目度の高い事件のため意思決定に携わる人(上流担当)の人は注意喚起があった旨を頭の片隅に留めた方が良いかもしれません。
[root@linux010 ~]# netstat -anop | grep mongod tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2703/mongod off (0.00/0/0) unix 2 [ ACC ] STREAM LISTENING 33361 2703/mongod /tmp/mongodb-27017.sock [root@linux010 ~]#
MongoDBのListenするIPアドレスとポート番号を変更します。/etc/mongod.confを以下のように編集します。
<omitted> net: port: 27100 bindIp: 172.16.1.10 <omitted>
mongodを再起動し設定を反映させます。
systemctl restart mongod.service
MongoDBのListenするIPアドレスとポート番号が変わった事を確認します。
[root@linux010 ~]# netstat -anop | grep mongod tcp 0 0 172.16.1.10:27100 0.0.0.0:* LISTEN 2853/mongod off (0.00/0/0) unix 2 [ ACC ] STREAM LISTENING 35620 2853/mongod /tmp/mongodb-27100.sock [root@linux010 ~]#
最大接続数
MongoDBの最大接続数を変更します。/etc/mongod.confを以下のように編集します。
<omitted> net: port: 27017 bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses ... maxIncomingConnections: 256 <omitted>
mongodを再起動し設定を反映させます。
systemctl restart mongod.service
想定通りの接続数を受け付ける事を確認します。currentとavailableの合計がmaxIncomingConnectionsになれば想定通りです。
test> db.serverStatus().connections { current: 5, available: 251, totalCreated: 5, active: 2, threaded: 5, exhaustIsMaster: 0, exhaustHello: 1, awaitingTopologyChanges: 1 } test>
storage
使用頻度の高い設定一覧
storageオプションで使用頻度の高いものをまとめます。
パラメタ | 省略時 | 意味 |
---|---|---|
dbPath | /data/db | データベースの格納先 |
storage.journal.enabled | true | ジャーナルファイルを使用するか否か |
engine | wiredTiger | ストレージエンジンの指定 |
storage.wiredTiger.engineConfig.cacheSizeGB | 後述 | ストレージエンジンの指定 |
storage.wiredTiger.collectionConfig.blockCompressor | snappy | データベース圧縮の方式 |
ジャーナルファイル
storage.journal.enabledはジャーナルを使用するか否かです。省略時は32bit OSの場合はfalseで、64bit OSの場合はtrueです。以下に示すデフォルト設定の/etc/mongod.confのように、デフォルトの状態ではtrueになります。
<omitted> # Where and how to store data. storage: dbPath: /var/lib/mongo journal: enabled: true # engine: # wiredTiger: <omitted>
MongoDB 4.2以降では、ジャーナル無効の状態でレプリケーションを設定できなくなりました。storage.journal.enabledは、デフォルト値から変更しないように注意ください。
ストレージエンジン
MySQL等と同様に、MongoDBもストレージエンジンの指定が可能です。MongoDB version 6.0.2時点では「wiredTiger」または「inMemory」を指定できます。以前は「MMAPv1」というストレージエンジンも選択できましたが、version 4.2で廃止されています。
メモリ割り当て
wiredTigerが使用する最大キャッシュメモリの量はstorage.wiredTiger.engineConfig.cacheSizeGBで指定できます。デフォルト設定は以下の大きい値が適用されます。
- 0.5 x ( RAM – 1GB )
- 256MB
デフォルト設定を確認しましょう。以下に例示する仮想マシンには、4GBのメモリが割り当てられています。
MongoDBがOS設定をどのように認識しているかはdb.hostInfo()で確認できます。
test> db.hostInfo().system { currentTime: ISODate("2022-10-21T08:54:57.577Z"), hostname: 'linux010.gokatei.go', cpuAddrSize: 64, memSizeMB: Long("3923"), memLimitMB: Long("3923"), numCores: 2, cpuArch: 'x86_64', numaEnabled: false } test>
この仮想マシンの場合、デフォルト設定のメモリは 0.5 x ( 4GB – 1GB ) = 1.5GB になります。
圧縮方式
MongoDBのデータベースはデフォルトでsnappyと呼ばれる圧縮が有効になっています。snappy(かつてはZippyとも呼ばれる
)は圧縮率重視の方式ではなくスピード重視の圧縮です。
もし、圧縮率重視(ディスク容量節約)かスピード重視(CPUリソース節約)かのチューニングがしたいならば、storage.wiredTiger.collectionConfig.blockCompressorは以下のような設定が可能です。
- none
- snappy
- zlib (MongoDB 3.6以降)
- zstd (MongoDB 4.2以降)
/etc/mongod.confの設定例は以下のようになります。
<omitted> # Where and how to store data. storage: dbPath: /var/lib/mongo journal: enabled: true # engine: wiredTiger: collectionConfig: blockCompressor: none <omitted>