ゼロダウンタイムデプロイとは?
ゼロダウンタイムデプロイとは、ユーザーへの一切の中断なしにサービスの新しいバージョンをリリースする手法です - メンテナンスウィンドウもエラーもリクエストの取りこぼしもありません。
ユーザーはソフトウェアが24時間いつでも利用できることを期待しているため、デプロイのためにシステムを停止することはますます受け入れられなくなっています。ゼロダウンタイムデプロイは、新しいバージョンを導入・検証している間も常に健全なバージョンがトラフィックを処理し続けることで、シームレスなリリースを実現します。
必要となるもの
本質的な要件は、リクエストを処理する動作中のバージョンが常に存在することです。古いバージョンを停止して新しいものを起動するのではなく、新しいバージョンを古いものと並行して立ち上げ、健全であることを確認し、その後にはじめてトラフィックをそこへルーティングします - こうすることでユーザーが空白に遭遇することはありません。
それを実現する手法
- インスタンスを少しずつ入れ替える rolling deployment。
- 2つの完全な環境を切り替える blue-green deployment。
- トラフィックを段階的に移行する canary release。
- インスタンスを削除する前にコネクションをドレインする load balancer。
ヘルスチェックとコネクションドレイン
ゼロダウンタイムは、新しいインスタンスが本当に準備できたのを把握し、古いインスタンスを穏やかに終了させることに依存します。ヘルスチェックは新しいバージョンが処理できるようになるまでトラフィックをゲートし、コネクションドレインは古いインスタンスが削除される前に処理中のリクエストを完了させるため、どのリクエストも切断されません。
難しい部分: 状態とスキーマ
ステートレスなサービスはゼロダウンタイムでのデプロイが容易ですが、データベースとスキーマが課題です。スキーマ変更は、ロールアウト中に古いバージョンと新しいバージョンが共存できるよう後方互換性を保つ必要があります。expand-and-contract マイグレーションのような手法を使えば、同期的なカットオーバーを一切必要とせずにスキーマを進化させられます。
なぜ重要か
ユーザーの満足度を超えて、ゼロダウンタイムデプロイは頻繁なリリースを実現可能にするものです。もしすべてのデプロイがダウンタイムを意味するなら、チームは変更をまとめてめったにデプロイしなくなるでしょう。シームレスなデプロイはそのペナルティを取り除き、優れたデリバリーが依存する小さく頻繁なリリースを可能にします。
重要なポイント
- ゼロダウンタイムデプロイは、ユーザーへの中断なしに新しいバージョンをリリースします。
- 新しいバージョンを導入・検証している間、健全なバージョンが処理を続けます。
- 難しいのは、状態とスキーマを後方互換性のある形で進化させることです。