MongoDB 3.2(stable)をUbuntu 16.04にインストール
現在(2016 年 6 月 10 日)MongoDB 3.x の Ubuntu 16.04 用のパッケージは、MongoDB から提供されていません。そのため Ubuntu 14.04 用のパッケージを使うことによる問題で、16.04 用のパッケージが公開された時には解決しているはずです。
2016 年 8 月 26 日:Ubuntu 16.04 用のパッケージが提供されています。そのためもう systemd 用の起動設定ファイルを作成する必要はありません。
これまで Ubuntu 14.04 で MongoDB を運用してきましたが、新しい LTS である Ubuntu 16.04 にアップグレードしたらmongod
が起動しなくなってしまいました。
ここでは Ubuntu 16.04 に MongoDB 3.2(stable)をインストール(アップグレード)する手順と、使用できるようにするまでの workaround を説明します。
MongoDB 3.2 のインストール
MongoDB をアップグレードする場合は、データと/etc/mongod.conf
をバックアップしておきます。
MongoDB のインストール方法は、MongoDB が公開しているInstall MongoDB Community Editionに基づいて行います。
まず改変されていないか確認するための鍵を登録します。この鍵は、以前と変わっているので、アップグレードの場合も必要です。
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
次にパッケージのレポジトリを登録します。ここで3.2
というバージョン指定をstable
に変更すると、MongoDB 3.3 が安定版になったらそのままアップグレードされ、常に最新の安定版 MongoDB を使用できるようになります。
$ echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
$ sudo apt update
実際に MongoDB をインストールします。アップグレードの場合は、mongodb-org
だけでなくそのメタパッケージが指すパッケージ群を指定しないとアップグレードできません(注1)。
# 新規インストールの場合
sudo apt install mongodb-org
# アップグレードの場合 sudo apt install mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools
本来ならばこれで mongod が起動するはずですが、起動ファイル(systemd の設定)が存在しないので自動では起動しません。たぶん Ubuntu 16.04 用のパッケージが公開されれば修正されるはずです。
mongod を自動起動させる workaround
Ubuntu16.04 用のパッケージが用意されているので、起動設定ファイルの作成ステップは不要です。Ubuntu 16.04 用パッケージでは、起動用設定ファイルが/lib/systemd/system/mongod.service に作成されます。
mongod
が起動しないのは、インストールしたパッケージが Ubuntu 14.04 用なので Ubuntu 16.04 で自動起動させるために必要な systemd 設定が無いからです(注2)。
そこで systemd 用の起動設定ファイルmongodb.service
をRunning mongodb on ubuntu 16.04 LTSを参考にして作成します。
$ cat /etc/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Service
Wants=network.target
After=network.target
[Service]
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
User=mongodb
Group=mongodb
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
mongod.service
を作成したら、起動するか確認しておきます。
$ sudo systemctl start mongod
# or
$ sudo service mongod start
$ sudo systemctl status mongod
# or
$ sudo service mongod status
● mongod.service - MongoDB Database Service
Loaded: loaded (/etc/systemd/system/mongod.service; disabled; vendor preset:
Active: active (running) since 金 2016-06-10 09:47:06 JST; 7s ago
Main PID: 1479 (mongod)
CGroup: /system.slice/mongod.service
└─1479 /usr/bin/mongod --config /etc/mongod.conf
6月 10 09:47:06 rerun systemd[1]: Started MongoDB Database Service.
起動することが確認できたら、自動起動するようにしておきます。
$ sudo systemctl enable mongod
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service to /etc/systemd/system/mongod.service.
mongo コマンドの警告表を止める方法
mongo
コマンドでサーバに接続すると次のような警告メッセージが表示されることがあります。
$ mongo
MongoDB shell version: 3.2.7
connecting to: test
Server has startup warnings:
2016-06-10T08:19:18.872+0900 I CONTROL [initandlisten]
2016-06-10T08:19:18.872+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-06-10T08:19:18.872+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2016-06-10T08:19:18.872+0900 I CONTROL [initandlisten]
2016-06-10T08:19:18.872+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-06-10T08:19:18.872+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2016-06-10T08:19:18.872+0900 I CONTROL [initandlisten]
この場合は、Disable Transparent Huge Pages (THP)を参考にして kernel の transparent huge pages 機能を無効にします。
機能を無効にするには、/etc/rc.local
に kernel の仮想設定ファイルに設定を書き込む命令を加えます。参照したページのように起動ファイルを作成したら、実行される順番によるのか警告を止めることができませんでした。
具体的には、/etc/rc.local
にexit 0
の前に次の文を加えます。
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
PHP の mongo ライブラリ
Ubuntu 16.04 では、PHP7 が標準になりました。そのため mongodb ライブラリをpecl
コマンドでインストールすると、次のようなエラーが出てインストールできません。
$ sudo pecl install mongo
WARNING: "pecl/mongo" is deprecated in favor of "channel:///mongodb"
pecl/mongo requires PHP (version >= 5.3.0, version <= 5.99.99), installed version is 7.0.4-7ubuntu2.1
No valid packages found
install failed
そこで素直にパッケージに入っている mongo ライブラリをインストールします。
$ sudo apt install php-mongo
脚注
- メタパッケージをアップグレードすれば、自動的にメタパッケージでインストールパッケージ群もアップグレードされるのだとずっと考えていました。
- Ubuntu 16.04ではsystemdがデーモンを起動させますが、Ubuntu 14.04ではUpstartが起動させていました。そのためUbunt 14.04用のパッケージにはsystemdで必要な設定ファイルが含まれていません。
systemdに置き換えられたのは15.04からなので、Ubuntu 15.04と15.10でも同じ問題が発生します。