アカツキはどのようにAWSを活用しているか #jawsug

28
2014/05/20 JAWS UG 田中 勇輔

description

第21回 AWS User Group - Japan 東京勉強会 - Startup CTO AWS Battle http://jawsug-tokyo.doorkeeper.jp/events/11269

Transcript of アカツキはどのようにAWSを活用しているか #jawsug

Page 1: アカツキはどのようにAWSを活用しているか #jawsug

2014/05/20 JAWS UG田中 勇輔

Page 2: アカツキはどのようにAWSを活用しているか #jawsug

田中 勇輔 @csouls, @yusuket• 株式会社アカツキ

• CTOではない

• 責任者…?責任感は強い方です!

Page 3: アカツキはどのようにAWSを活用しているか #jawsug

アカツキ• ソーシャルゲーム出しています

• ブラウザゲームは、Ruby on Rails

• ネイティブゲームは、C++ と Ruby on Rails

Page 4: アカツキはどのようにAWSを活用しているか #jawsug

インフラ 構成VPC ELB EC2 RDS

ElastiCache CloudFront

S3

Page 5: アカツキはどのようにAWSを活用しているか #jawsug

構築• CloudFormation + Chef + Capistrano

• CloudFormation template

• https://gist.github.com/yusuket/40e2ec7811cf1cd3d703 ( yusuket の public gist )

Page 6: アカツキはどのようにAWSを活用しているか #jawsug

デプロイ

Page 7: アカツキはどのようにAWSを活用しているか #jawsug

デプロイ• 管理用(踏み台)サーバ[Public zone]からWeb

サーバ群[Private zone]に対してCapistranoを実行

Page 8: アカツキはどのようにAWSを活用しているか #jawsug

デプロイ• デプロイ内容をどうやって決めているか?

• Gitのタグ

# 検証が終わった環境から、本番用の production/yyyymmddhhmmss タグを作るgit tag production/yyyymmddhhmmss!# git tag 結果は文字列の昇順にソートされているので、# 最後に表示される production タグをもとにデプロイするgit tag | grep "^production" | last

※Capistranoでの実装: http://hackerslab.aktsk.jp/technology/2014-04-29-faster-deploy/

Page 9: アカツキはどのようにAWSを活用しているか #jawsug

デプロイ• デプロイ先をどうやって決めているか?

• AWSのタグ

• Webサーバの数は変動するので、プログラムで判断する為には、インスタンスの「役割」を明確にする必要がある

※Capistranoでの実装: http://hackerslab.aktsk.jp/technology/2014-04-29-faster-deploy/

Page 10: アカツキはどのようにAWSを活用しているか #jawsug

デプロイ• データの更新も同時に実施

• Assets on Cloud パターン (静的コンテンツ)

• Rails だと、asset_sync Gem を使うと簡単

※ http://d.hatena.ne.jp/lettas0726/20130320/1363773153

Page 11: アカツキはどのようにAWSを活用しているか #jawsug

デプロイ• クライアントが予めダウンロードしておく画像やサウンドデータの更新

• 仕組みは、S3のデータとレポジトリの差分を毎回アップロード

• 毎回S3のデータをダウンロードするのは遅いので、S3上にFilepath + MD5のリストを作っておいて、そのリストとレポジトリを比較

Page 12: アカツキはどのようにAWSを活用しているか #jawsug

リスト取得

def s3_md5_list(bucket, platform) obj = bucket.objects.with_prefix("#{platform}/md5_list/").sort_by{|o| o.last_modified}[-1] return [] if obj.nil? obj.read.each_line.map do |line| line.chomp.split("\t") endend

• 直接S3上のファイルを操作できる AWS-SDK が素晴らしい

Page 13: アカツキはどのようにAWSを活用しているか #jawsug

RDSの話

Page 14: アカツキはどのようにAWSを活用しているか #jawsug

RDS• 2014/4 全国TV-CM開始!

• RDS Master DB Instance type は既に

db.cr1.8xlarge (最大サイズ)

• CPU使用率は30%弱

• ユーザ数は最大3~4倍を想定。普通に考えてCPUリソースが枯渇する

Page 15: アカツキはどのようにAWSを活用しているか #jawsug

立ち止まれない運用

Page 16: アカツキはどのようにAWSを活用しているか #jawsug

迫り来るCM

Page 17: アカツキはどのようにAWSを活用しているか #jawsug

どうしたか?

Page 18: アカツキはどのようにAWSを活用しているか #jawsug

RDS

• 全データベース の

innodb_flush_log_at_trx_commit を 0 に、

sync_binlogを 0 に

Page 19: アカツキはどのようにAWSを活用しているか #jawsug

どういうことか?

Page 20: アカツキはどのようにAWSを活用しているか #jawsug

RDS• Commit 時の REDO ログと binlog の fsync() を止める

• srv_sync_log_buffer_in_background() によって、1秒置きにログは fsync() されている

• 障害時に最大1秒間のデータが消失する可能性がある!(Master DB では普通やらない)

Page 21: アカツキはどのようにAWSを活用しているか #jawsug

RDS

 1. ユーザが来ないよう祈る

 2. アプリケーションと構成を変える

(DynamoDB導入、Shading 等)

→ 3. 最大1秒のデータ消失を許容する

Page 22: アカツキはどのようにAWSを活用しているか #jawsug

RDS

• 結果、CPU使用率は 5% 程度に

• WriteIOPSも少し下がった

• TV-CM乗り切った

• パラメータは戻す予定。余程のことが無い限り、参考にしない方が良いと思います

Page 23: アカツキはどのようにAWSを活用しているか #jawsug

監視

Page 24: アカツキはどのようにAWSを活用しているか #jawsug

CloudWatchのアラートをChatに流すのが良い

Page 25: アカツキはどのようにAWSを活用しているか #jawsug

監視• Pull型のメールと違い、すぐに気付ける

• 「この辺がやばそう」「自分はここを調べる」という会話が同じコンテクストの中ですぐに出来る

Page 26: アカツキはどのようにAWSを活用しているか #jawsug

監視• https://github.com/blackline/amazon-

cloudwatch-to-hipchat を使ってます

Page 27: アカツキはどのようにAWSを活用しているか #jawsug

他にも苦労や工夫の話はたくさんあるのですが、今日はこ

れくらいが限界です

Page 28: アカツキはどのようにAWSを活用しているか #jawsug

ありがとうございました!5分は短い…