17. USER DATAによる
設定の埋め込み
ここにシェルスクリプトを書いて、
起動時に実行させることができます
#!/bin/sh
これをやっておかないと
Route 53のエントリ
yum -y update python-boto 更新がエラーになる
sed -i "s/FQDN_HERE/<your instance's FQDN here>/" /etc/rc.d/init.d/ec2-mongo-init
sed -i "s/AWS_ACCESS_ID_HERE/<your AWS access id here>/" /etc/rc.d/init.d/ec2-mongo-init
sed -i "s/AWS_SECRET_KEY_HERE/<your AWS secret key here>/" /etc/rc.d/init.d/ec2-mongo-init
sed -i "s/#replSet=replicaSetName/<your replica set name>/" /etc/mongod.conf
このインスタンスが参加する
レプリカセット名
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 u'mongo' in r.instances[0].tags[u'Name']]
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 == u'27017':
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. クライアントの動作(接続設定)
Conn=MongoClient([ “japan-mongo.techlabo.me”,
“us-mongo.techlabo.me”,
“ireland-mongo.techlabo.me”])
• 普通に接続すれば、論理的にはレプリカセット全体
Japan に接続したことになる
クライアント • ただし、物理的なセッションは特定のノードに対して
張られている。
Ireland USA
プライマリ セカンダリ セカンダリ
20. クライアントの動作(接続設定)
• 特定条件を満たす(例えば同一リージョン内)セカンダリに読
み取りを持っていき、通信コストを抑えつつ負荷分散するよ
Japan
う設定可能。
ap-northeast-1a • バックアップとしてus-east-1にレプリカセットのノードを用
クライアント 意しながら、平常時のクライアントのアクセスはap-
northeast-1のアベイラビリティゾーンのノード群に限定して
負荷分散できる
ap-northeast-1b USA
プライマリ セカンダリ セカンダリ
21. クライアントの動作(障害発生時)
• 障害発生時、一旦は例外が生じる(必要ならリカバリ
Japan
処理を行う)。
ap-northeast-1a
• もう一度リクエストを実行すれば、フェイルーバーした
クライアント
プライマリへ自動的に接続し直して処理を続行できる。
ap-northeast-1b USA
AutoConnect
Exception
プライマリ セカンダリ
プライマリ セカンダリ
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.y
Japan Ireland USA
WebApp WebApp
MongoDB MongoDB MongoDB
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.y
Japan Ireland USA
WebApp WebApp
MongoDB MongoDB MongoDB