dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

MacにMongoDB(3.4.7)をHomebrewでインストールする

メモ。
3 年前にも書いたが、今これを読みながらインストールしたらいろいろ情報が古くなっていたので改めて。

環境

  • Mac OS X Yosemite 10.10.5
  • Homebrew 1.3.1
  • MongoDB 3.4.7


MongoDB の特徴

↑の記事を参照。


インストール手順

基本的には公式ドキュメントに従ってインストールすれば OK。
Install MongoDB Community Edition on OS X — MongoDB Manual 3.4

1. Homebrew をアップデートする
$ brew update
2. MongoDB をインストール
$ brew install mongodb

でインストールされる。

3. プロセスの起動

先ほどのインストールの最後に

To have launchd start mongodb now and restart at login:
  brew services start mongodb
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf

というメッセージが表示される。
Homebrew Services という機能を使って、再起動後もプロセスが自動起動するように設定するには

$ brew services start mongodb

を実行する。

そうではなく、一回限りの起動を行う場合は

$ mongod --config /usr/local/etc/mongod.conf

を実行する。

4. mongo コマンドの実行

3 でプロセスを起動した状態で

$ mongo

を実行する。

$ mongo
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
Server has startup warnings:
2017-08-19T23:23:55.973+0900 I CONTROL  [initandlisten]
2017-08-19T23:23:55.973+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-08-19T23:23:55.973+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-08-19T23:23:55.973+0900 I CONTROL  [initandlisten]
> show dbs # データベース一覧を表示
admin  0.000GB
local  0.000GB


注意

ちょっとハマった点について。

config ファイルの場所

↑のコマンドからもわかるように、/usr/local/etc/mongod.conf という設定ファイルが作成されている。
中身はこんな感じ。

systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
net:
  bindIp: 127.0.0.1

ログ・ファイルや DB ファイルへのパスが指定されていることがわかる。

注意点として、 mongod コマンド実行時にデフォルトでこの設定ファイルが読み込まれるわけではない

DB ファイルのパス

設定ファイルに /usr/local/var/mongodb と書かれているのでこれがデフォルトかと思ったら違うらしい。

/data/db

というパスのようだ。

参考:https://docs.mongodb.com/manual/reference/configuration-options/#storage.dbPath

また、このディレクトリは自動的に作られるわけではないので、mongod コマンドを --config オプションなしで実行する場合は事前に

$ mkdir -p /data/db

ディレクトリを作成しておく必要がある。 Read/Write 権限も必要。
これをやらずに mongod コマンドだけを実行すると

2017-08-19T23:43:14.258+0900 I CONTROL  [initandlisten] MongoDB starting : pid=47588 port=27017 dbpath=/data/db 64-bit host=yama.local
2017-08-19T23:43:14.259+0900 I CONTROL  [initandlisten] db version v3.4.7
2017-08-19T23:43:14.259+0900 I CONTROL  [initandlisten] git version: cf38c1b8a0a8dca4a11737581beafef4fe120bcd
2017-08-19T23:43:14.259+0900 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2l  25 May 2017
2017-08-19T23:43:14.259+0900 I CONTROL  [initandlisten] allocator: system
2017-08-19T23:43:14.259+0900 I CONTROL  [initandlisten] modules: none
2017-08-19T23:43:14.259+0900 I CONTROL  [initandlisten] build environment:
2017-08-19T23:43:14.259+0900 I CONTROL  [initandlisten]     distarch: x86_64
2017-08-19T23:43:14.259+0900 I CONTROL  [initandlisten]     target_arch: x86_64
2017-08-19T23:43:14.259+0900 I CONTROL  [initandlisten] options: {}
2017-08-19T23:43:14.263+0900 I STORAGE  [initandlisten] exception in initAndListen: 29 Data directory /data/db not found., terminating
2017-08-19T23:43:14.263+0900 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
2017-08-19T23:43:14.263+0900 I NETWORK  [initandlisten] shutdown: going to flush diaglog...
2017-08-19T23:43:14.264+0900 I CONTROL  [initandlisten] now exiting
2017-08-19T23:43:14.264+0900 I CONTROL  [initandlisten] shutting down with code:100

というようにエラーで落ちる。

brew services start mongodb では config ファイルは読み込まれているのか?

自動起動の方のコマンドを使った場合、/data/db がなくても特にエラーにならない。ということで config ファイルが読み込まれているのだろうと推測できるが、

$ brew services list
Name    Status  User     Plist
mongodb started yamazaki /Users/yamazaki/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
redis   stopped

で homebrew.mxcl.mongodb.plist を見てみると

<?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</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/mongodb/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>4096</integer>
  </dict>
  <key>SoftResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>4096</integer>
  </dict>
</dict>
</plist>

plist ファイルの読み方はわからないが、 ProgramArguments の後にそれらしい記述が見られるので読み込まれているのだと理解した。