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.serviceRunning 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.localexit 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

脚注

  1. メタパッケージをアップグレードすれば、自動的にメタパッケージでインストールパッケージ群もアップグレードされるのだとずっと考えていました。
  2. Ubuntu 16.04ではsystemdがデーモンを起動させますが、Ubuntu 14.04ではUpstartが起動させていました。そのためUbunt 14.04用のパッケージにはsystemdで必要な設定ファイルが含まれていません。
    systemdに置き換えられたのは15.04からなので、Ubuntu 15.04と15.10でも同じ問題が発生します。