※ 本記事は、Ashutosh Mateによる”Disaster recovery strategy for OCI Object Storage“を翻訳したものです。
2022年10月27日
地震、ハリケーン、洪水、その他の厳しい気象などの災害は、クラウド・リージョン全体に予測できない停電を引き起こす可能性があります。Oracle Cloud Infrastructure(OCI)やその他の多くのクラウド・ベンダーで稼働するアプリケーションは、こうした地域機能停止に対して備え、保護する必要があります。OCI Object Storageサービス内のオブジェクトとしてのデータの格納は、リージョンの停止の対象となる場合があります。可用性と耐久性が高いのに、Object Storageは依然としてリージョン別サービスであり、実行されるリージョンによって異なります。このような障害を軽減、準備するために、地理的に別個の異なるリージョンで、Object Storageを介してデータを実行するアプリケーションをデプロイできます。
独自のディザスタ・リカバリ戦略を構築して、OCIクラウド・リージョン間でオブジェクトをレプリケートすることで、リージョンの停止時にアプリケーションの継続性を保証する方法を学習します。
サウンド・ディザスタ・リカバリ戦略は、次のステップで構成されます。:
- 災害への備え
- リージョン間のオブジェクト・レプリケーションの使用
- ディザスタ・リカバリ設定の実装
- アプリケーション・フェイルオーバーの処理
- リージョン・リカバリの処理
- ワンタイム・リコンシリエーションを実行
- アプリケーションのフェイルバックの実行
災害シミュレーション・エクササイズを実行して、これらのリカバリ・ステップを定期的に検証してください。
災害への備え
まれですが、災害はいつでも発生し、クラウド・リージョン全体が停止する可能性があります。1つのリージョンにデプロイされたアプリケーションは、このシナリオではユーザーが使用できなくなります。ただし、OCIの地理的に分離された複数のリージョンでアプリケーションを実行することで、可用性を高めるようにアプリケーションを設計できるため、1つのリージョンの停止が発生してもアプリケーション・サービスは影響を受けません。これらのアプリケーションがOCI Object Storageにデータを格納して使用するように設計されている場合は、リージョンの停止時にデータを使用できることに注意する必要があります。
Object Storageレプリケーションでは、このようなリージョンの停止から保護されます。レプリケーション・リージョンのペアとしてプライマリ・リージョンから遠距離にある地理的に同じ国のOCIリージョンを選択することをお薦めします。たとえば、us-sanjose-1は、us-ashburn-1プライマリ・リージョンのセカンダリ・リージョンとして選択できます。
リージョン間のオブジェクト・レプリケーションの使用
同じリージョンまたは異なるリージョン内のバケット間でオブジェクトを自動的にレプリケートするには、必要なアイデンティティおよびアクセス管理(IAM)ポリシーを構成する必要があります。次に、オブジェクトをレプリケートする宛先リージョンおよびバケットを選択して、ソース・バケットにレプリケーション・ポリシーを構成します。ポリシー作成後にソース・バケットにアップロードされたオブジェクトは、宛先バケットに非同期でレプリケートされます。リージョン間のオブジェクト・レプリケーションの設定方法の詳細は、このチュートリアルを参照してください。
ディザスタ・リカバリ設定の実装
オブジェクト・レプリケーション構成が設定されていると、顧客はオブジェクトを格納する読取り/書込みバケットを使用してプライマリ・リージョンでアプリケーションをアクティブにできます。このバケットはOCI Object Storageによってセカンダリ・リージョンの読取り専用バケットにレプリケートされ、アプリケーションはプライマリとパッシブで同期できます。
障害時のアプリケーション・ユーザーへの影響を減らすために、クライアントはプライマリ・リージョン(us-ashburn-1)から最初に読み取るように戦略的にプログラムでき、読取りが失敗した場合は、セカンダリ・リージョン(us-sanjose-1)からの読取りを試行できます。オブジェクトがレプリケートされる場合、セカンダリ・リージョンで使用可能です。プライマリ・リージョンで一連のオブジェクトの読取りおよび書込み障害が発生した場合、アプリケーションのフェイルオーバーがトリガーされる必要があります。

レプリケーション・ポリシーが作成される前にソース・バケットに既存のオブジェクトがある場合、それらはレプリケートされません。これらの既存のオブジェクトについては、次の方法でレプリケートできます。:
- ソースからオブジェクトを読み取って、「if-none-match: *」を使用して宛先バケットにコピーし、レプリケーションと競合しないようにします
- オブジェクトのレプリケーションをトリガーするソース・バケットへの同じオブジェクトの読取りおよび書込み
アプリケーション・フェイルオーバーの処理
プライマリ・リージョンが停止した場合、アプリケーションのフェイルオーバーをトリガーする必要があります。リージョンの停止により、オブジェクトのリージョン間レプリケーションが停止されます。セカンダリ・リージョン内のアプリケーションで宛先バケット内のオブジェクトを使用するには、そのバケットに読取り/書込み権限が必要です。

リージョン・リカバリの処理
プライマリ・リージョンがリカバリされると、セカンダリ・リージョンとして設定できます。新しいセカンダリ・リージョン(us-ashburn-1)のバケットは読取り専用である必要があります。現在、us-ashburn-1のメディア・バケットへのレプリケーションを開始するには、us-sanjose-1のプライマリ・バケット(bkp-media-bucket)でリージョン間レプリケーションを構成する必要があります。ソース・バケットの「リージョン間レプリケーションの使用」の項に記載されているステップに従います。

ワンタイム・リコンシリエーションを実行
リージョンがディザスタからリカバリされると、ワンタイム・リコンシリエーションでバケット・コンテンツ内の違いに対処できます。リカバリ時間の目標(RTO)および必要なリカバリ・ポイント目標(RPO)に応じて、us-ashburn-1リージョンが停止している間に作成、削除または更新されたオブジェクトは、us-sanjose-1リージョン・バケットと同期する必要があります。
ソース(us-sanjose-1)リージョンと宛先(us-ashburn-1)リージョンの両方のバケットをリストします。違いを見つけたときに、次の可能性があります。:
- オブジェクトはus-sanjose-1に存在しますが、us-ashburn-1には存在しません。「if-none-match: *」を使用してオブジェクトをコピーし、レプリケーションと競合しないようにします。
- オブジェクトはus-ashburn-1に存在しますが、us-sanjose-1には存在しません。: このオブジェクトはレプリケーションによってコピーされなかったか、レプリケートされてからus-sanjose-1で削除されました。これらのオブジェクトを残すことは最も安全ですが、アプリケーションには、何を行うべきかを判断する適切な方法がある場合があります。
- オブジェクトはus-sanjose-1およびus-ashburn-1に存在しますが、オブジェクトは異なります。これがリコンシリエーションの最も難しい部分です。次のいずれかの方法を実行します。:
- エラーをスローします。
- あるオブジェクトを「conflict」バケットに移動し、誰かがそれを確認します。
- 最後のライターが勝ち(クロック時間別)
- アプリケーション固有のマージ・ロジック
- 最初のライターが勝ち
- 新しいプライマリ・リージョンは常に勝ち
調整後、アプリケーションは新しい安定した状態操作としてこの構成を続行することを選択できます。この場合、us-sanjose-1はアクティブなプライマリになり、us-ashburn-1はパッシブ・セカンダリ・リージョンになる可能性があるため、次のフェイルバック・ステップは必要ありません。
アプリケーションのフェイルバックの実行
アプリケーションを元のプライマリ・リージョン(us-ashburn-1)にフェイルバックする場合は、次のステップを使用します。調整が完了したら、アプリケーションを許可し、プライマリus-sanjose-1でバケットを読取り専用にし、us-ashburn-1でバケットを読取り/書込みとし、もう一方の方向でオブジェクト・レプリケーションを構成します。次に、アプリケーションのフェイルオーバーをトリガーします。完了後、元の状態はプライマリ・リージョンとしてus-ashburn-1で実現されます。

まとめ
このブログのメソッドを使用して、ディザスタ・リカバリ・シナリオのオブジェクト・レプリケーションを構成できます。このチュートリアルのステップを使用して、オブジェクト・レプリケーションを構成できます。このブログのステップは、災害が発生した場合にアプリケーションのリカバリのガイドとして使用します。
OCIオブジェクト・ストレージ・レプリケーションの詳細は、ドキュメントを参照してください。Oracle Cloud Infrastructureの使用を開始するには、無料トライアル・アカウントを作成します。
