MongoDBonAWS~インフラを操る楽しさ体験~          Sky株式会社            玉川竜司
まずは自己紹介•開発やってます(最近ちょっとビミョー)•翻訳やってます•憲さんとは親戚じゃないっす@tamagawa_ryuji
今日のテーマ
題材:MongoDB•NoSQL系データベース•ドキュメントデータベース•レプリカセットによるフェイルオーバー•シャーディングによるスケーラビリティ•Web系で求められる機能多数•ログの扱いに特化した機能あり•豊富なクライアントライブラリ•日本...
作ってみたシステム: MongoDBをバックエンドとする高可用性Webアプリ                    http://webapp.techlabo.me:5000Japan                 Ireland     ...
MongoDBのレプリカセット                 rsconf ={_id: "santo",members:                             [{_id: 0,•複数ノードで高可用性を実現        ...
レプリカセットの動作(正常時)                                        レプリケーション                                        ハートビートJapan        ...
レプリカセットの動作(セカンダリの障害と回復)                                        レプリケーション                                        ハートビートJapan...
レプリカセットの動作(セカンダリの障害と回復)                                        レプリケーション                                        ハートビートJapan...
レプリカセットの動作(マスターの障害と回復)                                        レプリケーション                                        ハートビートJapan ...
レプリカセットの動作(マスターの障害と回復)                                        レプリケーション                                        ハートビートJapan ...
レプリカセットの動作(マスターの障害と回復)                                        レプリケーション                                        ハートビートJapan ...
レプリカセットの動作(マスターの障害と回復)                                           レプリケーション                                           ハートビート...
名前解決と通信コスト  CNAME j2-mongo.techlabo.me     ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com  CNAME ius-mongo.techlabo.me  ...
障害回復(インスタンスの交換)時の課題•   インスタンスを入れ替えると、IPアドレスやパブリックDNS名が変わってしまう•   レプリカセットの設定(DNS名もしくはIPアドレスでホスト指定)を変更したくない•   Elastic IPだと、...
Route 53へのCNAMEの自動登録                                                                   赤字の部分はec2-mongo-init(抜粋) - 起動時にサービス...
USER DATAによる設定の埋め込み ここにシェルスクリプトを書いて、 起動時に実行させることができます#!/bin/sh                                           これをやっておかないと      ...
Security Groupも自動設定•リージョン間のMongoDBインスタンス同士の通信を許可する•IPアドレス直指定で、インスタンスの起動時に設定を更新•nameタグにmongoという文字列が入っているインスタンスが対象•各リージョンのMo...
クライアントの動作(接続設定)Conn=MongoClient([   “japan-mongo.techlabo.me”,                     “us-mongo.techlabo.me”,                ...
クライアントの動作(接続設定)                      •   特定条件を満たす(例えば同一リージョン内)セカンダリに読                          み取りを持っていき、通信コストを抑えつつ負荷分散するよ...
クライアントの動作(障害発生時)                      • 障害発生時、一旦は例外が生じる(必要ならリカバリJapan                       処理を行う)。    ap-northeast-1a    ...
DNSフェイルオーバー:正常時  A mongo-webapp.techlabo.me y.y.y.y                    死活監視  A mongo-webapp.techlabo.me ALIAS x.x.x.x     ...
DNSフェイルオーバー:障害発生時  A mongo-webapp.techlabo.me y.y.y.y                   死活監視  A mongo-webapp.techlabo.me ALIAS x.x.x.x    ...
参考資料MongoDB公式サイトhttp://www.mongodb.org/MongoDB公式サイトのAWS関連ドキュメントhttp://docs.mongodb.org/ecosystem/platforms/amazon-ec2/Mong...
ご清聴ありがとうございました!
Upcoming SlideShare
Loading in …5
×

MongoDB on AWS

4,979 views

Published on

本資料中の内容は、発表者個人の作成物であり、所属する会社の見解等を反映したものではありません、と一応定型句を付けておきます。

MongoDB on AWS

  1. 1. MongoDBonAWS~インフラを操る楽しさ体験~ Sky株式会社 玉川竜司
  2. 2. まずは自己紹介•開発やってます(最近ちょっとビミョー)•翻訳やってます•憲さんとは親戚じゃないっす@tamagawa_ryuji
  3. 3. 今日のテーマ
  4. 4. 題材:MongoDB•NoSQL系データベース•ドキュメントデータベース•レプリカセットによるフェイルオーバー•シャーディングによるスケーラビリティ•Web系で求められる機能多数•ログの扱いに特化した機能あり•豊富なクライアントライブラリ•日本のコミュニティ ( 「mongodb-jp」で検索を! )
  5. 5. 作ってみたシステム: MongoDBをバックエンドとする高可用性Webアプリ http://webapp.techlabo.me:5000Japan Ireland USA Python WebApp WebApp (書込) (読取) (読取) レプリカセット MongoDB MongoDB MongoDB カスタムAMI カスタムAMI カスタムAMI
  6. 6. MongoDBのレプリカセット rsconf ={_id: "santo",members: [{_id: 0,•複数ノードで高可用性を実現 host: "japan-mongo.techlabo.me"}]} rs.initiate(rsconf)•設定簡単 rs.add(‘us-mongo.techlabo.me’) rs.add(‘ireland-mongo.techlabo.me’)•書き込みはプライマリのみ • 書き込みの負荷分散はシャードで行う•セカンダリで読み取り負荷を分散できる•設定が柔軟 • バックアップ目的のセカンダリは、インデックスなしで負荷低減 • セカンダリへのレプリケーションにタイムラグを持たせてオペミス対策•過半数のノードが生きていて相互通信可能なら、書き込み可能
  7. 7. レプリカセットの動作(正常時) レプリケーション ハートビートJapan Ireland USA プライマリ セカンダリ セカンダリ カスタムAMI カスタムAMI カスタムAMI
  8. 8. レプリカセットの動作(セカンダリの障害と回復) レプリケーション ハートビートJapan Ireland USA プライマリ セカンダリ セカンダリ カスタムAMI カスタムAMI カスタムAMI
  9. 9. レプリカセットの動作(セカンダリの障害と回復) レプリケーション ハートビートJapan Ireland USA 追い付くまで フルコピー プライマリ セカンダリ セカンダリ カスタムAMI カスタムAMI カスタムAMI
  10. 10. レプリカセットの動作(マスターの障害と回復) レプリケーション ハートビートJapan Ireland USA プライマリ セカンダリ セカンダリ カスタムAMI カスタムAMI カスタムAMI
  11. 11. レプリカセットの動作(マスターの障害と回復) レプリケーション ハートビートJapan Ireland USA プライマリ セカンダリ プライマリ セカンダリ カスタムAMI カスタムAMI カスタムAMI
  12. 12. レプリカセットの動作(マスターの障害と回復) レプリケーション ハートビートJapan Ireland USA セカンダリ プライマリ セカンダリ カスタムAMI カスタムAMI カスタムAMI
  13. 13. レプリカセットの動作(マスターの障害と回復) レプリケーション ハートビート 追い付くまで USAJapan Ireland フルコピー セカンダリ プライマリ セカンダリ カスタムAMI カスタムAMI カスタムAMI
  14. 14. 名前解決と通信コスト CNAME j2-mongo.techlabo.me ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com CNAME ius-mongo.techlabo.me ec2-x-x-x-x.eu-west-1.compute.amazonaws.com •同一リージョン内へ、内部IPアドレス で通信すればコストは発生しない。 •他リージョンへは、パブリックIPで通Japan 信せざるを得ない。コストも発生する。 ap-northeast-1a •パブリックDNS名を使えば、自動的 にうまくresolveしてくれる。 USA ap-northeast-1b j1.techlabo.me j2.techlabo.me ip-x-x-x-x ec2-x-x-x-x…. us.techlabo.me カスタムAMI カスタムAMI カスタムAMI
  15. 15. 障害回復(インスタンスの交換)時の課題• インスタンスを入れ替えると、IPアドレスやパブリックDNS名が変わってしまう• レプリカセットの設定(DNS名もしくはIPアドレスでホスト指定)を変更したくない• Elastic IPだと、同一リージョン内の通信でも費用が掛かる そこでRoute 53ですよ! • レプリカセットの設定にはFQDNを使う • FQDNからインスタンスのPublic DNS NameへのCNAMEエン トリを、インスタンスの起動時に自動的にRoute 53へ登録する • インスタンスのFQDNは、インスタンスのLaunchの時点でイン スタンスに書き込む CNAME j2-mongo.techlabo.me ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com CNAME ius-mongo.techlabo.me ec2-x-x-x-x.eu-west-1.compute.amazonaws.com
  16. 16. Route 53へのCNAMEの自動登録 赤字の部分はec2-mongo-init(抜粋) - 起動時にサービスとして実行 user dataの スクリプトで 置き換える FQDN="FDQN_HERE" export AWS_ACCESS_ID="AWS_ACCESS_ID_HERE" export AWS_SECRET_KEY="AWS_SECRET_KEY_HERE" ec2_hostname=`curl -s http://169.254.169.254/latest/meta-data/public-hostname`. update_host.py $FQDN -c $ec2_hostname -t 60 botoベースのRoute 53用ライブラリ https://github.com/tkuhlman/cirrus から借用
  17. 17. USER DATAによる設定の埋め込み ここにシェルスクリプトを書いて、 起動時に実行させることができます#!/bin/sh これをやっておかないと Route 53のエントリyum -y update python-boto 更新がエラーになるsed -i "s/FQDN_HERE/<your instances FQDN here>/" /etc/rc.d/init.d/ec2-mongo-initsed -i "s/AWS_ACCESS_ID_HERE/<your AWS access id here>/" /etc/rc.d/init.d/ec2-mongo-initsed -i "s/AWS_SECRET_KEY_HERE/<your AWS secret key here>/" /etc/rc.d/init.d/ec2-mongo-initsed -i "s/#replSet=replicaSetName/<your replica set name>/" /etc/mongod.conf このインスタンスが参加する レプリカセット名
  18. 18. Security Groupも自動設定•リージョン間のMongoDBインスタンス同士の通信を許可する•IPアドレス直指定で、インスタンスの起動時に設定を更新•nameタグにmongoという文字列が入っているインスタンスが対象•各リージョンのMongoInstancesというセキュリティグループのポート27017のルールを設定 for aRegion in regions: conn = boto.ec2.connect_to_region(aRegion, aws_access_key_id = access_id, aws_secret_access_key = secret_key) connections.append(conn) rs = conn.get_all_instances() mongoInstances = [r.instances[0] for r in rs if umongo in r.instances[0].tags[uName]] for mi in mongoInstances: ip_addresses.append(mi.ip_address) for conn in connections: mongoInstanceSGs = [sg for sg in conn.get_all_security_groups() if sg.name == securityGroupName] if mongoInstanceSGs != []: mongoInstanceSG = mongoInstanceSGs[0] for aRule in mongoInstanceSG.rules: if aRule.from_port == u27017: for aGrant in aRule.grants: if aGrant.cidr_ip != None: mongoInstanceSG.revoke(tcp, 27017, 27017, cidr_ip = aGrant.cidr_ip) for anIp in ip_addresses: if anIp != None: mongoInstanceSG.authorize(tcp, 27017, 27017, anIp + u/32)
  19. 19. クライアントの動作(接続設定)Conn=MongoClient([ “japan-mongo.techlabo.me”, “us-mongo.techlabo.me”, “ireland-mongo.techlabo.me”]) • 普通に接続すれば、論理的にはレプリカセット全体 Japan に接続したことになる クライアント • ただし、物理的なセッションは特定のノードに対して 張られている。 Ireland USA プライマリ セカンダリ セカンダリ
  20. 20. クライアントの動作(接続設定) • 特定条件を満たす(例えば同一リージョン内)セカンダリに読 み取りを持っていき、通信コストを抑えつつ負荷分散するよJapan う設定可能。 ap-northeast-1a • バックアップとしてus-east-1にレプリカセットのノードを用 クライアント 意しながら、平常時のクライアントのアクセスはap- northeast-1のアベイラビリティゾーンのノード群に限定して 負荷分散できる ap-northeast-1b USA プライマリ セカンダリ セカンダリ
  21. 21. クライアントの動作(障害発生時) • 障害発生時、一旦は例外が生じる(必要ならリカバリJapan 処理を行う)。 ap-northeast-1a • もう一度リクエストを実行すれば、フェイルーバーした クライアント プライマリへ自動的に接続し直して処理を続行できる。 ap-northeast-1b USA AutoConnect Exception プライマリ セカンダリ プライマリ セカンダリ
  22. 22. DNSフェイルオーバー:正常時 A mongo-webapp.techlabo.me y.y.y.y 死活監視 A mongo-webapp.techlabo.me ALIAS x.x.x.x Elastic IP Elastic IP x.x.x.x y.y.y.yJapan Ireland USA WebApp WebApp MongoDB MongoDB MongoDB
  23. 23. DNSフェイルオーバー:障害発生時 A mongo-webapp.techlabo.me y.y.y.y 死活監視 A mongo-webapp.techlabo.me ALIAS x.x.x.x Elastic IP Elastic IP x.x.x.x y.y.y.yJapan Ireland USA WebApp WebApp MongoDB MongoDB MongoDB
  24. 24. 参考資料MongoDB公式サイトhttp://www.mongodb.org/MongoDB公式サイトのAWS関連ドキュメントhttp://docs.mongodb.org/ecosystem/platforms/amazon-ec2/MongoDB on AWSホワイトペーパーhttp://aws.amazon.com/jp/whitepapers/mongodb-on-aws/AWS Market Place : MongoDB from 10gen
  25. 25. ご清聴ありがとうございました!

×