MongoDB World 2016にて、MongoDBサービスの「MongoDB Atlas」(モンゴデービーアトラス)が発表された。これは自前でMongoDBを立てる場合とは違って、コンソールからクリックしていくだけでMongoDBのクラスタがAWS上に立ち上がり、利用した分だけ課金されるサービスだ。
ポイント
要はMongoDB Atlasは
- MongoDB社公式のマネージドサービス
- アカウント作ってWebで操作すると、AWS上にMongoDBのクラスタが立つ
- アプリからはインターネット経由でアクセス。プロトコルはMongoDBプロトコル on SSL
- クラスタの台数変更はWebから可能
- ノードのスペック変更もWebから可能。これはレプリカセット内でローリングして行われる
- 監視、アラート、バックアップ・リカバリの機能(=MongoDB Cloud Managerの機能)も使える
- 利用料課金。最小だと一時間0.08ドル≒10円
- Atlasのサポートはあるが、MongoDB自体のサポートは料金に含まれない。
詳細
使えるようなので、さっそく使ってみた。
アカウントの登録~ログイン
Atlasを利用するためにはまずアカウントを登録する必要がある。
まず、以下のページにアクセスしてアカウントを作る
Sign Upをクリックする。
適宜入力する。Company NameやPhone Numberは実際に電話がかかってくるわけではないので、適当でよい。でCONTINUE。
次にAtlas Groupというグループ名を入力する。今回は「Atlas Lab」とした。
これでログイン完了。
※)既にMongoDB Cloud Manager(旧Ops Manager , 旧MMS)のアカウントがある場合は、そのアカウントではAtlasは使えない模様。詳細確認中。
クラスタの生成
「BUILD A NEW CLUSTER」をクリック
クラスタ名
順次必要な項目を埋めていく。まずはクラスタ名の入力。
デフォルトのままにした。
AWSリージョン
AWSリージョンを選ぶ。リージョンを跨いだクラスタは作れないらしい。そして、現状では「us-east-1」しか選べない。
インスタンスタイプ
インスタンスのタイプを選ぶ。 M10、M20、M30と上がっていく毎にメモリとストレージ容量が変わってくる。おそらくAWSの何かしらのインスタンスに紐づいているだろう。ストレージ容量と暗号化有無はオプションで変えられる。
今回は一番安いM10を選んだ。
レプリカセットの台数
次はレプリカセットの台数選択。3,5,7から選べる。no down-timeと書いてあるから、AWSのアベイラビリティ―ゾーンをまたがってデプロイしてくれるのだろう(きっと)
シャーディングの設定
シャーディングはするか?と聞かれる。ただし、シャーディングをするにはインスタンスのタイプをM50という中程度サイズ以上じゃないと選べない。YESを選択すると、追加で何台でシャーディングするかを選べる。2~12台まで選べる模様。
今回はNOを選んだ(画面とは違います)。
バックアップの設定
バックアップはするかどうか聞かれる。これは昔からあるCloud Managerの機能で、レプリケーションの際の更新ログ(oplog)をバックアップしてポイントインタイムリカバリできる機能だと思われる。バックアップ先はus-east-1リージョンらしい。
今回はNOを選んだ(画面とは違います)。
ログインパスワードの設定
MongoDBにログインする際のパスワードを設定する。これを忘れるとログインできなくなるので注意。
値段の確認
上記の選択肢を選んでいる間に、実は常に金額が表示される。
今回の構成だと一時間0.08ドル
クレジットカードと請求先の登録
最後にクレジットカードと請求先を記載する。
※)おそらく請求先は適当でもOK。MongoDB,Incの社風からして請求書が国際郵便で飛んでくることはありえない。
クラスタの生成を待つ
以下のような画面になるので、node0などの値が具体的になるのを待つ。
MongoDBへの接続元IPアドレスの登録
MongoDB Atlasが生成するMongoDBクラスタはAWS上にでき、インターネット経由でアクセスする。具体的には以下のような接続構成になる。
MongoDB側はMongoDBプロトコルを受け付けるために27017で待ち受けているが、どこからでも受け付けるわけにはいかないので接続元IPを絞っている。そのため接続元IPアドレスを登録してあげる必要がある。
Securityのタブ ⇒ IP WHITELISTのタブと辿って、 ADD IP ADDRESSをクリックする
今回は、自宅のマシンから接続するため、自宅のブロードバンドルーターのグローバルIP(固定IP)を登録した。AWS上のインスタンスから接続する場合は、EIPを付与してそれを登録してあげればよいだろう。
MongoDBへ接続
MongoDBクラスタが立ち上がると、以下のようにノード名が具体的なFQDNになる。こうなれば準備OK
右にあるCONNECTのボタンを押すと、以下の様にMongo ShellとMongoドライバからアクセスする際のサンプルコードが表示される
これをMongo Shell(つまりmongoコマンド)がインストールされた状態で実行する。
今回は以下のようなコマンドになった
$ ./bin/mongo "mongodb://cluster0-shard-00-00-rwogg.mongodb.net:27017,cluster0-shard-00-01-rwogg.mongodb.net:27017,cluster0-shard-00-02-rwogg.mongodb.net:27017/admin?replicaSet=Cluster0-shard-0" --ssl --username fetaro --password XXXX
以下のようにプロンプトがでれば成功だ。
MongoDB shell version: 3.2.9
connecting to: mongodb://cluster0-shard-00-00-rwogg.mongodb.net:27017,cluster0-shard-00-01-rwogg.mongodb.net:27017,cluster0-shard-00-02-rwogg.mongodb.net:27017/admin?replicaSet=Cluster0-shard-0
2016-08-17T23:07:52.359+0900 I NETWORK [thread1] Starting new replica set monitor for Cluster0-shard-0/cluster0-shard-00-00-rwogg.mongodb.net:27017,cluster0-shard-00-01-rwogg.mongodb.net:27017,cluster0-shard-00-02-rwogg.mongodb.net:27017
2016-08-17T23:07:52.359+0900 I NETWORK [ReplicaSetMonitorWatcher] starting
Cluster0-shard-0:PRIMARY>
※)ここで、以下の様に--sslオプションが認識できないというエラーが出ることがある。これはMongo ShellがSSLを使えないタイプのものだからだ。
Error parsing command line: unrecognised option '--ssl'
try './bin/mongo --help' for more information
実はMongo ShellにはSSLによる接続ができるバイナリとできないバイナリがある。MongoDBは思想として外部ライブラリを一切使わない単一バイナリで動作することがウリの一つだが、SSLだけはOpenSSLをつかうため、SSLを使う場合だけバイナリが分かれている。
これを解消するには、SSLが有効なバイナリを利用すればよい。
※)ちなみにFQDNをnslookupすればAWS上のインスタンスだとすぐわかる(別に隠してないけど)
$ nslookup cluster0-shard-00-00-rwogg.mongodb.net
Non-authoritative answer:
cluster0-shard-00-00-rwogg.mongodb.net canonical name = ec2-52-7-33-138.compute-1.amazonaws.com.
Name: ec2-52-7-33-138.compute-1.amazonaws.com
Address: 52.7.33.138
適当に負荷をかけてみる
1万件のドキュメント配列を作り、それを1万回挿入して様子を観察してみる
Cluster0-shard-0:PRIMARY> for(var i = 0 ; i < 10000; i++){ary.push({"a":1})}
10000
Cluster0-shard-0:PRIMARY> for(var i = 0 ; i < 10000; i++){ db.hoge.insert(ary) }
想定通り、ダッシュボード上でクエリが増加しているのが見えた。
ノードをクリックするとさらに詳しく見れる。
インターネット越しだが、秒間で4000件書き込みができているのが分かった。
ちなみに、この機能はAtlas独自のものではなく、自前のMonogoDBにCloud Managerを接続しても同じようなものが見える。
クラスタを変更する
CONFIGURATIONをクリックすると、クラスタの設定変更画面になる
とりあえず試しにインスタンスのタイプをM10からM20に上げてみることにした。
その間、rs.status()でクラスタの状態を見ると、さっきまで元気だったnode1(セカンダリ)が死んでいることが分かる。
ずっと見ていると、以下の順序で処理が行われていった。
- node1(セカンダリ)のインスタンス変更
- node2(セカンダリ)のインスタンス変更
- PRIMARYのフェイルオーバしてnode2がプライマリになる
- node0(旧プライマリ)のインスタンス変更
最後にクラスタを壊す
Terminateをクリックすればクラスタが消える
所感
良いと思った点
- UIが良くできているので、ほぼ迷わずにクラスタの構築・変更ができる。
- 値段もそこそこであり、MongoDBの構築の人件費を考えると、Atlasを使ったほうがお得な場合も多いだろう。
- Cloud Managerで管理されるので、監視・アラート・バックアップといった運用関連の機能が一緒ついてる来るのはうれしい。
いまいちな点
インターネット経由でのアクセスになってしまう
せっかくAWSなのだから、自分のVPC内にMongoDBクラスタが立てられて、ローカルの高速な通信だけで利用できる形態になって欲しかった。インターネット経由だと、レイテンシや通信速度がボトルネックになりそう。選択したリージョン内にアプリがあればAWS内の通信で完結するから、まだましだが。
また、いくらSSLで暗号化しソースIPを絞っているからと言って、インターネット経由でDBにアクセスするのは、セキュリティ的に日本ではなかなか受け入れられにくいのではないだろうか。
サポートがない
公式ドキュメントには以下の様に書いてある
Support
Atlas provides support for the use of the service itself. Support for development and > performance of the database itself requires a MongoDB subscription.
訳すと「Atlas自身のサポートはするけど、開発、パフォーマンス、そしてデータベースそのもののサポートはMongoDBサブスクリプションが必要だ。」と書いてある。
結局クラスタ生成後に起きた問題は自分で解決しなければならい。AWSならば+10%ぐらいの料金でそれなりのサポートがついくるのに、MongoDBの場合は高い有償サブスクリプションを買わなければサポートが受けられない。注意が必要だ。