「MongoDB」の版間の差分
(→設定: タイトルを翻訳) |
細 (→完全な開始/停止: 修正) |
||
123行目: | 123行目: | ||
デフォルトでは、[[systemd]] は、サービスに開始/停止を要求して90秒経ってもその要求を完了しない場合、そのサービスを即座に kill します。 |
デフォルトでは、[[systemd]] は、サービスに開始/停止を要求して90秒経ってもその要求を完了しない場合、そのサービスを即座に kill します。 |
||
− | {{aur|mongodb}} は MongoDB の起動が完了するまで [[systemd]] を待たせますが、{{aur|mongodb-bin}} はそのようなことをしません。両パッケージは、MongoDB |
+ | {{aur|mongodb}} は MongoDB の起動が完了するまで [[systemd]] を待たせますが、{{aur|mongodb-bin}} はそのようなことをしません。両パッケージは、MongoDB に停止を要求して90秒以内にそれを完了しなかった場合、MongoDB を kill することを [[systemd]] に許可しています。 |
巨大な MongoDB データベースは、特にスワップが使用されている場合に、完全にシャットダウンするのに相当の時間がかかる可能性があります。(最上位機種の NVMe と 64GB の RAM、16 GB のスワップの環境でのアクティブな 450 GB のデータベースはシャットダウンするのに1時間かかる可能性があります。) |
巨大な MongoDB データベースは、特にスワップが使用されている場合に、完全にシャットダウンするのに相当の時間がかかる可能性があります。(最上位機種の NVMe と 64GB の RAM、16 GB のスワップの環境でのアクティブな 450 GB のデータベースはシャットダウンするのに1時間かかる可能性があります。) |
2022年5月4日 (水) 13:34時点における最新版
MongoDB (由来は humongous から) はオープンソースのドキュメント指向データベースです。MongoDB Inc. (旧 10gen) によって開発・サポートされています。MongoDB はデータベースシステムの NoSQL ファミリーの一員です。"古典的"なリレーショナルデータベースでそうあるように、データをテーブルに保存する代わりに、MongoDB は動的なスキーマ (MongoDB では BSON と呼称されるフォーマット) によって JSON ライクなドキュメントとして構造的データを保存して、特定のタイプのアプリケーションでデータを簡単かつ高速に扱えるようにします。
目次
インストール
MongoDB は再ライセンス上の問題により公式リポジトリから削除されました [1]。
- mongodbAUR - ソースコードからビルドします。180GB 以上のディスク空き領域が必要で、おそらくビルドに数時間かかります。(例: Intel i7 で6.5時間、ハイエンドの NVMe と 32 Xeon cores で1時間。)
- mongodb-binAUR - ビルド済みの MongoDB バイナリを公式 MongoDB Ubuntu リポジトリから抽出します。ビルドに使用されたコンパイラオプションは不明です。
選んだメインの PKGBUILD に対応する、AUR にある PKGBUILD を使ってツール(mongoimport
、mongoexport
、mongodump
、mongorestore
など) をインストールしてください:
- mongodb-toolsAUR
- mongodb-tools-binAUR
- mongosh-binAUR
使用方法
mongodb.service
デーモンを起動・有効化します。
データベースシェルにアクセスするには、ターミナルに以下を入力:
$ mongo
または、認証設定がなされている場合:
$ mongo -u userName
設定
ファイルのフォーマット
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 のユーザアカウントを作るには[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
を再有効化・再起動してください。
完全な開始/停止
デフォルトでは、systemd は、サービスに開始/停止を要求して90秒経ってもその要求を完了しない場合、そのサービスを即座に kill します。
mongodbAUR は MongoDB の起動が完了するまで systemd を待たせますが、mongodb-binAUR はそのようなことをしません。両パッケージは、MongoDB に停止を要求して90秒以内にそれを完了しなかった場合、MongoDB を kill することを systemd に許可しています。
巨大な MongoDB データベースは、特にスワップが使用されている場合に、完全にシャットダウンするのに相当の時間がかかる可能性があります。(最上位機種の NVMe と 64GB の RAM、16 GB のスワップの環境でのアクティブな 450 GB のデータベースはシャットダウンするのに1時間かかる可能性があります。)
デフォルトでは、MongoDB はジャーナリングを使用します。[4] ジャーナリングを使用している場合、不完全なシャットダウンでデータが消失するリスクは無いはずです。しかし、シャットダウンが不完全だった場合、巨大な MongoDB データベースは起動し直すのに相当の時間がかかる可能性があります。この場合、完全なシャットダウンを要求するかどうかの選択は、遅いシャットダウンか遅い起動のどちらか一方を選ぶということになります。[5]
90秒経っても systemd が MongoDB を kill しないようにするには、mongodb.service
を編集してください。
MongoDB が完全にシャットダウンできるようにするには、[Service]
セクションに以下を追加してください(巨大なデータベースでは、これによりシステムのシャットダウンが大幅に遅くなることがありますが、次回の起動は早くなります。):
TimeoutStopSec=infinity
MongoDB が起動し直すのに長い時間が必要になる場合、systemd が90秒ごとに MongoDB を kill して再起動させるのは大きな問題となる可能性があります [7]。なので、mongodbAUR はそうならないようにします。mongodb-binAUR を使用している場合、MongoDB が起動するまで systemd を待たせるには、[Service]
セクションに以下を追加してください:
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