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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

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

Avatar for Tsuyoshi Torii

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化