プロンプトとコンテキスト
面接官の質問:「当社のB2B SaaSはデータを2つのリージョンに複製しています。プライマリリージョンで障害が発生した際、顧客が切り替えをトリガーできるようにすべきでしょうか?」顧客が基盤となるデータベースを直接操作することはできず、プロダクトはテナント分離、データレジデンシー、および監査可能性を維持しなければならないものとします。これは、プラットフォームプロダクトマネージャー、インフラストラクチャプロダクトマネージャー、およびテクニカルプログラムマネージャーの面接に適したテーマです。
このテストはプロダクトの境界設定を問うものであり、「自動化する方が速い」という短絡的な反応を評価するものではありません。AWSは極めて高い耐障害性のためにマルチリージョン設計を位置付けていますが、リージョン間依存関係が体制を弱める可能性があると警告しています。Google Cloudはリカバリを設計、構築、テストする必要があると述べています。Azureはビジネス要件、RTO、RPO、コスト、複雑性を中心に選択肢を組み立てています。
面接官が評価するポイント
- 「顧客がコントロールを求めている」という要望を、測定可能なRTO、RPO、レジデンシー、コンプライアンスの要件に落とし込めるか?
- プラットフォームによる自動切り替え、オペレーター承認による切り替え、顧客要求による切り替えを明確に区別できるか?
- レプリケーション遅延、スプリットブレイン、DNSキャッシング、クォータ、誤検知シグナルなどの障害モードを挙げられるか?
- 優れた回答は、事前チェック、承認、リハーサル、監査、フェイルバックを備えたテナントコントロールプレーンに操作をスコープします。不十分な回答は、無防備なフェイルオーバーボタンをそのまま公開してしまいます。
回答前の明確化のための質問
どのような障害を解決しようとしているのか?
単一テナントのアプリケーション障害であれば、分離や再起動で対処できる場合があります。リージョン全体の停止こそが、リージョン間切り替えの対象となるケースです。レイテンシのみが要件である場合、マルチリージョンはよりシンプルなマルチAZ設計に勝てない可能性があります。
RTOとRPOはどの程度か?
非同期レプリケーションでは、最新の書き込みが失われる可能性があります。RPOゼロの要件は、通常の非同期レプリカボタンでは満たせません。RTOはウォームキャパシティを決定し、RPOは許容可能なレプリケーション遅延を決定します。
どのデータを元のリージョン外へ移動できるか?
レジデンシー、暗号化キー、バックアップ、ログによって、対象となる移行先リージョンが変わります。「セカンダリリージョン」が自動的にコンプライアンスを満たすリージョンであるとは限りません。
30秒での回答
「私なら各テナントの可用性ターゲット、許容可能なデータ損失、レジデンシーの制約に基づいてエクスペリエンスを階層化します。プラットフォームは通常、明確なヘルスシグナルに基づいて自動的またはオペレーターの承認を得て切り替えるべきです。事前チェックを通過したテナントのみが、レプリカを直接昇格させるのではなく、監査された切り替えリクエストを送信できるようにします。リクエストでは、レプリケーション遅延、ターゲットのキャパシティ、キー、バージョン、依存関係をチェックし、その後書き込みを凍結またはドレインします。切り替え後は、エラー、書き込み状態、RPOを監視し、フェイルバック基準を満たした場合にのみ通常運用を復旧します。小規模なテナントグループでリハーサルを実施し、復旧時間、誤った切り替え、顧客への影響を比較した上で、アクセスの拡大を判断します。」
ステップバイステップの解決策
- プロダクトの契約を定義する。 リージョンフェイルオーバーをテナントスコープのディザスタリカバリ操作として扱います。目標RTO、最大RPO、利用不可となる機能、価格、顧客の責任範囲を明記します。契約を満たせないレプリカは準備完了として表示してはなりません。
- 3つの制御階層を作成する。 プラットフォームの自動化は明白なリージョンヘルスシグナルに適しています。オペレーターの承認はビジネス影響を伴う共有依存関係に適しています。顧客のリクエストは、ポリシーによって評価される制約付きコマンドを作成するものとします。顧客がDNSを直接編集したり、データベースを昇格させたり、キューをリプレイしたりしてはなりません。
- 事前チェックを実行する。 レプリカの追従時間、ターゲットのクォータ、アプリケーションのバージョン、キーの可用性、キューのバックログ、外部依存関係、レジデンシーを検証します。チェックに失敗した場合は、操作を受け入れる前に実行可能な理由を返すべきです。
- 書き込み権限を保護する。 プライマリでの書き込みを停止またはドレインし、最後に確認された位置を記録して、書き込み権限を厳密に1つだけ昇格させます。非同期レプリケーションによって生じる不明なウィンドウを明示します。『レプリケート済み』は損失ゼロを意味しません。
- 検証とフェイルバックを行う。 ログイン、読み取り、書き込み、ジョブ、監査にシンセティックトランザクションを使用します。エラー率、レプリケーション位置、キューの滞留時間、テナントの成功率を監視します。フェイルバックの前には逆方向の追従を行い、競合をリハーサルして、復旧によって2つの書き込み元が発生しないようにします。
- ロールアウト手法を選択する。 社内テナントまたは希望するテナントに対する読み取り専用シミュレーションから始め、次にオペレーター承認による切り替えを実施し、その後で自動化を検討します。誤った切り替え、RPO違反、不十分なターゲットキャパシティ、監査証跡の欠落など、定義された停止条件に達した場合は一時停止します。
模範回答
私なら顧客に単純なボタンをそのまま提供することはありません。まず、リージョンを跨ぐRTOが必要かどうか、許容できるRPOはどの程度か、どのレジデンシー制約が適用されるかを確認します。プロダクト側で「フェイルオーバーのリクエスト」を提供することは可能ですが、そのリクエストはテナントポリシー、レプリケーション位置、ターゲットキャパシティ、バージョン、キー、依存関係のチェックを通過しなければなりません。
切り替え中、プラットフォームはプライマリでの書き込みを凍結またはドレインし、最後に確認された位置を記録し、1つの書き込みレプリカを昇格させ、予想されるデータ損失ウィンドウと利用できない機能を明示します。その後、シンセティックトランザクションによって読み取り、書き込み、ジョブ、監査を検証します。テナントごとにエラー、レプリケーション状態、復旧時間を測定します。逆方向の追従によりスプリットブレインが発生しないことが証明された後にのみ、フェイルバックを開始します。
社内テナントでリハーサルを行い、オペレーターの承認を追加し、十分な実績が得られた後にのみ自動化を検討します。誤った切り替え、RPO、またはキャパシティの事前チェックが閾値を超えた場合は、顧客トリガーのアクセスを無効化し、監査ログを保持します。これにより、ディザスタリカバリのリスクを顧客に転嫁することなく、可視性と制限付きの制御を提供できます。
よくある間違い
- マルチリージョンを自動可用性と同一視する → 昇格、依存関係、フェイルバックを無視してしまう → コンポーネントごとにRTO/RPO、リハーサル、フェイルバックを文書化する。
- 顧客にデータベースを直接昇格させる → スプリットブレインや他テナントへの影響のリスクがある → ポリシーによって実行される監査可能なテナントコマンドを提供する。
- リージョンのヘルス状態のみをチェックする → DNSの健全性は、データ、キー、クォータの準備完了を証明しない → レプリケーション位置、キャパシティ、バージョン、キー、依存関係を含める。
- データ損失ゼロを約束する → 非同期レプリケーションには未確認のウィンドウが存在する → RPOを明記し、最後に確認された位置を記録し、起こり得る損失範囲を表示する。
- フェイルバックをスキップする → 復旧したプライマリによって二重書き込みやドリフトが発生する可能性がある → 逆方向の追従、競合検出、段階的なフェイルバックを設計する。
フォローアップ質問と回答
顧客がRPOゼロを求めた場合はどうするか?
非同期レプリケーションではRPOゼロを提供できないことを説明します。同期レプリケーションまたはビジネスレベルの二重書き込みを検討し、レイテンシ、可用性、コスト、一貫性を再計算します。それでも目標を満たせない場合は、測定可能な最大損失ウィンドウに置き換えます。
誤ったヘルスシグナルが自動化をトリガーした場合はどうするか?
複数のシグナル、最小継続時間、および人間による中断ウィンドウを必須とします。重要度の高いテナントについては、昇格前に凍結および事前チェック済みの状態に移行します。すべての決定を記録し、誤切り替え率と復旧時間を使用して閾値を調整します。
リクエスト後にターゲットリージョンにキャパシティがない場合はどうするか?
クォータとキャパシティを事前チェックし、重要なテナント向けに予算やオートスケーリング計画を確保します。失敗時には理由を返し、プライマリの状態を維持します。ボタンの成功率を上げるためだけに準備が整っていないリージョンへ切り替えてはなりません。
障害発生中にレジデンシールールを免除できるか?
例外を想定してはなりません。許可されたリージョン、暗号化キー、ログの境界をテナント契約とポリシーに盛り込みます。越境データ移動が禁止されている場合は、同一リージョン内のマルチAZ耐障害性または明示的な縮退モードを提供します。