MongoDB

提供: ArchWiki
2022年5月3日 (火) 23:12時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎NUMA: 翻訳)
ナビゲーションに移動 検索に移動

MongoDB (由来は humongous から) はオープンソースのドキュメント指向データベースです。MongoDB Inc. (旧 10gen) によって開発・サポートされています。MongoDB はデータベースシステムの NoSQL ファミリーの一員です。"古典的"なリレーショナルデータベースでそうあるように、データをテーブルに保存する代わりに、MongoDB は動的なスキーマ (MongoDB では BSON と呼称されるフォーマット) によって JSON ライクなドキュメントとして構造的データを保存して、特定のタイプのアプリケーションでデータを簡単かつ高速に扱えるようにします。

インストール

MongoDB は再ライセンス上の問題により公式リポジトリから削除されました [1]

PKGBUILDAUR で提供されています:

  • mongodbAUR - ソースコードからビルドします。180GB 以上のディスク空き領域が必要で、おそらくビルドに数時間かかります。(例: Intel i7 で6.5時間、ハイエンドの NVMe と 32 Xeon cores で1時間。)
  • mongodb-binAUR - ビルド済みの MongoDB バイナリを公式 MongoDB Ubuntu リポジトリから抽出します。ビルドに使用されたコンパイラオプションは不明です。

選んだメインの PKGBUILD に対応する、AUR にある PKGBUILD を使ってツール(mongoimportmongoexportmongodumpmongorestore など) をインストールしてください:

使用方法

mongodb.service デーモンを起動・有効化します。

ノート: mongodb サービスは初回起動時に大きいファイルを作成することにより領域を事前に確保します(ジャーナルや他のデータ用)。この処理には時間が掛かり、その間、MongoDB シェルは使用不能となります。

データベースシェルにアクセスするには、ターミナルに以下を入力:

$ mongo

または、認証設定がなされている場合:

$ mongo -u userName

Configuration

ファイルのフォーマット

MongoDB は 設定ファイルに YAML ベースのフォーマットを使用します。利用可能な設定オプションについては https://docs.mongodb.com/manual/reference/configuration-options/ を見てください。

/etc/mongodb.conf
systemLog:
   destination: file
   path: "/var/log/mongodb/mongod.log"
   logAppend: true
storage:
   journal:
      enabled: true
processManagement:
   fork: true
net:
   bindIp: 127.0.0.1
   port: 27017
setParameter:
   enableLocalhostAuthBypass: false
..


認証を要求する

警告: デフォルトでは MongoDB は認証を要求しません。MongoDB はデフォルトで localhost のインターフェイスのみをリッスンしますが、これでもローカルなユーザは認証せずに接続でき、データベースを晒すことになるかもしれません。望ましくないアクセスを防ぐためにアクセス制御を有効化することをおすすめします。

管理者のアクセス権を持つ MongoDB のユーザアカウントを作るには[2]:

$ mongosh
use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

以下を /etc/mongodb.conf追加してください:

/etc/mongodb.conf
security:
  authorization: "enabled"

mongodb.service再起動してください。

NUMA

MongoDB を Non-Uniform Access Memory (NUMA) で実行するとパフォーマンスに大きな影響を与えることがあります。[3]

システムが NUMA を使用しているかどうかを確認するには:

# dmesg | grep -i numa

また、NUMA が使用中で MongoDB が numactl を通して起動されていない場合、/var/log/mongodb/mongod.log に警告が残ります。(mongo シェルもこの警告を表示しますが、認証を有効化していない場合に限ります。)

システムが NUMA を使用している場合、パフォーマンスを向上させるためには MongoDB を numactl を通して起動させる必要があります。

インストールしたパッケージに合わせて mongodb.service編集してください。

mongodbAUR を使用している場合、

ExecStart=/usr/bin/mongod $OPTIONS

から

ExecStart=/usr/bin/numactl --interleave=all /usr/bin/mongod $OPTIONS

のように変更してください。 mongodb-binAUR を使用している場合、

ExecStart=/usr/bin/mongod --quiet --config /etc/mongodb.conf

から

ExecStart=/usr/bin/numactl --interleave=all /usr/bin/mongod --quiet --config /etc/mongodb.conf

のように変更してください。 ゾーンの回収も無効化する必要がありますが、arch では /proc/sys/vm/zone_reclaim_mode はデフォルトで 0 となっています。

必要に応じて mongodb.service再有効化再起動してください。

Clean Start and Stop

By default, systemd immediately kills anything after asking it to start or stop, if it has not finished doing so within 90 seconds.

mongodbAUR makes systemd wait as long as it takes for MongoDB to start, but mongodb-binAUR does not. Both packages allow systemd to kill MongoDB after it is asked to stop, if it has not finished within 90 seconds.

Large MongoDB databases can take a considerable amount of time to cleanly shut down, especially if swap is being used. (An active 450GB database on a top of the line NVMe with 64GB RAM and 16GB swap can take an hour to shut down.)

By default, MongoDB uses journaling. [4] With journaling, an unclean shutdown should not pose a risk of data loss. But, if not shutdown cleanly, large MongoDB databases can take a considerable amount of time to start back up. In this case, choosing whether to require a clean shutdown is a choice of a slower shutdown versus a slower startup. [5]

警告: If you disable journaling, failing to require a clean shutdown severely risks data loss, so you really need to require a clean shutdown. [6]

To prevent systemd from killing MongoDB after 90 seconds, edit mongodb.service.

To allow MongoDB to cleanly shutdown, append to the [Service] section: (On large databases, this may substantially slow down your system shutdown time, but speeds up your next MongoDB start time)

TimeoutStopSec=infinity

If MongoDB needs a long time to start back up, it can be very problematic for systemd to keep killing and restarting it every 90 seconds [7], so mongodbAUR prevents this. If using mongodb-binAUR, to make systemd wait as long as it takes for MongoDB to start, append to the [Service] section:

TimeoutStartSec=infinity

トラブルシューティング

MongoDB が起動しない

データベースのパスが正しく設定されているか確認してください:

$ cat /usr/lib/systemd/system/mongodb.service

"ExecStart" 行に "--dbpath /var/lib/mongodb" を追加してください:

ExecStart=/usr/bin/numactl --interleave=all mongod --quiet --config /etc/mongodb.conf --dbpath /var/lib/mongodb

最低でも (ジャーナルファイル用の) 3GB の空き容量があることを確認してください。容量が足りない場合 MongoDB が起動できないことがあります (その場合ユーザーにメッセージは表示されません):

$ df -h /var/lib/mongodb/

ロックファイルが存在しないかどうか確認:

# ls -lisa /var/lib/mongodb

ロックファイルが存在する場合、mongodb.service を停止してください。データベースのパスを指定してデータベースの修復を実行します (Arch Linux では /var/lib/mongodb/ がデフォルトの --dbpath です):

# mongod --dbpath /var/lib/mongodb/ --repair

修復が完了すると、dbpath に修復されたデータファイルと空の mongod.lock ファイルが作られます。

警告: ファイルを削除して、破損したファイルを使ってデータベースを起動して、データベースからデータの復旧を試みることもできます。ただし、データベースの状態を予想することはできません。詳しくは 上流のドキュメント を見てください。

root で修復を実行後、ファイルの所有者は root ユーザーになりますが、Arch Linux は別のユーザーで MongoDB を実行します。chown を使ってファイルの所有者を適切なユーザーに戻す必要があります (詳しくは こちら を参照):

# chown -R mongodb: /var/{log,lib}/mongodb/

mongodb の ドキュメント から設定ファイルをコピーした場合、以下の2行を削除して mongodb.service を再起動してください:

/etc/mongodb.conf
processManagement:
   fork: true

transparent_hugepage のカーネル設定について MongoDB がエラーを吐く

MongoDB の起動後、transparent_hugepage に関する警告が表示される場合、以下のファイルを編集することでシステム設定を永続的に無効化することができます (FreeDesktop tmpfiles.d マニュアル を参照):

/etc/tmpfiles.d/local.conf
w /sys/kernel/mm/transparent_hugepage/enabled - - - - never
w /sys/kernel/mm/transparent_hugepage/defrag - - - - never

sysctl を使ったり以下のように echo コマンドを使うことで一時的に無効化することもできます:

# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag

Warning about Soft rlimits too low

If you are using systemd service, then edit the unit file by systemctl edit mongodb.service:

[Service]
# Other directives omitted
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (locked-in-memory size)
LimitMEMLOCK=infinity
# (open files)
LimitNOFILE=64000
# (processes/threads)
LimitNPROC=64000

See following link for further details: Further reference