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などを参考に。
まとめ
- 公式ドキュメントをよく読む
- ディレクトリやファイルの存在と権限が適切かを確認する
- まっさらにしてはじめからやってみることを検討する
以上のことに気を付けていきたいですね。
ディスカッション
コメント一覧
まだ、コメントがありません