[徹底解説] MongoDBの監視やバックアップができるMMS(MongoDB Management Service)の使い方

# MMSの概要

### MMSの機能

MMS(MongoDB管理サービス)はMongoDBの自動運用管理をしてくれるサービスであり、主に以下の機能があります。

* 監視
 * MongoDBの各種統計情報収集、グラフ化、監視
 * 閾値を指定して超えたらアラートメール送付
* バックアップ
 * スナップショット取得・リカバリ
 * 差分バックアップ
 * ポイントインタイムリカバリ（時間指定リカバリ）
* オートメーション（2014/5現在、公開予定）
 * 無停止バージョンアップ
 * ワンクリック環境構築

### MMSとMMSエージェントの役割分担

MongoDB単体ではMMSを利用できません。MMSエージェントを導入して、MMSと接続する必要があります。
MMSエージェントには監視を行う監視エージェントとバックアップを行うバックアップエージェントの二つがあります。それぞれの役割分担は以下の通です。

* MMS監視エージェント
 * MongoDBから情報を取得し、暗号化してMMSに情報を送る
 * 手元の環境にインストールする必要あり。ただし、MongoDBと同じサーバにインストールする必要はなくMongoDBに接続できる場所であればどこでもOK
 * 一台のMMSエージェントで、複数台のMongoDBと接続することができる
* MMSバックアップエージェント
 * MongoDBから定期的にスナップショットや更新ログ(oplog)を取得する。
 * MMS指示のもと、MongoDBのリストアやポイントインタイムリカバリを行う
* MMS
 * MMS監視エージェントから情報を収集して、ユーザに対して監視のダッシュボード(Web)を提供する
 * 監視が閾値を超えたらアラートメールをブラウザに送る
 * ユーザからのバックアップ・リスト指示を受け付けつける


![mms.png](https://qiita-image-store.s3.amazonaws.com/0/33447/aad83178-cdf1-d812-cbe7-1e85d53c8bd9.png)


### クラウド版とオンプレ版

MMSはクラウド版とオンプレ版があります。MMSエージェントはその区別はありません。

* クラウド版
 * インターネットにあり、アカウントを作るとだれでも利用可能。 
 * モニタリングは無料
 * バックアップは有料だが、$5/月以下の利用は無料
* オンプレ版
 * 自前の環境にMMSサーバをインストールできる
 * 情報を外に出せない企業向け


# クラウド版MMSを使ってみる

監視機能、バックアップ機能、どちらを利用するにしても、まずはじめにMMSアカウントの登録が必要です

## MMSアカウントの登録

[MMS公式ホームページ](http://www.mongodb.com/mongodb-management-service) にアクセス

![スクリーンショット 2014-05-03 09.01.03.png](https://qiita-image-store.s3.amazonaws.com/0/33447/ebd43d26-80e0-8df3-a0a9-fb19ceeebbae.png)

クラウド版は「Fully-Managed MMS」をクリック。

![スクリーンショット 2014-05-03 09.08.06.png](https://qiita-image-store.s3.amazonaws.com/0/33447/085241d0-8b38-60b1-cf34-08f456785e8a.png)

MMSのアカウントを新規に作るので「Sign Up」をクリック。

![スクリーンショット 2014-05-03 09.17.42.png](https://qiita-image-store.s3.amazonaws.com/0/33447/dd97ea44-5778-e0b0-5b4d-2270e2894b9c.png)

適宜埋めてアカウントを作成。
おそらくメールアドレスは何でもOK。「確認メールが来てURLをクリック」などの手順は必要ありません。

(2014/7/1追記)
現時点で、パスワードの他に、二要素認証が必要になっています。電話のSMSメッセージか音声案内、またはgoogle authenticatorによるワンタイムパスワードの取得が必要です。

手っ取り早いのは電話のSMSメッセージです。日本の国際番号である81を付与して +81-90-1234-5678 といった感じで電話番号を登録しておけば、ログインの度にSMSメッセージでワンタイムパスワードが届きます。

アカウントができるとWellcome画面が表示される

![スクリーンショット 2014-05-03 09.17.21.png](https://qiita-image-store.s3.amazonaws.com/0/33447/46f9b7e9-b3ea-2edd-59da-fe7095bf99c0.png)

## 監視機能を使ってみる

今回試した環境は以下の通り

* CentOS 6.2
* MongoDB 2.6.0
* MMS Monitoring Agent 2.1.2.43

### MMS監視エージェントのインストール

Wellcome画面で、Monitoringエージェントの「Get Started」→「Begin Setup」→「Next」と画面遷移してくとMMS監視エージェントの導入手順の画面になる。
利用しているOSを選択（私の場合はCentOSです）。

![スクリーンショット 2014-05-03 09.23.14.png](https://qiita-image-store.s3.amazonaws.com/0/33447/211f365f-1eea-66f6-0c76-3973529c9e0f.png)

画面にエージェントインストール手順が出ますので、その通り実行します。

![スクリーンショット 2014-05-03 09.23.24.png](https://qiita-image-store.s3.amazonaws.com/0/33447/fb8fd348-1fcf-cc2f-0c3a-399cf5941622.png)


RPMを落とす

```
curl -OL https://mms.mongodb.com/download/agent/monitoring/mongodb-mms-monitoring-agent-2.1.2.43-1.x86_64.rpm
```

RPMをインストールする

```
sudo rpm -U mongodb-mms-monitoring-agent-2.1.2.43-1.x86_64.rpm
```

APIキーを`/etc/mongodb-mms/monitoring-agent.config`に設定する

```
mmsApiKey=4ace5fc505305aeXXXXXXX  ←MMSアカウントごとに違う値です
```

エージェントを起動する

```
sudo service mongodb-mms-monitoring-agent start
```

エラーが出なければ成功です！

ログは`/var/log/mongodb-mms/monitoring-agent.log`に出てるので、エラーが出る場合はここら辺を手掛かりにしてください。

### MongoDBとMMS監視エージェントの接続

※この手順では、すでにMongoDBがMMSエージェントインストールノードの27017ポートで起動していることを前提としています。

先ほどの画面でそのままNextを押すとホスト追加の画面が表示されます!

![スクリーンショット 2014-05-03 09.30.15.png](https://qiita-image-store.s3.amazonaws.com/0/33447/ffbf4879-ae08-3187-cb91-5d8625124b40.png)

以下の通り入力します。

* Internal HostnameにMMSエージェントから見えるホスト名を入れます。localhostはやめて、ユニークなホスト名を入れる事が推奨です。
* PortにMongoDBの待ち受けポートを入れます。
* （オプション）SSLで通信を暗号化する場合は「Use SSL」を入力。
* （オプション）DBにユーザ・パスワード認証をかけている場合は「Auth Mechanism」でUsername/Passwordを選んで「DB Username」と「DB Password」を入力。
* （オプション）DBをケルベロス認証している人は「Auth Mechanism」でKerberosを選択

全てが入ったら、「Verify Host」をクリック

![スクリーンショット 2014-05-03 09.35.30.png](https://qiita-image-store.s3.amazonaws.com/0/33447/10f52885-fc7b-6041-6c29-bca240e3765e.png)

「One or more hosts have been detected.」と出たらMonogDBを見つけられたことになり、成功です。

![スクリーンショット 2014-05-03 09.35.49.png](https://qiita-image-store.s3.amazonaws.com/0/33447/f17a18e7-9b85-788a-ac9e-494c0c3e6891.png)

「Start Monitoring」をクリックしてモニタリング開始です！

うまくいくと、以下のようにHostsに表示されます

![スクリーンショット 2014-05-03 09.46.03.png](https://qiita-image-store.s3.amazonaws.com/0/33447/61d07525-64de-2e0b-98c2-98b3b7065821.png)

ノードをクリックすると、以下のように勝手に表示されます

![スクリーンショット 2014-05-03 09.47.51.png](https://qiita-image-store.s3.amazonaws.com/0/33447/95a66016-7549-4c43-885f-995e7d96f644.png)

これで監視エージェントの利用方法の説明は終わりです

## バックアップ機能を使ってみる

はじめに、重要な注意点です。
**バックアップ機能は単体のMongoDBには適用できません。**
その理由はバックアップの方法はMongoDBの更新ログ(oplog)をコピーすることで実現していますが、単体のMongoDBではoplogが有効になっていないためです。単体のMongoDBをバックアップするためには、1ノード構成のレプリカセットにする必要があります。

また、バックアップ機能を作る前に、先にバックアップ対象のMongoDBに対して監視機能を有効にしておくのがスムーズです。

今回はレプリカセットのバックアップを紹介にしますので、監視機能で以下のようにレプリカセットが見えている状態からスタートすることを前提としています。

![スクリーンショット 2014-05-03 13.56.32.png](https://qiita-image-store.s3.amazonaws.com/0/33447/4d8cbc72-bc4c-3806-2615-0d6f04414893.png)


### バックアップエージェントのインストール

画面の左のタブからBackupを選びます

![スクリーンショット 2014-05-03 10.12.18.png](https://qiita-image-store.s3.amazonaws.com/0/33447/9e4a7be4-cf66-9f7c-8145-33f40f3aefe6.png)

「Begin Setup」をクリックします

![スクリーンショット 2014-05-03 10.13.40.png](https://qiita-image-store.s3.amazonaws.com/0/33447/c1ffb977-f882-c1c3-9d72-86594601cd5c.png)

2要素認証を求められます。電話による認証とgoogle Authenticatorの2つの方法がありますが、電話に日本の電話番号+81***を入れてもうまくいかなかったため、まだ日本の電話番号ではできないようです。なのでgoogle Authenticatorで認証します。

認証が終わりnextを押すと請求の画面になりますので、適宜入力してください。

![スクリーンショット 2014-05-03 12.54.11.png](https://qiita-image-store.s3.amazonaws.com/0/33447/c664d2fe-ebe0-6b4c-c6b0-89570c64e443.png)

料金は現時点では以下の通りです

* 差分バックアップに用いるoplog(DBに対する変更のログ)のサイズが 1Gあたり$1
* スナップショットが1GBあたり$0.08

月に$5まで無料ということは、スナップショットは取らず、一か月のデータ変更のログ容量(oplog容量)が5G以下であれば、無料ということになります。
勘違いしてはいけないのは、ドキュメントのサイズがそのままoplogのサイズにはならないということです。
ほとんど更新しない読み込み専用システムであれば、ほとんどお金はかかりません。
ただし、ほとんど更新しないということは、自動バックアップを取る意味もあまりなく、mongodumpで十分かもしれません。。。

請求情報を入れると以下のページになります

![スクリーンショット 2014-05-03 13.15.41.png](https://qiita-image-store.s3.amazonaws.com/0/33447/52a97a56-96e4-7712-d11f-e412b194069a.png)

Nextです

![スクリーンショット 2014-05-03 13.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/33447/610b3e23-18b0-4f96-fa7e-2cb63ff7cf8f.png)

MMSのバックアップエージェントを入れるOSを選択します。私の場合はCentOSです。

![スクリーンショット 2014-05-03 13.22.03.png](https://qiita-image-store.s3.amazonaws.com/0/33447/211a5085-8885-828c-fce2-b9b91174df7c.png)

ダウンロードします

```
curl -OL https://mms.mongodb.com/download/agent/backup/mongodb-mms-backup-agent-1.4.6.43-1.x86_64.rpm
```

RPMをインストールします

```
sudo rpm -U mongodb-mms-backup-agent-1.4.6.43-1.x86_64.rpm
```

`/etc/mongodb-mms/backup-agent.config`にAPIキーを設定します

```
apiKey=2824d4bxxxxxxxx
```

起動します
```
sudo service mongodb-mms-backup-agent start
```

ポップアップの手順書をクローズします。

![スクリーンショット 2014-05-03 13.28.05.png](https://qiita-image-store.s3.amazonaws.com/0/33447/5397e6f2-ffbe-36fe-c039-70812915243c.png)

「Verify Agent」をクリックします。
Agent Verifiedと表示されたら接続成功です！Nextをクリックします。

### MMSバックアップエージェントにMongoDBのノードを追加する

監視機能で正しくレプリカセットが認識され、かつAgent Verifiedな状態であれば、
Nextをクリックすると、レプリカセットを選択する画面になるはずです。

![スクリーンショット 2014-05-03 13.59.43.png](https://qiita-image-store.s3.amazonaws.com/0/33447/7f79c77b-4b10-1f1d-0188-af04b038ffd8.png)

バックアップを取るレプリカセットを選択します

![スクリーンショット 2014-05-03 14.00.41.png](https://qiita-image-store.s3.amazonaws.com/0/33447/bcb4d44e-0087-f63b-4f89-959e9ce26a56.png)

* Sync Sourceで、バックアップのための更新ログ(oplog)を取得する先を選べます。
プライマリのロードを高めないようにしたければ、「any seconday」でセカンダリから取得するのがよいでしょう。
* （オプション）SSLで通信を暗号化する場合は「Use SSL」を入力。
* （オプション）DBにユーザ・パスワード認証をかけている場合は「Auth Mechanism」でUsername/Passwordを選んで「DB Username」と「DB Password」を入力。
* （オプション）DBをケルベロス認証している人は「Auth Mechanism」でKerberosを選択

これらを入力したらNextです

![スクリーンショット 2014-05-03 14.05.34.png](https://qiita-image-store.s3.amazonaws.com/0/33447/802dd187-ce2b-7b50-efc5-e09f275a89ac.png)

成功すると、このようにReplica Set Statusのメニューで見えるようになります。

### 定期的なスナップショット取得

メニューの右側の設定アイコンから「Edit Snapshot Schedule」を押すと以下の画面になり設定できます

![スクリーンショット 2014-05-03 14.17.59.png](https://qiita-image-store.s3.amazonaws.com/0/33447/59e989a9-0af9-845c-8ee7-6327305e7bcd.png)


### リストアする

リストア対象のレプリカセットを選択して、右上のRestoreをクリックすると以下の画面になります

![スクリーンショット 2014-05-03 14.16.07.png](https://qiita-image-store.s3.amazonaws.com/0/33447/7102cef6-ccd7-b38f-ceda-982669fe8450.png)

すると、スナップショットを選ぶか、どの時刻まで戻るか、を入力できます。

私の環境ではまだスナップショットがないため、表示されていないです。




# オンプレ版MMSを使ってみる(玄人向け)

## 監視機能

### 手順概要

基本的には[本家の解説](http://mms.mongodb.com/help-hosted/v1.4/tutorial/install-on-prem-with-rpm-packages/)どおりです。

1. ハードウェア要件を確認する
2. MMSデータ格納用にMongoDBを用意する 
3. SMTPサーバを用意する
4. MMSをインストールする
5. MMSを設定する
6. MMSを起動する

#### 1.ハードウェア要件を確認する
http://mms.mongodb.com/help-hosted/v1.4/core/requirements/

注意点
* マニュアルには書いてありませんが、「sudo」が必須です。
* ulimitを増やさないと、途中でスレッドを作れなくなりエラーが出ます。

私は以下の環境でやりました

* CentOS 6.2
* MongoDB 2.6.0
* mongodb-mms-1.4.1.62-1.x86_64.rpm

#### 2. MMSデータ格納用にMongoDBを用意する 

MMSのデータ自体も、MongoDBに格納します。

耐障害性を考慮して、レプリカセットが推奨されいますが、スタンドアロンでも動きます。
実運用を想定すると、スタンドアロン構成は考えにくいため、レプリカセットで作ってみます。

レプリカセットの構築は、本記事ではそこまで詳しくは説明しません。
私の記事[MongoDBでゆるふわDB体験](http://gihyo.jp/dev/serial/01/mongodb/0004?page=2)などを参照してください。

本来は冗長化のために別筐体に３つのmongodを立てるべきですが、今回は同一サーバ上に3つのmongodを立ててレプリカセットを組みます。

私の環境ではIPは「192.168.1.7」なので適宜読み替えてください。
またレプリカセット名は「rsmms」にしてますが、ここも適宜変えてください。

```
mkdir data1 data2 data3
mongod  --dbpath data1  --logpath mongo1.log --replSet "rsmms" --port 27001 --fork &
mongod  --dbpath data2  --logpath mongo2.log --replSet "rsmms" --port 27002 --fork &
mongod  --dbpath data3  --logpath mongo3.log --replSet "rsmms" --port 27003 --fork &
./bin/mongo --port 27001
> config = {
... _id : "rsmms",
... members : [
... { _id : 0, host : "192.168.1.7:27001"},
... { _id : 1, host : "192.168.1.7:27002"},
... { _id : 2, host : "192.168.1.7:27003"}]}
> rs.initiate(config)
```

#### 3.SMTPサーバを用意する

ここは省略します。
メール通知が必要ないならば、なくてもできます。

#### 4.MMSパッケージをインストール

ここにアクセス→　https://www.mongodb.com/subscription/downloads

![スクリーンショット 2014-05-03 10.22.33.![スクリーンショット 2014-05-03 14.27.45.png](https://qiita-image-store.s3.amazonaws.com/0/33447/6a1d2c67-1ee5-17c9-de49-6f4bf74fa5f0.png)
png](https://qiita-image-store.s3.amazonaws.com/0/33447/c2881199-8541-a747-e846-295ad4f6ee00.png)

ページ中腹の「Package: mongodb-mms-1.4.1.62-1.x86_64.rpm」からRPMをダウンロード

インストール

```
 rpm -ivh mongodb-mms-1.4.1.62-1.x86_64.rpm
```

#### 5.MMSを設定する

基本的には[本家のマニュアル](http://mms.mongodb.com/help-hosted/v1.4/reference/configuration/)どおりに行きます。

RPMで入れると、`/opt/mongodb/mms/conf/conf-mms.properties`に設定ファイルができます。

まず設定ファイルのパーミッションを落とします

```
chmod 600 /opt/mongodb/mms/conf/conf-mms.properties
```

`conf-mms.properties`の中を以下の通り編集します

ブラウザからMMSにアクセスするときのURL
```
mms.centralUrl=http://192.168.1.7:8080 #MMSのメイン画面URL
mms.centralUrl=http://192.168.1.7:8081 #MMSバックアップ用のURL
```

メールの設定。MMSをとりあえず動かすだけであれば、適当なものでOK
```
mms.fromEmailAddr=mmsadmin@hoge.com
mms.replyToEmailAddr=mmsadmin@hoge.com
mms.adminFromEmailAddr=mmsadmin@hoge.com
mms.adminEmailAddr=mmsadmin@hoge.com
mms.bounceEmailAddr=mmsadmin@hoge.com
```

MMSのデータを格納するレプリカセットの設定
```
mongo.mongoUri=mongodb://192.168.1.7:27001,192.168.1.7:27002,192.168.1.7:27003
mongo.replicaSet=rsmms
```

#### 6.MMSを起動する

```
/etc/init.d/mongodb-mms start
```
※sudoがないと動きません。ない場合は「yum install sudo」でOK。

起動に成功後、ブラウザで`http://192.168.1.7:8080/user/login`にアクセスし、以下のような画面が出れば成功です

![スクリーンショット 2014-05-03 14.27.45.png](https://qiita-image-store.s3.amazonaws.com/0/33447/fe71a785-36bc-a6cf-7cef-be5c5ec8395f.png)

以上でオンプレ版の説明を終わります。


# 感想

以前もMMSを使っていたのですが、最近になってかなりインストールの敷居が下がりました。ご覧のとおり非常に使いやすいです。MongoDBでそこそこ重要なシステムを作るときは、とりあえずクラウド版の監視機能を入れることがお勧めです。

また、お金次第ですがバックアップも非常に便利だと思います。特に差分バックアップとポイントインタイムリカバリは、MMS抜きだとかなり難しい（というかできないと思うので、お金を払っただけの恩恵は受けられると思います。

オンプレ版は構築はそこそこ大変ですが、たとえ暗号化していたとしてもインターネットに情報を出せないシステムはありますので、そういうときの選択肢になります。