[レポート]YAPC::Asia TOKYO 2015 Consul/Strecherで大規模なPULL型デプロイを実現する #yapcasia

2015.08.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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 のアーキテクチャ

stretcher_architecture

大前提として各ノードが Consul の管理下にあるものとします。

デプロイは以下の手順で行われます。

  1. アプリケーションをbuildしてtar.gzにする.依存cpan moduleなどすべて固める
  2. 手順書(manifest)を書く
  3. tar.gz, manifestをS3(or httpd)に上げる
  4. consul event で manifest URLを通知 $ consul event -name deploy s3://

ここからがstretcherの出番です。

consul wait でイベント通知を待っておきます。

$ consul watch -type event -name deploy stretcher

  1. event から manifest URLを取得
  2. manifest ファイルからtar.gzを取得してTMPDIRに展開
  3. rsync -av --deleteで更新
  4. 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(ダッシュボード) も開発されています。

DNS の stale read

DNS の問い合わせはリーダーノード経由で行われます。

障害などでリーダーノードがこけると、別のリーダーが再選出されるまで、DNS サーバのダウンタイムが数秒発生します。 stale モードで Consul の各ノードを稼働させると、リーダー以外のノードも stale cache で応答するようになり、可用性があがります。

その他

strecher が影響を受けたソフトウェア

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

参考サイト