MongoDBをインストールする際にハマったポイントとその対処法

はじめに

AWS/EC2にMongoDBをインストールしようとしたところ、それなりにハマってしまったので解決までの諸々を書き記します。

環境

  • MacOS 10.13.6
  • MongoDB 4.0.10
  • Amazon Linux AMI release 2018.03

基本的な手順

まずは、最も簡単な手順を紹介します。
といっても、公式のドキュメントをそのままなぞっているだけです。
これがうまくいかない、またはこれをやる前に色々変なことをしてしまった(私です)方は以降を読み進めてください。

Amazon Linuxにログインし、リポジトリ設定ファイルを作成

$ sudo vi /etc/yum.repos.d/mongodb-org-4.0.repo

以下をペースト

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

インストール
$ sudo yum install -y mongodb-org

mongod開始
$ sudo service mongod start

mongo起動
$ mongo

以上で完了です。

ハマった要因

今回ハマった一番の要因は、Amazon Linux用の手順があると思っておらず、CentOS用の手順をそのまま進めてしまったことです。
結果、随所でハマり、試行錯誤しているうちによくわからない状態になってしまいました。
(具体的には、yum installで/etc/init.d/mongodが生成されなくなっていました)

同じ境遇の方がいればと、対処法を記していきますが、基本的な手順だけで済むならそれが一番です。

発生した事象 : service mongod startで「認識されていないサービスです」と出る。

yumでmongodb-orgをインストールした後、$ sudo service mongod startでmongodを開始しようとすると、認識されていないサービスですと表示されてしまいました。

mongodが動かないので、当然 $ mongoと打っても、

MongoDB shell version v4.0.6
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
2019-06-06T15:12:41.656+0000 E QUERY     Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused :
connect@src/mongo/shell/mongo.js:343:13
@(connect):1:6
exception: connect failed

こんな感じのエラーが出て動きません。

試した対策

Directory Pathsを確認

公式ドキュメントによると、

By default, MongoDB runs using the mongod user account and uses the following default directories:

/var/lib/mongo (the data directory)
/var/log/mongodb (the log directory)

とあるので、まずはこれらのディレクトリが存在するか確認してみました。

$ ls /var/lib/mongo
$ ls /var/log/mongodb

結果、どちらも存在していました。

ログファイルの権限を確認

Stack Overflowの記事から。ログファイルへの書き込み権限がないので立ち上がらないのかも、というヒントがあったので、
ls -laで権限を確認します。

$ ls -la /var/log/mongodb
-rw-r----- 1 mongod mongod 2506  6月  4 17:36 mongod.log

オーナーもグルーブもmongodなので問題ないはずです。

/etc/init.d/mongodファイルを確認

認識されていないサービスですというメッセージが出る直接的な理由は、起動ファイルが存在していないことです。
実際確認してみるとファイルが存在していませんでした。

とはいえ、以下のコマンドでmongodを直接起動することはできました。

-dbpathオプションで実行

$ sudo mongod -dbpath /var/lib/mongo

このコマンドで、起動はします。
ただ、ログが流れる状態になり、別のことができなくなります(フォアグラウンドジョブ)。

–configオプションで実行

$ sudo mongod --config /etc/mongod.conf

このコマンドでも、起動はします。
こちらはバックグラウンドジョブで動いてくれます。

オプションの違いでフォアグラウンドとバックグラウンドになるみたいですね。
フォアグラウンド/バックグラウンドについては、【一通りわかる】Linuxでのジョブの基本的な扱い方まとめを参考に。

ちなみに、$ mongod だけだと以下のエラーが出てダメ。

exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating

mongod+オプションではダメなのか

-dbpath、–config付きのコマンドで起動はできますが、毎回コマンドを打つのが面倒なのと、使い慣れたservice xxx startコマンドを使いたいので、もう少し粘ってみます。

init.d/mongodを作る

init.d/mongodがあれば問題が解決しそうなので、とりあえずmongodb-orgを再度インストールしてみます。

削除→キャッシュクリア→インストール

yum removeでmongodb-orgを削除、yumのキャッシュも消した上で、再度インストールします。

$ sudo yum -y remove mongodb-org
$ sudo rm -fr /var/cache/yum/*
$ sudo yum clean all
$ sudo yum repolist
$ sudo yum update

$ sudo yum -y install mongodb-org

$ service mongod start

結果は変わらず。
何らかの理由でinit.d/mongodが作られなくなっているみたいです。

新たに立てたインスタンスでmongodをインストールして生成されたinit.d/mongodを使う

現状、

  • mongodは動く
  • mongoも動く
  • service mongod startが動かない

という状況だったので、まっさらなサーバを立ててMongoDBをインストールし、生成されたinit.d/mongodの中身をコピペすれば良かろうと考えました。

テストサーバとしてEC2インスタンスを立ち上げ、mongodbをインストール

AWSコンソール > EC2から、「同様のものを作成」で細かい手間を省いてインスタンスを作ることができます。

作成したインスタンスにec2-userでログイン。
本記事の最初にある基本的な手順を参考に、MogoDBインストールを進めます。

$ sudo service mongod start

で問題なくmongodが起動したので、/etc/init.d/mongodをコピーします。

/etc/init.d/mongodの内容をコピー

$ vi /etc/init.d/mongod

の後、画面全選択してcommand + Cするやり方だと縦長のテキストファイルだと途中で切れてしまいます。

解決策として見つかったvimでファイル全体をコピーしてクリップボードに貼り付ける方法が少し面倒だったので、scpコマンドでファイルをローカルに保存>テキストエディタて開いて全選択コピー>目的のサーバ上でペーストというやり方で解決することに。

テストサーバ側で/etc/init.d/mongodをコピー
$ cp /etc/init.d/mongod /home/ec2-user/conf_file

ローカル環境からscpでダウンロード
$ scp -P xx -i ~/.ssh/xxx.pem ec2-user@xx.xxx.xxx.xxx:/home/ec2-user/conf_file .

ローカル環境でテキストエディタでファイルを開き、設定を全選択>コピー

目的のサーバにログインし、
$ sudo vi /etc/init.d/mongod
でファイルを新規作成した上で、前項でコピーした内容を全ペースト>保存

ファイルの権限設定
$ sudo chmod 755 /etc/init.d/mongod

いざ、起動
$ sudo service mongod start

mongod.pidがすでに存在しています

「mongod.pidがすでに存在しています」的なエラーが出たので、当該ファイルをリネームします。(削除でも良かったですが、念の為)

$ ls /var/run/mongodb/mongod.pid 
$ sudo mv /var/run/mongodb/mongod.pid /var/run/mongodb/mongod.pid.org

再度、起動…できません。

Failed to unlink socket file /tmp/mongodb-27017.sock Unknown error

/tmp/mongodb-27017.sockというファイルを削除できない、というエラーなので、当該ファイルを削除します。

$ sudo rm /tmp/mongodb-27017.sock
$ sudo service mongod restart

まだ起動…できません。

Failed to set up listener: SocketException: Address already in use

すでにmongodプロセスが実行中だと上記エラーが出るようです。

$ ps -ef | grep mongod
もしくは
$ ps aux | grep mongod
でプロセスを確認します。

確かに、実行中のmongodプロセスがありました。
試行錯誤中に起動してバックグラウンドで動いていたようです。

$ kill プロセスID
でプロセスを終了します。

まだ起動…できません。

Attempted to create a lock file on a read-only directory

exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /var/lib/mongo, terminating

権限がないらしいです。当該フォルダを再帰的に、所有権とグルーブをmongodに変更します。

$ ls -la /var/lib/mongo
$ sudo chown -R mongod:mongod /var/lib/mongo

ついに動いたmongod

ここまでやってようやく、
$ sudo service mongod start [OK]
までたどり着きました。

stop/restart/statusも問題なく動き、もちろん$ mongoも動きました。

自動起動設定までやっておく

$ sudo chkconfig mongod on

chkconfigについては
Linuxコマンド【 chkconfig 】サービス自動起動の設定 – Linux入門 – Webkaruなどを参考に。

まとめ

  • 公式ドキュメントをよく読む
  • ディレクトリやファイルの存在と権限が適切かを確認する
  • まっさらにしてはじめからやってみることを検討する

以上のことに気を付けていきたいですね。

参考