Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
作られては消えていく泡のように儚いクラスタの運用話
Search
Tsuyoshi Torii
February 26, 2023
Technology
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
作られては消えていく泡のように儚いクラスタの運用話
2014年YAPCで発表した資料です
Tsuyoshi Torii
February 26, 2023
More Decks by Tsuyoshi Torii
See All by Tsuyoshi Torii
Claude Cowork全社展開のために、MCPゲートウェイを自作した話
toritori0318
2
110
TV連動サービスのリアルタイム通知を支える技術
toritori0318
0
130
Shinken Monitoringについて真剣に調べてみた結果
toritori0318
0
360
Chef SoloからItamaeに完全移行した話+
toritori0318
0
140
Docker3兄弟
toritori0318
2
7.2k
TV視聴参加型システムを支えるSocket.IOクラスタの裏側
toritori0318
12
3.9k
Other Decks in Technology
See All in Technology
OTel × Datadog で 「AI活用」を計測し、改善に繋げる
shihochan
2
640
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
3
840
感情と身体を置き去りにしない、エンジニアの生きのこり方 ──いまから、ここから「自分の状態」を扱うという選択
saorimurooka
0
340
4人目のSREはAgent
tanimuyk
0
180
5分でわかるDuckDB Quack
chanyou0311
3
250
起点・思考・出力で分解する 〜PM業務の自動化設計〜
kazu_kichi_67
1
1.1k
2026-06-24_人とAIの責務分離に基づく開発プロセスの提案.pdf
takahiromatsui
0
120
Lightning近況報告
kozy4324
0
220
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
140
AWS Security Agent といっしょに脅威モデリングをやってみよう
amarelo_n24
1
210
AIチャット検索改善の3週間
kworkdev
PRO
2
180
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
20
7.5k
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
234
18k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Producing Creativity
orderedlist
PRO
348
40k
The Cult of Friendly URLs
andyhume
79
6.9k
Mobile First: as difficult as doing things right
swwweet
225
10k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
New Earth Scene 8
popppiees
3
2.4k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Test your architecture with Archunit
thirion
1
2.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Transcript
2014/08/29 YAPC Asia 2014 Tsuyoshi Torii (@toritori0318) Bascule Inc. 作られて
消えていく 泡 ように儚いクラスタ 運用話
自己紹介 • 鳥居 剛司 Tsuyoshi Torii • @toritori0318 • 株式会社バスキュール
• Node.js / Python / Perl / Ruby • 二児 父
DEV Ops
主にTVとスマートフォンを 同期して云々〜 といった仕事をしています
BloodyTube 血液型対抗レースに視聴者が参加して番組を構成する完全インタラクティブTV バスキュール 企画・提供・制作 視聴者 スマホから 参加状況がテレビに反映される 優勝チームに リアル店舗で利用できるPontaポイントが提供される B2O2O(Broadcast
to Online to Offline)マーケティング施策にもチャレンジ http://pieces.bascule.co.jp/2014/bloodytube/en/
https://www.bascule-go.com/product/
About MIES • Sonischooter – リアルタイム同期/タイムライン/Elastic Socket.ioクラスタ • Harvestmoon –
ユーザアクション(投票/投稿など)を受付/集計 • Persona – MIES/コンシューマユーザ統合 – SNS連携 • Kanten(tofuクローン) – 画像変換 • ELF – 視聴ログ集計/解析 • Punisher – TV案件用ベンチマーククラスタ
今日話すこと
•TV案件 特徴 •性能評価とか監視とか •運用改善 話そ 1 •運用改善 話そ 2 •今後改善していきたいこと
今日話さないこと
•フロントエンド 話 •アプリケーションレイヤ 話 •闇 – キャパシティガ〜 – クラウドフロントガ〜 –
イーエルビーガ〜 – ジーエーイーガ〜
TV案件 特徴
運用サイクル
運用例 • 1週間前にティザーサイト公開 – ロールごとに最小インスタンス数で構築 • 放送日前日〜当日 – インスタンスを数十台〜数百台起動 –
放送時間に張り付き監視 – 終了後バックアップ • 当日〜数日後 – 全て インスタンスを一括削除
None
TV連動運用 • 基本 「放送時間」 – 案件によって異なる • ティザーサイトがある場合も • 1回きり/2−3回/毎日/毎週
• 想定ユーザ数バラバラ • コストも割とシビア • 本番稼働しているサーバ(特に放送時間中) に対して変更を行うこと あまりない(*1) (*1)サーバに限る かつ 条件付き
負債回収
• 特に忙しい時期 – 期末期初/年末年始 • 作ったも 本番終了後に削除 • 0から作り直す/まとまって空いている期間 がある
で技術的負債を返済しやすい環境 であるといえる ※あくまで現時点 話
ここまでが TV案件 特徴に ついて
性能評価/監視 話
性能評価
アクセスパターンについて
• 曜日/時間帯/企画内容からユーザ規模が ある程度想定できる • アクセスパターンをある程度把握できる で、 ど 部分に負荷が集中しやすいか事前に特 定できる •
本番怖い
本番怖い
一発勝負
Punisher
Punisher • NodeJS製ベンチマーククラスタ • スクリプトをJavascriptで記述 • 機能 – リアルタイムで開始/停止が可能 –
リアルタイム集計(タスク集計 み) – AWS全リージョン対応 • 1コマンドでAWS全リージョン インスタンスを起動/ 分散デプロイ – スポットインスタンス(半)自動入札
書いた理由
状況を完璧に再現したい
シナリオ例 • 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…
None
(良い)副作用 シナリオを書くことによって 事前にあぶない部分が 判明する
None
安心感
監視
監視(放送当日以外) • Nagios/Munin • インスタンス タグから自動でコンフィグファイ ルを作成するような自前ツール • メール &
IRC > HipChat > Slack • もう少しオシャレにしたい – Sensu〜♪
監視(放送日当日) • 負荷が来る日時が予めわかっている – 放送時間に張り付き監視 • 全体的な監視 – CloudWatch –
Proteus-Monitor – ソケットクラスタ管理ツール(独自) • ロールごと 個別監視 – top – vmstat – tail –f error.log – App::RedisTop(*1) (*1)https://github.com/toritori0318/p5-App-RedisTop
Proteus-Monitor
Proteus-Monitor • リアルタイムで各サーバ CPU/Load/Mem/Net/etc…が確認できる • サーバ一覧で確認できる • 設定がお手軽 • Nodeが動的に追加/削除される
• 過去 指標 残らない • 名前でフィルタできるようにパッチをあててい る
ソケットクラスタ管理ツール
ここまでが 性能評価/監視 話
運用改善 話 そ 1
そ 前にMIES 話 • 最初から「MIESを作るぞ!」という目的があった わけで ない • 案件をこなしていくうちに「こ 部分
共通化でき そう」「こ 部分 汎用化しておくと開発楽だよ 」といった感じでエンジニアが自発的にアイデ アを出し、一つ一つカタチにしていったら自然に 出来上がっていた • 当初 機能重視で開発 • 一つ一つ サービス 独立していて疎結合
•3人 –TD or 独自アプリケーション(1名) –TD or MIESコア開発運用(1名) –MIESコア開発運用(1名) Server Team
サービス 言語 デプロイ/スケール 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
俺が、俺がSPOFだ!
問題 • サービス毎 秘伝 タレ – 開発環境/デプロイ/構築/スケール管理 • 1サービス毎に運用出来る人が一人 •
運用コスト – スクリプト化して いるが手順がバラバラ – 他 人が手順を知らない or 知る が大変 – 工数がかかる – お金がかかる
解決したいこと • 全て サービスで仕組みを共通化 – 開発フロー/デプロイ/クラスタ構築/スケール管理 • これらを同じインタフェース(コマンド)で統一したい • 引き継ぎしやすくなる
• CIしやすくなる • 誰でもミス無く簡単に運用できる • コストダウンに繋がる
解決策
None
• 開発フロー/デプロイ – Vagrant + vagrant-aws + chef-deploy • プロビジョニングツール
– Chef+Berkshelf • クラスタ管理 – AWS CloudFormation • スケールコントロール – AWS AutoScaling
MIES-Provision-Task
MIES-Provision-Task • Rakeタスク – 基本的に vagrant/aws-cli ラッパー • Vagant +
vagrant-aws + vagrant-amiで統一化 • プロビジョニング Vagrant-chef-solo-provisioner • デプロイ chef-deployリソース • クラスタ管理 CloudFormation • スケール管理 AutoScaling
ざっくり補足
開発フロー
開発フロー • VagrantfileにVM リストを設定(*1) • Chefレシピ(nodes)もVMに合わせて作成(*1) • vagrantコマンド(Rakeでラップ)でVM起動/プロビジョニング /ssh/削除/イメージ保存を行う •
複数サーバへ デプロイ 行わず、AMIを作るだけ 操作を行う (CloudFomation用 AMI) • CloudFormationテンプレート ロール毎に用意しておき、Rakeタ スク内でマージ • クラスタへ 反映 CloudFormationでAMIを更新することで行う (*1) 管理単位 「環境(+ロール)」
VM管理例 • local • aws_hm_dev • aws_hm_stg • aws_hm_prd_wap •
aws_hm_prd_redis Chefレシピ/AMIもこ 単位で管理
イメージ保存
イメージ保存 • 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
スケール管理
スケール管理 • CloudFormation パラメータで指定 • Rakeタスクでも用意しておく(後述)
None
インフラ共通化
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作成する時にこれらを適用する
Supervisor • Python製デーモン管理ツール • 一度に複数デーモンを操作/自動リスタートなど 対応 • グループ機能を利用 – 例
• supervisorctl restart all # supervisor全管理プロセス • Supervisorctl restart wap: # nginx / webapp • Supervisorctl restart redis: # redis_6379 / redis_6380 / … • Supervisorctl restart worker: # ワーカー全般
補足終わり
None
Rakeタスク
Local VM Task • rake local:up • rake local:provision [deploy=1]
• rake local:spec • rake local:destroy • rake local:ssh
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>
AWS Task • rake aws:fakepacker vm=<vmname> – up > provision
> spec > create_ami > destroy
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>
タスク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
タスクTips • rake vms
None
解決
ここまでが 運用改善 話 (そ 1)
運用改善 話 そ 2
問題 • 同時並行案件が増えてきた… – アプリレイヤーで 複数対応しているが、インフラ …?
問題 • 案件による規模 違い – 案件A:ティザー2週間+本番2回:規模10万人 – 案件B:毎週金曜レギュラー:規模1万人 – 案件C:本番1回:規模100万人
• コスト問題 • 単発番組/レギュラー番組 – 他 案件用に改修入りそうだけどレギュラー番組 で動いてる に影響出たらどうしよう…
解決案 • AWSアカウントを案件毎に分けて、別クラスタ を構築出来るようにする – 1クラスタにしない理由 • 規模によって別構築したい • 一度本番稼働している環境をいじる
が怖い – 1アカウントで管理しない理由 • オペレーションまざる が怖い
None
手順共通化したし 行ける で …!
現実 • AMI移動 ( or BaseAMI作り直し) • Keypair設定 • AWSキー更新(*1)
• アプリケーション 改修 – MySQL/Redisサーバ/インスタンス 数 • 案件/インスタンスタイプに合わせたワーカー数設定 – アプリケーション(gunicorn/cluster/starman)・SQSワーカー など • これら 再設定が終わったらchef実行し直す… • まーめんどい (*1) IAMロール 使わない
さらなる解決案
案件ごと コンフィグレーションを 一元管理してしまおう
Omniscient
Omniscient • サービス全体 コンフィグレーションを管理 • 管理軸 – 案件毎/環境毎(dev/staging/stress/production) • アプリケーションコンフィグ(おまけ)
– サービス毎 エンドポイント – サービス毎 オプション設定 • インフラコンフィグ – AWS情報 – キャッシュ/Redis/RDS/などDB エンドポイント – ワーカープロセス 数 – 自社製RedisCluster コンフィグ設定
Omniscient概要図 クラスタ起動。同時に インスタンス 情報を Omniscientに登録 定期的にOmniscient 情報をPullし、更新され たらサーバに反映 クラスタ起動。同時にイ ンスタンス
情報を Omniscientに登録。 アプリ側 取得して反映
移行コスト改善〜♪
Serfも検討したが… • Serf – オーケストレーションツール – ゴシッププロトコロルを用い、クラスタ全体に何ら か メッセージを伝搬 •
検証 – 複数軸で管理しようとした時、逆に複雑に • よい方法があれ 〜
ここまでが 運用改善 話 (そ 2)
さらに改善して いきたいこと
やりたいこと一覧 • Docker化 – 開発環境配布 – サービス環境配布 – プロダクション? •
MIESサービス統合管理 • Omniscientゲートウェイ計画 • Rakeタスク Golang化
まとめ
• TV案件で 24時間365日稼働サー ビスと がん るところ/手を抜け るところが違う • 要件に合った運用改善〜 •
まだまだ改善したい〜 • 本番怖い
おまけ情報 • Rakeタスク/サンプルファイルなどブログにお いてあります でご参照下さい(若干古い) – http://d.hatena.ne.jp/toritori0318/20130916/1379355060 – https://github.com/toritori0318/vagrant-aws-sample
ご清聴ありがとう ございました