MongoDB 設定ファイルのオプション

スポンサーリンク

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>

タイトルとURLをコピーしました