MMS で MongoDB の監視とバックアップを簡単におこなう


[MongoDB, Inc.](http://www.mongodb.com/) (ちょっと前まで 10gen だった) が提供するサービスとして [MongoDB Management Services こと MMS](https://mms.mongodb.com/)  がある。これは無償または有償で MongoDB サービスの監視、アラート、そしてバックアップをとってくれるというもの。

## 何ができるのか

* 監視 (無料)
	* 接続数、ロック率、ネットワーク帯域、メモリ使用状況、Oplog の流速
	* munin を接続している場合は、CPU 時間、ディスク使用量などのハードウェア項目
	* ping (疎通) ログ
	* プロファイリング
* アラート (無料)
	* 監視が途絶えたとき
	* ホストが落ちた時
* バックアップ (有料)
	* 24 時間以内の任意時刻の状態を復元
	* 6 時間おきのスナップショット (最長 2 日)
	* 1 週間おきのスナップショット (最長 1 ヶ月)
	* 1 ヶ月おきのスナップショット (最長 1 年)

現時点では、バックアップ以外の機能は無償で提供されている。またバックアップについては [Oplog 1 GB あたり USD 1.00, スナップショット保持 1 GB あたり USD 0.08 となっている](https://mms.mongodb.com/learn-more#backup-pricing)が、最初の 12 ヶ月間は USD 5.00 未満の利用であれば課金されない。

## アカウントの準備

アカウントの取得は MMS のサイトから行う。

https://mms.mongodb.com/user/register

* First Name / Last Name: なまえ
* Email Address: メールアドレス (ログインおよび、他のユーザから招待されるときに用いる)
* Password
* Company : 個人で使う場合は Individual などとする
* Country : 国
* Job Responsibility : 役職。とりあえず Developer とかでよい
* MMS Group : すでに運用しているグループに参加する場合は “I’m joining an existing MMS group ..” を選ぶ。はじめての場合は “I’m the first person” とする。

ここで入力する MMS Group でグループが作成され、以後そのグループに対してサーバおよび他の管理者を追加することになる。あとで他のグループを作成し、１つのアカウントで複数のグループに所属することが可能なので、まず個人環境で試したい場合は MMS Group に “Taro’s Awesome Application” などぶつからなさそうな名前を適当に入れておけばよい。

ログインが終わったらダッシュボードが表示されるので、右上の Settings から以下の作業を済ませる。

* General Settings -> Group Time Zone: 日本時間またはサービスで標準的に採用しているタイムゾーン
* API Key, Secret Key : それぞれ控える

# MMS Monitoring の構成

## エージェントの設定

エージェントは、 MongoDB の状態を収集する小さなプログラムである。

あまり README では触れられてないが、エージェントは、監視対象の全 MongoDB インスタンスに接続が可能な **クライアントホスト 1 つか 2 つに導入する** だけでよい。(ここでいう “全 MongoDB インスタンス” は MMS Group に登録している全インスタンスである)

導入に適したホストの例を以下にあげる

* 全 MongoDB インスタンスにアクセスできるようにファイアウォールで構成された踏み台 (ゲートウェイ) サーバー
* すべての MongoDB インスタンスと VPN で接続をしている遠隔地の管理サーバー

複数のエージェントを登録した場合、 MMS ではうち 1 つがアクティブになり、そのアクティブになったホストから到達可能なサーバーしか監視対象にならない。運用が異なるなどの理由で、1 台のエージェントからすべての MongoDB インスタンスへの到達が不可能な構成になっている場合は、複数の MMS Group を作成し、グループごとに API Key を変えてエージェントを起動する必要がある。

```bash
cd /tmp/
wget https://mms.mongodb.com/settings/mms-monitoring-agent.tar.gz
tar zxvf mms-monitoring-agent.tar.gz && rm mms-monitoring-agent.tar.gz
sudo mv mms-agent /opt/

sudo aptitude install python python-dev python-setuptools
sudo easy_install pymongo hashlib hmac

sudo mkdir -p /var/log/mms-agent/
sudo touch /var/log/mms-agent/agent.log
sudo chown nobody:nogroup /var/log/mms-agent/agent.log
```

先ほど設定画面から確認した API Key を埋め込む

```bash
export MMS_API_KEY=deadbeaf…
export MMS_SECRET_KEY=deadbeaf…
sed -i "s/@API_KEY@/${MMS_API_KEY}/" /opt/mms-agent/settings.py
sed -i "s/@SECRET_KEY@/${MMS_SECRET_KEY}/" /opt/mms-agent/settings.py
```

[Gist に貼り付けた upstart の起動スクリプト](https://gist.github.com/shao1555/8098541) を用いる (Ubuntu 13.10 で確認)

```bash
wget -q "https://gist.github.com/shao1555/8098541/raw/c40c38afddfa5da5a234f969da3f366a0b692153/mms-agent.conf" -O - | sudo tee /etc/init/mms-agent.conf
```

サービスの開始 / 終了はこちら

```bash
sudo service mms-agent start
sudo service mms-agent stop
sudo service mms-agent status
```

完了後、[トップページのステップ2](https://mms.mongodb.com/host/welcome#downloadAndRunTheMonitoringAgent) に “Ping received from Monitoring Agent” の一文がでていれば OK

次のステップ (Add a Host) で、ホストの FQDN を入力すれば監視がはじまる

* Sharding  / Replica Set の場合は 1 台だけ追加すればいい。 Sharding と Replica Set 両方を構成している場合は、適当な mongos を追加すればすべて検知してくれるはず。
* エージェント, 監視対象ともに 1 台の同一マシンで行っている場合は、 Internal Hostname を “localhost” とすればよい。
* ポートはデフォルトで 27017

## munin-node のインストール (任意)

上記の手順で MongoDB 関連のパラメータは監視されるが、CPU 使用率などのハードウェア情報を取得したい場合は munin-node を **監視対象の各 MongoDB インスタンス** に入れ、エージェントを入れたホストから munin-node に接続が可能なようにファイアウォール等の設定を行う (デフォルトでは 4949/tcp) 。

```bash
sudo aptitude install munin-node
sudo ln -s /usr/share/munin/plugins/iostat /etc/munin/plugins/
sudo ln -s /usr/share/munin/plugins/iostat_ios /etc/munin/plugins/
sudo vim /etc/munin/munin-node.conf 
# mms-agent が動いているホストから接続できるように、 allow 行を書き換えるか、 cidr_allow を追加する。mms-agent と munin-node が同一マシンの場合は設定不要

echo '
[iostat]
env.SHOW_NUMBERED 1' | sudo tee -a /etc/munin/plugin-conf.d/munin-node

sudo service munin-node restart
```

# MMS Backup の構成

次に MMS Backup を試してみる。

MMS Backup は Replica Set 構成でないと動作をしないが、可用性の確保が目的でないのであれば、インスタンス 1 台 + MMS Backup という構成でも可能。

## MongoDB の設定を変更

```
sudo vim /etc/mongodb.conf
# replSet = (任意の名前) を追記

sudo service mongodb restart
mongo
> rs.initiate()
mmsBackupTestdrive:PRIMARY> rs.status()
```
上記の通り、プロンプトが変われば OK (SECONDARY になっていても数回 Enter を押せば PRIMARY になるはず)

## MMS Backup アカウントの有効化

次に、 MMS の管理画面から登録作業を行う。面倒なことにクレジットカード情報が必要。(とはいえ無料枠があるのでいきなり課金されることはない)

Phone Number は +819012345678 のように、手元の携帯番号を入力、続いてクレジットカード番号などを入力し登録を完了させる。

## エージェントのインストール

```bash
cd /tmp/
wget https://mms.mongodb.com/settings/mms-backup-agent-linux_amd64.tar.gz
tar zxvf mms-backup-agent-linux_amd64.tar.gz && rm mms-backup-agent-linux_amd64.tar.gz
sudo mv backup-agent /opt/

sudo mkdir -p /var/log/backup-agent/
sudo touch /var/log/backup-agent/agent.log
sudo chown nobody:nogroup /var/log/backup-agent/agent.log
```

API Key は先ほどと同じ。

```bash
export MMS_API_KEY=deadbeaf…
sed -i "s/@API_KEY@/${MMS_API_KEY}/" /opt/backup-agent/local.config
```

[Gist に貼り付けた upstart の起動スクリプト](https://gist.github.com/shao1555/8098541) を用いる (Ubuntu 13.10 で確認)

```bash
wget -q "https://gist.github.com/shao1555/8098541/raw/c35e416c7c8f29ea8ff8157d36e241e6d8234534/backup-agent.conf" -O - | sudo tee /etc/init/backup-agent.conf
```
サービスの開始 / 終了はこちら

```bash
sudo service backup-agent start
sudo service backup-agent stop
sudo service backup-agent status
```

完了後、[トップページのステップ2](https://mms.mongodb.com/backup/welcome#downloadAndRunTheBackupAgent) に “Ping received from Backup Agent” の一文がでていれば OK

次のステップ (Start Backup) で、Replica Set 名を入力すればバックアップが開始される。

* Sharding  / Replica Set の場合は 1 台だけ追加すればいい。 Sharding と Replica Set 両方を構成している場合は、適当な mongos を追加すればすべて検知してくれるはず。
* エージェント, 監視対象ともに 1 台の同一マシンで行っている場合は、 Internal Hostname を “localhost” とすればよい。
* ポートはデフォルトで 27017

## スナップショットからの復元

まだ試したことがないが、[説明](http://mms.mongodb.com/help//backup/tutorial/restore-from-point-in-time-snapshot/) によると、スナップショットの db ディレクトリを HTTPS によるダウンロードか SCP によるアップロードで受け取ることができるとのこと。

## 課金についての注意

このまま放置すると、無料枠を超える (2GB の DB で oplog が月に 500 MB 程度) 、あるいは 1 年経つと課金されてしまう。 “Backup” の Replica Set Status 一覧から、すべての Replica Set を ”Stop” し、続けて “Terminate” することで、課金対象のリソースをすべて解約することができる。

なお、バックアップを有効化する前に、月額の概算バックアップ費用をReplica Set Status から確認することもできる。

![スクリーンショット 2013-12-24 1.27.22.png](https://qiita-image-store.s3.amazonaws.com/0/2108/2d82fdcf-b0a2-3759-326e-582d5964f193.png "スクリーンショット 2013-12-24 1.27.22.png")