Upgrade to Pro — share decks privately, control downloads, hide ads and more …

作られては消えていく泡のように儚いクラスタの運用話

 作られては消えていく泡のように儚いクラスタの運用話

2014年YAPCで発表した資料です

Tsuyoshi Torii

February 26, 2023
Tweet

More Decks by Tsuyoshi Torii

Other Decks in Technology

Transcript

  1. 2014/08/29 YAPC Asia 2014 Tsuyoshi Torii (@toritori0318) Bascule Inc. 作られて

    消えていく 泡 ように儚いクラスタ 運用話
  2. About MIES • Sonischooter – リアルタイム同期/タイムライン/Elastic Socket.ioクラスタ • Harvestmoon –

    ユーザアクション(投票/投稿など)を受付/集計 • Persona – MIES/コンシューマユーザ統合 – SNS連携 • Kanten(tofuクローン) – 画像変換 • ELF – 視聴ログ集計/解析 • Punisher – TV案件用ベンチマーククラスタ
  3. 運用例 • 1週間前にティザーサイト公開 – ロールごとに最小インスタンス数で構築 • 放送日前日〜当日 – インスタンスを数十台〜数百台起動 –

    放送時間に張り付き監視 – 終了後バックアップ • 当日〜数日後 – 全て インスタンスを一括削除
  4. TV連動運用 • 基本 「放送時間」 – 案件によって異なる • ティザーサイトがある場合も • 1回きり/2−3回/毎日/毎週

    • 想定ユーザ数バラバラ • コストも割とシビア • 本番稼働しているサーバ(特に放送時間中) に対して変更を行うこと あまりない(*1) (*1)サーバに限る かつ 条件付き
  5. Punisher • NodeJS製ベンチマーククラスタ • スクリプトをJavascriptで記述 • 機能 – リアルタイムで開始/停止が可能 –

    リアルタイム集計(タスク集計 み) – AWS全リージョン対応 • 1コマンドでAWS全リージョン インスタンスを起動/ 分散デプロイ – スポットインスタンス(半)自動入札
  6. シナリオ例 • 30分間に30万人が以下 処理を行う 1. ログイン • 内8割がゲストユーザ/2割がSNS接続ユーザ 2. APIサーバに情報取得

    3. 非同期で30秒ごとにhogehogeAPI実行 4. Socketサーバに接続 • 内8割がwebsocket/2割がxhr-polling • 30万接続した状態でブロードキャスト送信 1. 5-15秒後にAPIサーバに対して投票処理 2. etc…
  7. 監視(放送日当日) • 負荷が来る日時が予めわかっている – 放送時間に張り付き監視 • 全体的な監視 – CloudWatch –

    Proteus-Monitor – ソケットクラスタ管理ツール(独自) • ロールごと 個別監視 – top – vmstat – tail –f error.log – App::RedisTop(*1) (*1)https://github.com/toritori0318/p5-App-RedisTop
  8. そ 前にMIES 話 • 最初から「MIESを作るぞ!」という目的があった わけで ない • 案件をこなしていくうちに「こ 部分

    共通化でき そう」「こ 部分 汎用化しておくと開発楽だよ 」といった感じでエンジニアが自発的にアイデ アを出し、一つ一つカタチにしていったら自然に 出来上がっていた • 当初 機能重視で開発 • 一つ一つ サービス 独立していて疎結合
  9. サービス 言語 デプロイ/スケール Person Sonicshooter (リアルタイム同期系) Node.js App::Rad(*1) + Capistrano

    Harvestmoon (アンケート受付) Python Fabric Persona (認証) Python App::Rad + Capistrano Kanten (画像変換) Perl Yoga(*2) (*2) https://github.com/toritori0318/p5-Yogafire (*1) http://d.hatena.ne.jp/tori243/20120622/1340386116
  10. 問題 • サービス毎 秘伝 タレ – 開発環境/デプロイ/構築/スケール管理 • 1サービス毎に運用出来る人が一人 •

    運用コスト – スクリプト化して いるが手順がバラバラ – 他 人が手順を知らない or 知る が大変 – 工数がかかる – お金がかかる
  11. • 開発フロー/デプロイ – Vagrant + vagrant-aws + chef-deploy • プロビジョニングツール

    – Chef+Berkshelf • クラスタ管理 – AWS CloudFormation • スケールコントロール – AWS AutoScaling
  12. MIES-Provision-Task • Rakeタスク – 基本的に vagrant/aws-cli ラッパー • Vagant +

    vagrant-aws + vagrant-amiで統一化 • プロビジョニング Vagrant-chef-solo-provisioner • デプロイ chef-deployリソース • クラスタ管理 CloudFormation • スケール管理 AutoScaling
  13. 開発フロー • VagrantfileにVM リストを設定(*1) • Chefレシピ(nodes)もVMに合わせて作成(*1) • vagrantコマンド(Rakeでラップ)でVM起動/プロビジョニング /ssh/削除/イメージ保存を行う •

    複数サーバへ デプロイ 行わず、AMIを作るだけ 操作を行う (CloudFomation用 AMI) • CloudFormationテンプレート ロール毎に用意しておき、Rakeタ スク内でマージ • クラスタへ 反映 CloudFormationでAMIを更新することで行う (*1) 管理単位 「環境(+ロール)」
  14. VM管理例 • local • aws_hm_dev • aws_hm_stg • aws_hm_prd_wap •

    aws_hm_prd_redis Chefレシピ/AMIもこ 単位で管理
  15. イメージ保存 • vagrant-ami – vagrant-aws 設定を共有できる – Packer 不採用 –

    fakepackerというRakeタスクを作成(後述) % vagrant create-ami --name my-ami \ --desc "My AMI” --tags role=test,environment=dev *参考 http://d.hatena.ne.jp/toritori0318/20130820/1377018423
  16. Chef cookbooks • 全サービスである程度共通化したbase-cookbookを用意 – ユーザ周り – openssh/ntp/timezone/nrpe/etc… – ssh周り

    設定 – Alias or symlink( sv=“supervisorctl” / dstat-full=“dstat –Tclmdrn” ) – 最低限 カーネルパラメータ – xbuild (node/python/perl/ruby) / fluentd / munin-node / supervisord – ディレクトリ(アプリケーション/アプリケーションログ/etc…) • ベースAMI作成する時にこれらを適用する
  17. Supervisor • Python製デーモン管理ツール • 一度に複数デーモンを操作/自動リスタートなど 対応 • グループ機能を利用 – 例

    • supervisorctl restart all # supervisor全管理プロセス • Supervisorctl restart wap: # nginx / webapp • Supervisorctl restart redis: # redis_6379 / redis_6380 / … • Supervisorctl restart worker: # ワーカー全般
  18. Local VM Task • rake local:up • rake local:provision [deploy=1]

    • rake local:spec • rake local:destroy • rake local:ssh
  19. AWS Task • rake aws:create_baseami • rake aws:up vm=<vm_name> •

    rake aws:provision vm=<vm_name> [deploy=1] • rake aws:spec vm=<vm_name> • rake aws:destroy vm=<vm_name> • rake aws:ssh vm=<vm_name> • rake aws:create_ami vm=<vm_name> • rake aws:link_instance vm=<vmname> id=<instance_id> • rake aws:unlink_instance vm=<vmname>
  20. AWS CloudFormation Task • rake aws_cf:generate_cf_json env=<env_name> • rake aws_cf:create_stack

    env=<env_name> • rake aws_cf:update_stack env=<env_name> [<key>=<value>] • rake aws_cf:delete_stack env=<env_name>
  21. タスクTips • 任意 クックブックを指定 – rake aws:provision vm=hoge chef_json=nodes/base.json •

    差分実行 – rake aws:up vm=hoge ami=ami-xxxxxxxxx • 複数タスク実行 – rake aws:up aws:provision aws:create_ami vm=hoge – rake aws:up aws:ssh vm=hoge
  22. 問題 • 案件による規模 違い – 案件A:ティザー2週間+本番2回:規模10万人 – 案件B:毎週金曜レギュラー:規模1万人 – 案件C:本番1回:規模100万人

    • コスト問題 • 単発番組/レギュラー番組 – 他 案件用に改修入りそうだけどレギュラー番組 で動いてる に影響出たらどうしよう…
  23. 現実 • AMI移動 ( or BaseAMI作り直し) • Keypair設定 • AWSキー更新(*1)

    • アプリケーション 改修 – MySQL/Redisサーバ/インスタンス 数 • 案件/インスタンスタイプに合わせたワーカー数設定 – アプリケーション(gunicorn/cluster/starman)・SQSワーカー など • これら 再設定が終わったらchef実行し直す… • まーめんどい (*1) IAMロール 使わない
  24. Omniscient • サービス全体 コンフィグレーションを管理 • 管理軸 – 案件毎/環境毎(dev/staging/stress/production) • アプリケーションコンフィグ(おまけ)

    – サービス毎 エンドポイント – サービス毎 オプション設定 • インフラコンフィグ – AWS情報 – キャッシュ/Redis/RDS/などDB エンドポイント – ワーカープロセス 数 – 自社製RedisCluster コンフィグ設定
  25. やりたいこと一覧 • Docker化 – 開発環境配布 – サービス環境配布 – プロダクション? •

    MIESサービス統合管理 • Omniscientゲートウェイ計画 • Rakeタスク Golang化