ゼロダウンタイムの展開の実現には同じ問題が関係していましたが、検討している戦略に関するアドバイスが必要です。
環境
サーバー側の処理にApache / PHPを使用し、永続性にMySQL DB / filesystemを使用するWebベースのアプリケーション。
現在、インフラストラクチャを構築しています。すべてのネットワークハードウェアには冗長性があり、すべてのメインネットワークケーブルは、フォールトトレランスのためにボンディングペアで使用されます。サーバーは、ハードウェアフォールトトレランス用の高可用性ペアとして構成されており、仮想マシンのフォールトトレランスと一般的なパフォーマンスの両方で負荷分散されます。
私は、ダウンタイムなしでアプリケーションに更新を適用できることを意図しています。100%の稼働時間を提供できるように、インフラストラクチャを設計する際に多大な苦労をしました。更新が適用されるたびに10〜15分のダウンタイムが発生するのは非常に残念です。これは、リリースサイクルを非常に高速にすることを意図しているため、特に重要です(1日あたり1つ以上のリリースに達することがあります)。
ネットワークトポロジー
これはネットワークの要約です:
Load Balancer
|----------------------------|
/ / \ \
/ / \ \
| Web Server | DB Server | Web Server | DB Server |
|-------------------------|-------------------------|
| Host-1 | Host-2 | Host-1 | Host-2 |
|-------------------------|-------------------------|
Node A \ / Node B
| / |
| / \ |
|---------------------| |---------------------|
Switch 1 Switch 2
And onward to VRRP enabled routers and the internet
注:DBサーバーはマスターマスターレプリケーションを使用します
提案された戦略
これを実現するために、現在、DBスキーマアップグレードスクリプトを2つの部分に分割することを考えています。アップグレードは次のようになります。
- ノードAのWebサーバーはオフラインになります。トラフィックはノードBのWebサーバーによって引き続き処理されます。
- 移行スキーマの変更はDBサーバーに適用されます
- Webサーバーコードベースが更新され、キャッシュがクリアされ、その他のアップグレードアクションが実行されます。
- WebサーバーAはオンラインになり、WebサーバーBはオフラインになります。
- WebサーバーBのコードベースが更新され、キャッシュがクリアされ、その他のアップグレードアクションが実行されます。
- WebサーバーBがオンラインになります。
- 最終スキーマ変更がDBに適用されます
「移行スキーマ」は、バージョン間の互換性のあるDBを確立するように設計されます。これは、テーブル自体が新しいスキーマに変更される一方で、ほとんどの場合、古いバージョンのスキーマをシミュレートするテーブルビューを使用します。これにより、古いバージョンは通常どおりDBと対話できます。テーブル名にはスキーマのバージョン番号が含まれ、どのテーブルに書き込むかについて混乱が生じないようにします。
「最終スキーマ」は後方互換性を削除し、スキーマを整理します。
質問
要するに、これは機能しますか?
すなわち:
移行スキーマの変更の特定の時点で同時書き込みが発生する可能性があるため、問題が発生しますか?テーブルを変更して下位互換性のあるビューを作成するクエリのグループが連続して実行されることを確認する方法はありますか?すなわち、スキーマの変更が完了するまでバッファに保持されている他のクエリを使用します。これは通常、ミリ秒のみです。
この程度の安定性を提供する一方で、ダウンタイムなしで更新を許可するより簡単な方法はありますか?また、スキーマの下位互換性に縛られることを望まないため、「進化的な」スキーマ戦略を避けることも推奨されます。