BREW INSTALL MONGODB
intel、macOS 14.0、sonoma 環境で brew 4.1.14 を使用して mongoDB をインストールする手順をまとめます。
NOTE
mongoDBにはクラウドサービスがあり、free tierを提供しています。
クラウドサービスを利用する場合、mongoDBをインストールする必要はありません。- この文書では
brewを通じてmongoDBをインストールします。 - 公式ダウンロードで提供されているコマンド
brew install mongodb-atlasはクラウドユーザー向けのパッケージです。
クラウドユーザーでない場合、このパッケージをインストールする必要はありません。🟣 重要
mongodb-atlasはmongodb-atlas-cliに変更されました。 (brewドキュメント参照) - この文書は
mongoDB7.0 Docs のガイドに従ってインストールを進めます。
INSTALL
mongoDB は brew の 基本リポジトリからはインストールできません。
mongoDB が提供する リポジトリを追加する必要があります。
brew tap mongodb/brew
brew リポジトリに mongoDB が追加されます。
brew install mongodb/brew/mongodb-community
バージョンを明示せず、mongoDB が提供する安定版をインストールします。
執筆時点では 7.0.2 バージョンがインストールされます。
🔵 NOTE
バージョンを明示せずにインストールする場合、
パッケージのバージョンを確認するにはbrew infoを使用します。brew info mongodb/brew/mongodb-communityパッケージに関する情報が出力されます。
🔵 NOTE
意図的にバージョンを明示してインストールすることも可能です。
brew install mongodb/brew/mongodb-community@6.0バージョン情報を明示して古いバージョンをインストールします。
RUN
brew でインストールした後は、brew services を通じて実行できます。
brew services start mongodb/brew/mongodb-communitybrew を使用して mongoDB サービスを実行します。
brew services info mongodb/brew/mongodb-communitybrew を使用して mongoDB サービスの情報を出力します。
mongodb-community (homebrew.mxcl.mongodb-community)
Running: ✔
Loaded: ✔
Schedulable: ✘
User: xiyo
PID: 21105Running 状態が ✔ と表示されれば、正常に実行されている状態です。
直接実行するには、以下のコマンドを入力します。
$(brew --prefix)/opt/mongodb-community/bin/mongod --config $(brew --prefix)/etc/mongod.conf --fork --logpath $(brew --prefix)/var/log/mongodb/mongod.log$(brew --prefix) は brew のインストールパスが返されるため、パスになります。
--fork オプションは mongod プロセスをバックグラウンドで実行するようにします。
--logpath オプションはログファイルの位置を指定します。
バックグラウンドで実行する際は、これらの二つのオプションを同時に使用する必要があります。
⚠️ トラブルシューティング
### ERROR: Bootstrap failed: 5: Input/output error
`ssh`を通じて`macOS`に接続し、`brew services`で`mongoDB`を実行するとエラーが発生します。
```text
Warning: running over SSH, using user/* instead of gui/* domain!
Hide this warning by setting HOMEBREW_SERVICES_NO_DOMAIN_WARNING.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Bootstrap failed: 5: Input/output error
Try re-running the command as root for richer errors.
Error: Failure while executing; `/bin/launchctl bootstrap user/501 /Users/xiyo/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist` exited with 5.
エラーの説明:
-
Warning: running over SSH, using user/* instead of gui/* domain! Hide this warning by setting HOMEBREW_SERVICES_NO_DOMAIN_WARNING.sshセッションでアクセスすると、実行ドメインがguiではなくuserとして実行されるという警告メッセージです。
brewは個人ユーザーのために作られたパッケージマネージャーです。
そのためguiで実行されるべきですが、私はsshを利用して実行したため警告が発生します。
最後のメッセージは警告メッセージを隠すことができる環境変数、HOMEBREW_SERVICES_NO_DOMAIN_WARNINGを最後の行で知らせています。 -
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).HOMEBREW_NO_ENV_HINTSは環境変数で、設定するとbrewから出る環境に関連するヒントメッセージを隠すことができます。
これはコマンド出力を簡潔に保ちたいユーザーにとって便利です。
man brewを実行するとbrewのマニュアルを見られ、この環境変数に関する追加情報を得ることができます。 -
Bootstrap failed: 5: Input/output error Try re-running the command as root for richer errors. Error: Failure while executing; `/bin/launchctl bootstrap user/501 /Users/xiyo/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist` exited with 5.macOSのlaunchctlが出力するエラーです。
最下部のコマンド/bin/launchctlはbrewの実行環境に応じてGUIドメインとUSERドメインを区別します。(GUIは物理的ログインで、USERはsshのようなリモートセッションです。)
これはmacOSのコマンドであるlaunchctlの特徴であり、sshで接続した状態ではbrewがUSERドメインで実行されます。明示的に
user/501をgui/501に変更して実行すると正常に実行されます。(501はユーザーのuidです。)
しかしこの場合、gui入出力が必要な画面が表示されるとsshセッションでは進行できません。
例えばファイアウォールが有効な場合、guiで許可をする必要があります。
結局、guiドメインで実行する必要があるため、vncを利用してmacOSにリモート接続し、ターミナルでbrew servicesでmongoDBを実行しました。
🔵 NOTE
エラーメッセージの中に
Try re-running the command as root for richer errors. # 詳細なエラーを確認するために`root`で実行してください
root実行を推奨するメッセージがありますが、mongoDBはセキュリティのためrootでの実行が制限されています。
rootで実行した場合、brewのディレクトリの所有権が変更されるため、
所有権を変更するか、sudo chown -R $(whoami) $(brew --prefix)/*
brewのすべてのディレクトリとファイルの所有者が現在のユーザーに変更されます。
または明示的に$(brew --prefix)/Cellar/mongodb-communityの所有権を変更することもできます。
-Rオプションはrecursiveを意味します。
すべての下位のファイルとディレクトリに対してコマンドを適用するという意味です。削除後再インストールする方法を使用する必要があります。
brew uninstall mongodb/brew/mongodb-community
brewを利用して削除コマンドを入力すると、rootで削除すべきディレクトリを明確に教えてくれます。
```markdown
#### `PLIST`
`root`として実行して権限が変更された場合、無闇にエラー解決法だけを見ずに明確に診断しようとするなら、エラー文に見られる `plist` ファイルの内容を直接見ることができます。
> 🔵 NOTE
>
> `plist` は `macOS` で `service` を管理するファイルです。
```shell
cat /Users/xiyo/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist
macOS で使用される service を管理するファイルを現在のシェルに出力します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD plist 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>homebrew.mxcl.mongodb-community</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/mongodb-community/bin/mongod</string>
<string>--config</string>
<string>/usr/local/etc/mongod.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>WorkingDirectory</key>
<string>/usr/local</string>
<key>StandardErrorPath</key>
<string>/usr/local/var/log/mongodb/output.log</string>
<key>StandardOutPath</key>
<string>/usr/local/var/log/mongodb/output.log</string>
<key>HardResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>64000</integer>
</dict>
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>64000</integer>
</dict>
</dict>
</plist>
-
Label:- サービスの固有の識別子です。この場合、
homebrew.mxcl.mongodb-communityというラベルが与えられています。
- サービスの固有の識別子です。この場合、
-
ProgramArguments:- 実行するプログラムとその引数を明示します。
- この場合、
/usr/local/opt/mongodb-community/bin/mongodプログラムを--config /usr/local/etc/mongod.confオプションと共に実行するように設定されています。
-
RunAtLoad:- このキーが
trueに設定されていると、システムのロード時にサービスが自動的に開始されます。
- このキーが
-
KeepAlive:- このキーが
trueに設定されていると、サービスが終了してもlaunchdが自動的に再起動します。ここではfalseに設定されているため、サービスが終了すると再起動されません。
- このキーが
-
WorkingDirectory:- サービスが実行される際の作業ディレクトリを指定します。この場合、
/usr/localに設定されています。
- サービスが実行される際の作業ディレクトリを指定します。この場合、
-
StandardErrorPathとStandardOutPath:- 標準エラーと標準出力をリダイレクトするファイルパスを指定します。この場合、両方とも
/usr/local/var/log/mongodb/output.logに設定されており、すべての出力とエラーメッセージがこのファイルに記録されます。
- 標準エラーと標準出力をリダイレクトするファイルパスを指定します。この場合、両方とも
-
HardResourceLimitsとSoftResourceLimits:- サービスに対するリソース制限を設定します。ここでは
NumberOfFilesというキーでファイルディスクリプタの最大数を64000に設定しています。
- サービスに対するリソース制限を設定します。ここでは
ProgramArguments に明示された通り、同じように実行してみます。
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
mongod を直接実行し、config ファイルを明示的に指定します。
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
{"t":{"$date":"2023-10-09T10:09:26.789Z"},"s":"F", "c":"CONTROL", "id":20574, "ctx":"thread1","msg":"Error during global initialization","attr":{"error":{"code":38,"codeName":"FileNotOpen","errmsg":"Can't initialize rotatable log file :: caused by :: Failed to open /usr/local/var/log/mongodb/mongo.log"}}}
出力によると、mongod はログファイル /usr/local/var/log/mongodb/mongo.log を開けずにエラーを発生させています。
この種のエラーは主にファイルが存在しないか、またはファイルに対する書き込み権限がないときに発生します。
直接確認してみます。
ls -al /usr/local/var/log/mongodb/
directory 下のファイルを確認します。
total 24
drwxr-xr-x 4 xiyo admin 128 Oct 9 12:47 .
drwxr-xr-x 10 xiyo admin 320 Oct 9 12:23 ..
-rw------- 1 root admin 11360 Oct 9 12:47 mongo.log
-rw-r--r-- 1 root admin 0 Oct 9 12:47 output.log
出力を見ると、mongo.log ファイルの所有権が root になっています。
上で述べた brew は root で実行してはいけないというルールを破って実行したため、権限の問題が発生しています。
output.log ファイルも同様に plist で参照されるファイルなので、2つのファイルの所有権を現在のユーザーに変更します。
sudo chown -R $(whoami) /usr/local/var/log/mongodb/
すべての file に対して所有権を変更します。
そして再度実行コマンドを入力します。
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
plist と同じ実行方式で、mongod に config ファイルを直接指定して実行します。
出力が何もなく正常に動作しているか確認するために process を確認します。
ps aux | grep mongod
mongod が実行されているか確認します。
ps aux | grep mongod
root 94237 0.3 0.3 36489684 47860 ?? Ss 12:47PM 1:35.65 /usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
xiyo 12842 0.0 0.0 34121212 524 s000 S+ 7:32PM 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox mongod
出力には合計2つの process があり、下は私が実行したコマンドです。
root で実行された process が実際に稼働中の mongod です。
現在 brew は root で実行してはいけないというルールを破って実行したため、
あちこちで権限の問題が発生しています。
プロセスを終了します。
kill 94237
kill コマンドを通じてプロセスを終了します。
🔵 NOTE
killコマンドは名前とは異なり、processを正常に終了させるコマンドです。
強制終了はkill -9を使用します。
今度は再度実行してログを見ます。
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
ps aux | grep mongod
実行して process を確認します。
xiyo 13061 0.0 0.0 34126336 496 s000 R+ 7:37PM 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox mongod
出力には mongod が実行されていません。
今度は mongo.log を確認してみます。
tail /usr/local/var/log/mongodb/mongo.log
cat コマンドはすべての内容を出力するため、
tail コマンドを使用して最後の10行だけ出力します。
{"t":{"$date":"2023-10-09T19:33:33.994+09:00"},"s":"I", "c":"TENANT_M", "id":7091600, "ctx":"thread1","msg":"Starting TenantMigrationAccessBlockerRegistry"}
{"t":{"$date":"2023-10-09T19:33:33.995+09:00"},"s":"I", "c":"CONTROL", "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":12858,"port":27017,"dbPath":"/usr/local/var/mongodb","architecture":"64-bit","host":"XIYOsMini"}}
{"t":{"$date":"2023-10-09T19:33:33.995+09:00"},"s":"I", "c":"CONTROL", "id":23403, "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"7.0.2","gitVersion":"02b3c655e1302209ef046da6ba3ef6749dd0b62a","modules":[],"allocator":"system","environment":{"distarch":"x86_64","target_arch":"x86_64"}}}}
{"t":{"$date":"2023-10-09T19:33:33.995+09:00"},"s":"I", "c":"CONTROL", "id":51765, "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Mac OS X","version":"23.0.0"}}}
{"t":{"$date":"2023-10-09T19:33:33.995+09:00"},"s":"I", "c":"CONTROL", "id":21951, "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"config":"/usr/local/etc/mongod.conf","net":{"bindIp":"127.0.0.1, ::1","ipv6":true},"storage":{"dbPath":"/usr/local/var/mongodb"},"systemLog":{"destination":"file","logAppend":true,"path":"/usr/local/var/log/mongodb/mongo.log"}}}}
{"t":{"$date":"2023-10-09T19:33:34.001+09:00"},"s":"I", "c":"NETWORK", "id":5693100, "ctx":"initandlisten","msg":"Asio socket.set_option failed with std::system_error","attr":{"note":"acceptor TCP fast open","option":{"level":6,"name":261,"data":"00 04 00 00"},"error":{"what":"set_option: Invalid argument","message":"Invalid argument","category":"asio.system","value":22}}}
{"t":{"$date":"2023-10-09T19:33:34.002+09:00"},"s":"I", "c":"NETWORK", "id":5693100, "ctx":"initandlisten","msg":"Asio socket.set_option failed with std::system_error","attr":{"note":"acceptor TCP fast open","option":{"level":6,"name":261,"data":"00 04 00 00"},"error":{"what":"set_option: Invalid argument","message":"Invalid argument","category":"asio.system","value":22}}}
{"t":{"$date":"2023-10-09T19:33:34.004+09:00"},"s":"F", "c":"STORAGE", "id":28661, "ctx":"initandlisten","msg":"Unable to read the storage engine metadata file","attr":{"error":{"code":38,"codeName":"FileNotOpen","errmsg":"Failed to read metadata from /usr/local/var/mongodb/storage.bson"}}}
{"t":{"$date":"2023-10-09T19:33:34.004+09:00"},"s":"F", "c":"ASSERT", "id":23091, "ctx":"initandlisten","msg":"Fatal assertion","attr":{"msgid":28661,"file":"src/mongo/db/storage/storage_engine_metadata.cpp","line":93}}
{"t":{"$date":"2023-10-09T19:33:34.004+09:00"},"s":"F", "c":"ASSERT", "id":23092, "ctx":"initandlisten","msg":"\n\n***aborting after fassert() failure\n\n"}
出力を下から読むと、下から三行目に Unable to read the storage engine metadata file エラーメッセージがあります。
実際のファイルの所有権を確認して変更します。
ls -al /usr/local/var/mongodb/
所有権を確認します。
🔵 NOTE
varはvariableの略で、使用中に生成または変更されるファイルを保存するdirectoryです。
total 560
drwxr-xr-x 20 xiyo admin 640 Oct 9 19:33 .
drwxrwxr-x 10 xiyo admin 320 Oct 9 12:23 ..
-rw------- 1 root admin 50 Oct 9 12:47 WiredTiger
-rw------- 1 root admin 21 Oct 9 12:47 WiredTiger.lock
-rw------- 1 root admin 1471 Oct 9 19:33 WiredTiger.turtle
-rw------- 1 root admin 69632 Oct 9 19:33 WiredTiger.wt
-rw------- 1 root admin 4096 Oct 9 19:33 WiredTigerHS.wt
-rw------- 1 root admin 20480 Oct 9 19:33 _mdb_catalog.wt
-rw------- 1 root admin 20480 Oct 9 19:33 collection-0-7618419118836831796.wt
-rw------- 1 root admin 20480 Oct 9 19:33 collection-2-7618419118836831796.wt
-rw------- 1 root admin 4096 Oct 9 19:33 collection-4-7618419118836831796.wt
drwx------ 3 root admin 96 Oct 9 19:33 diagnostic.data
-rw------- 1 root admin 0 Oct 9 19:33 mongod.lock
-rw------- 1 root admin 20480 Oct 9 19:33 sizeStorer.wt
-rw------- 1 root admin 114 Oct 9 12:47 storage.bson
所有権が root になっています。
root になっている所有権を現在のユーザーに変更し、再度 mongod を実行します。
sudo chown -R $(whoami) /usr/local/var/log/mongodb/
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
所有権を変更し、process をすぐに実行しました。
これ以上シェルと対話できなくなり、正常なプロセスの起動が完了しました。
今、brew の root で実行しないこと の原則を破った代償として生じた権限の問題をすべて修正したので、実際に macOS に VNC や物理的アクセスで brew services で mongoDB を実行できます。
楽しく mongoDB を使用してください。