Skip to content

Instantly share code, notes, and snippets.

@manji602
Created June 6, 2015 14:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save manji602/b5e5917c9126a86b896a to your computer and use it in GitHub Desktop.
Save manji602/b5e5917c9126a86b896a to your computer and use it in GitHub Desktop.

TC-10 Auto Scaling x Spot Instancesによるスケーラビリティとコストカット事例

具体的、比較可能、再現可能なモデルケースの提供

  • Auto ScalingについてはMin-Maxの振り幅感覚
  • Spot&Reserved Instancesについては使いドコロと倹約の規模感

想定するサービス像

  • Twitterらいくな成長中の自社サービス

    • ユーザ間コミュニケーションが多い
    • push通知、メールの一斉配信を週に数回
    • サービス開始から2年経過
  • ユーザ数:100万人〜

    • アクティブ率:30%〜50%
  • システム構成

    • WebAPIサーバ on EC2
    • Worker on EC2
  • ユーザAがユーザBにmentionを送る

  • ユーザBに通知メールを送る

  • 負荷傾向

    • 600req/min〜24000req/min
    • インスタンスは常時8台
    • オフピーク時のリソースが無駄になる、高い

設計方針と注意点

  • WebAPI

    • リクエスト数に応じてAuto Scaling
    • Spot Instancesは基本的には使わない
  • Worker

    • Job数に応じてAuto Scaling
    • Spot Instancesはかなり使う
      • オンデマンド/ReservedよりSpot Instanceを少し早くスケールアウトさせ、より遅くスケール飲させる
      • これにより、spotが帰る限りspotのみが増減する状況を作る
      • 価格高騰してSpotInstancesが全部落ちたらどうするか
        • 最低1台は立っているReservedが問題ない規模までスケールアウトしてくれる。その所要時間は許容する
        • 処理中にSpotが落ちてStuckしたJobを定期的に改修、リトライするJobを書いておけば無問題
  • 共通

    • Spot Instancesを使わない場合も極力オンデマンドではなくReservedInstancesを使う
    • 小さめのインスタンスタイプを使って細かく増減させて節約
      • m3.2xlarge => m3.large x 4
    • 予定されたアクセス増にはScaduled Actionで対応
    • 予測不可能なスパイクアクセスは今日は考えない

注意点

  • WebAPI

    • スティッキーにしない
      • ELBもアプリもステートレス
    • 急なアクセス増の準備時にはインスタンス数ではなくELBのスケールにも注意
  • Worker

    • 仮にSpotが全く買えなくてもオンデマンド/Reservedで捌けるようアプリを設計する
    • ELBのHealth Checkにたよれないので 自前監視、自殺帰航が必須
  • 共通

    • スケールアウトのトリガーからサービス員までを極力短く(2〜5分)する
    • 時間がかかる初期化処理はAMIに入れておく。全部をchefで頑張ったりしない。
    • 適切なhtresholdはサービスの仕様・規模・ユーザ層の変化によって少しずつ変わっていく。
      • 定期的に設定を見直し、ピークなのに増えないという自体を避ける。
    • インスタンス数、Spot Request数の上限に注意する。

設計の具体例

  • WebAPI

    • リクエスト数に応じたインスタンス数の立ち上げができる
  • パラメータチューニング要領

    • Max = ピーク時のインスタンス数
    • Min = Max * (アイドルReq数 / ピークReq数) + α
    • Threshold

成果

  • 月113万 -> 月27万
  • イニシャルコストは191万かかる

その他のコストカットポイント

  • 書くサービスの購入オプションも考える
    • RDS(Reserved Instances), Elasticache, Cloudfront, Dynamo DBなど
    • 高騰しにくいタイプのSpot Instancesを使うと安心かもしれない
      • 旧世代のc1.mediumとかは狙い目
    • Workerに食わせていたような処理をLambdaでさばくとかなり安くなる
    • アプリケーションのチューニングもオススメ

今後の方向性、考えていること

  • Lambdaをフルに使ったさらなる倹約アーキテクチャ
  • HTTP/2時代にステートレスを前提にしていたScale戦略はどうするか
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment