[レポート]YAPC::Asia TOKYO 2015 Consul/Strecherで大規模なPULL型デプロイを実現する #yapcasia
YAPC::Asia Tokyo 2015 Day 1に参加してきました。
昼休みを挟んで Consul と Strecher を使ったPULL型デプロイに関する発表が2セッションほどありました。 これらは、テーマ・内容が似通っているため、1記事としてまとめて紹介致します。
前者が任天堂・はてなによる発表で、Capistrano の PUSH 型デプロイから Consul/strecher の PUSH 型デプロイへの変遷(デプロイ時間が 1/40 になった)。 後者が strecher 開発者(カヤックの @fujiwara さん)による開発の経緯・導入事例です。
※講演では上記以外のテーマも話されていました。
中央 PUSH 型デプロイからPULL 型デプロイへ
中央PUSH型デプロイは
- デプロイ台数の増加によるデプロイの長時間化
- サーバごとに同じビルド処理が走り、サーバリソース、デプロイ時間を無駄にしている
- デプロイ先サーバの動的な変更に追従するのが苦手
といった課題があります。 この課題を解決するために開発されたのが strecher というデプロイツールです。
strecher はConsul と連携して、これら課題を解決します。
Consul について
Consul は Vagrant や Terraform などで有名な Hashicorp 製の分散型サービスディスカバリツールです。
- 各ノードのヘルチェック
- 各ノードへのメッセージ通知
- Key/Value Store
- DNS/HTTP をしゃべる
といった特徴があります。
strecher では Consul のこれら機能が活用されています。
Consul の主要機能の詳細は公式サイトの Getting Started をご確認ください。
strecher のアーキテクチャ
大前提として各ノードが Consul の管理下にあるものとします。
デプロイは以下の手順で行われます。
- アプリケーションをbuildしてtar.gzにする.依存cpan moduleなどすべて固める
- 手順書(manifest)を書く
- tar.gz, manifestをS3(or httpd)に上げる
- consul event で manifest URLを通知 $ consul event -name deploy s3://
ここからがstretcherの出番です。
consul wait でイベント通知を待っておきます。
$ consul watch -type event -name deploy stretcher
- event から manifest URLを取得
- manifest ファイルからtar.gzを取得してTMPDIRに展開
- rsync -av --deleteで更新
- command実行
ピンポイントで解説します。
アプリのビルドについて
レポジトリではできるだけソースコードのみを管理して、ビルドしたアプリはレポジトリに含めないようにし、レポジトリの肥大化を防ぎます。 ビルド済みのものを S3 で配布するため、各サーバでビルド処理が走ることはありません。
manifest ファイル
manifest ファイルは次のようになっており
- ビルドされたアプリのパス
- インストール手順
などが記述されています。
src: s3://example.com/app.tar.gz checksum: e0840daaa97cd2cf2175f9e5d133ffb3324a2b93 dest: /home/stretcher/app commands: pre: - echo 'staring deploy' post: - echo 'deploy done' success: - echo 'deploy success' failure: - echo 'deploy failed!!' - cat >> /path/to/failure.log excludes: - "*.pid" - "*.socket"
運用面について
Consul でのプロダクション利用
Consul 0.2 時代から1年以上本番運用しているが、問題いということです。
オートスケール時のデプロイ
インスタンスごとにロールが割り振られています。
Consul の KVS には、ロールごとに最新の Manifest 情報があり、新規追加されたインスタンスは、この Manifest ファイルを参照してアプリケーションを最新の状態にし、PULL デプロイ完了後にクラスターに加わるようになっています。
モニタリング
Consul の KVS をブラウザから閲覧して状態を俯瞰できるように UI(ダッシュボード) も開発されています。
- https://github.com/fujiwara/consul-kv-dashboard
- http://sfujiwara.hatenablog.com/entry/2015/01/30/221553
DNS の stale read
DNS の問い合わせはリーダーノード経由で行われます。
障害などでリーダーノードがこけると、別のリーダーが再選出されるまで、DNS サーバのダウンタイムが数秒発生します。 stale モードで Consul の各ノードを稼働させると、リーダー以外のノードも stale cache で応答するようになり、可用性があがります。
その他
strecher が影響を受けたソフトウェア
- sorah/mamiya https://github.com/sorah/mamiya
- AWS CodeDeploy https://aws.amazon.com/documentation/codedeploy/
strecher 開発当初はまだ CodeDeploy がリリースされていなかったため、採用を検討しなかったそうです。
strecher は AWS に依存しない
例えば Manifest 等のファイル置き場は、HTTP サーバ経由でアクセスできれば代替可能です。 ただし、何百MBもあるファイルを100クライアントから同時にダウンロードされてもびくともしない HTTP サーバでなければいけない。
デプロイごとに AMI を作成してインスタンス起動するのはどうか?
AMI 方式だと
- AMIの作成に10分
- デプロイに10分
と時間がかかり、一日になんどもデプロイできないのが嫌だそうです。
一方で、任天堂はホットフィックスリリースを除けば2週間に一度程度のリリースサイクルのようなので、この制約は無視できると思われます。
なおアメリカの動画配信会社 Netflix は Asagard/aminator を使って AMI ベースの Blue-Green デプロイをやっています(いました?)
The Netflix Tech Blog: Deploying the Netflix API
参考サイト
- 発表スライド https://speakerdeck.com/fujiwara3/consultozi-zuo-osswohuo-yong-sita100tai-gui-mo-falsewebsabisuyun-yong
- https://github.com/fujiwara/stretcher
- https://github.com/fujiwara/consul-kv-dashboard
- http://tech.kayac.com/archive/10_stretcher.html
- https://www.consul.io/
- https://aws.amazon.com/documentation/codedeploy/