Azure Cosmos DB の可用性を最大限にする方法

ほとんどのeコマースアプリケーションは、ダウンタイムに対してゼロトレランスです。アプリケーションリソースへの影響は、サイトの全体的な可用性メトリクスに影響を与える可能性があります。Azure Cosmosデータベースは、業界全体で使用されている主要なNoSQLデータベースの1つです。Azure Cosmos自体は、可用性ゾーンなしで単一のリージョンに対して99.99%の最低可用性を提供していますが、Azure Cosmosで利用可能なオプションを使用して、データベースの可用性をさらに向上させるにはどうすればよいでしょうか?

マルチリージョンの読み取りと書き込み

単一リージョンの読み取りは可用性に影響を与え、単一障害点を引き起こす可能性があります。そのため、読み取りが多いアプリケーションは、少なくともマルチリージョンの読み取りを有効にする必要がありますが、アプリケーションにとってマルチリージョンの書き込みは選択肢ではありません。しかし、マルチリージョンの書き込みは、読み取りおよび書き込みが多いアプリケーションの両方でより高い可用性を提供します。

マルチリージョンの書き込み機能を使用すると、すべての構成されたリージョンが書き込みエンドポイントとして機能できるマルチマスターレプリケーションを有効にできます。

ベストプラクティス

  • アプリケーションがデプロイされているリージョンに近いリージョンを選択してください。
  • 可用性を向上させるために、アプリケーションの要件に基づいて複数の優先リージョンを構成してください。
  • 可用性を向上させ、レイテンシを減少させるために、アプリケーション内で読み取りと書き込みのために1つ以上の優先リージョンを設定してください。
  • アプリケーションの現在のリージョンまたは最寄りのリージョンをリストの最初に優先リージョンとして設定してください。

West US 2にデプロイされたアプリケーション

Java

 

//以下のようにWest US 2にデプロイされたアプリケーションを構成します

import com.azure.cosmos.CosmosClientBuilder;
import com.azure.cosmos.CosmosClient;

// ...

CosmosClientBuilder clientBuilder = new CosmosClientBuilder()
    .setEndpoint(accountEndpoint)
    .setKey(accountKey)
    .setPreferredRegions(Arrays.asList("West US 2", "East US"));

CosmosClient client = clientBuilder.buildClient();

// 

East USにデプロイされたアプリケーション

Java

 

//下記のようにEast USに展開されたアプリケーションを設定する
import com.azure.cosmos.CosmosClientBuilder;
import com.azure.cosmos.CosmosClient;

// ...

CosmosClientBuilder clientBuilder = new CosmosClientBuilder()
    .setEndpoint(accountEndpoint)
    .setKey(accountKey)
    .setPreferredRegions(Arrays.asList( "East US","West US 2"));

CosmosClient client = clientBuilder.buildClient();

// 

結論

複数リージョンでの読み書きを有効にすることはより高い可用性を提供できますが、展開されているリージョンにより近い場所でのアプリケーションの読み書きを構成し、複数の優先リージョンを提供することで、手動介入なしにアプリケーションを利用可能なリージョンにすぐにフォールバックさせることができます。

整合性レベル

アプリケーションの要件に基づいて整合性レベルを選択します。高い整合性の要求は通常、可用性の低下につながります。アプリケーションが強いデータ整合性を要求する場合は、潜在的な高いレイテンシに耐えられることを確認してください。逆に、より弱い整合性が許容できる場合、アプリケーションはスループットと可用性の向上を得ることができます。

結論

適切な一貫性レベルを選択することは、アプリケーションの必要性に純粋に依存し、より強い一貫性の選択が可用性に影響を与える可能性があるとしても、より強い一貫性レベルを選択することで、アプリケーション全体の可用性に影響を与えることはありません。

フェイルオーバー

手動フェイルオーバー

開発者や関連者はポータルにログインして、現在接続されているリージョンでの障害が発生した際に次に利用可能なリージョンに手動でフェイルオーバーすることができます。このオプションはある程度の可用性を提供しますが、フェイルオーバーには手動介入が必要であり、全体的なサイトの可用性メトリクスに影響を及ぼす可能性があります。

サービス管理フェイルオーバー

サービス管理のフェイルオーバーを有効にすると、Cosmosはポータルで設定された優先順位に基づいて自動的に次の利用可能なリージョンに切り替えることができます。このオプションにより、フェイルオーバーのプロセス中にアプリケーションの変更が必要なくなります。

結論

どちらも可用性を向上させますが、サービス管理のフェイルオーバーのスループットは、アプリケーションのデプロイメントを心配せずに次の利用可能なリージョンに切り替える柔軟性を提供します。

パーティションキーとインデックス

  • Azure Cosmos DBでアプリケーションを実行する前に、パーティションキーを定義することは重要です。Cosmos DBは読み取り集中的なアプリケーションに非常に効率的であるため、Cosmos DBをアプリケーションに統合する前に、検索基準を考慮し、データベースからレコードを読み取るためのクエリを定義することが重要です。
  • デフォルトでは、Cosmos DBコンテナ内のすべてのアイテムは自動的にインデックスされます。ただし、特定のアイテムやフィールドをインデックスから除外することで、リクエストユニット(RU)の消費を減らすことができます。インデックスの追加が必要なフィールドを設定することと、インデックスを必要としないフィールドのインデックスを削除することは同じくらい重要です。
  • Azure Cosmos DBに過度に大きなアイテムを保存することは避けてください。
  • 可能な限りクロスパーティションクエリを最小限に抑えてください。
  • クエリには効率を改善するためのフィルターを含めるようにしてください。
  • 同じパーティションキーを繰り返しクエリすることは避け、むしろそのようなユースケースにキャッシュ層を実装してください。

スループットのオートスケール

Azure Cosmos DBは、コンテナレベルで標準(手動)およびオートスケールのスループットをサポートしています。

手動スループット

アプリケーションは許可されるRU/sを決定し、RU/sリクエストが最大に達すると設定された時間の間スロットリングされます。スループットを増加させるには手動での介入が必要です。

オートスケールスループット

アプリケーションはサポートする最大スループットを設定でき、Cosmosは受信したトラフィックに基づいて自動的にスケールします。オートスケールスループットを超えた場合、リクエストは設定された時間の間スロットリングされます。

結論

どちらも可用性の向上を提供しますが、オートスケールスループットはスロットリングや可用性に影響を与えずに変動するトラフィックを処理する柔軟性を提供します。

バックアップと復元

Azure Cosmos DBはすべてのアカウントに対してデフォルトで定期的なバックアップを有効にします。

定期バックアップ

バックアップは、最小1時間、最大24時間の間隔で設定された毎分に対して定期的に取得されます。また、バックアップストレージを地理的、ゾーン、またはローカルレベルで冗長に保つオプションも提供されます。アプリケーションチームはバックアップを取得するためにサポートに連絡する必要があります。

継続バックアップ

継続バックアップオプションは、地域のCosmosデータベースにバックアップストレージを保持し、過去7日間または過去30日間のデータの保持を可能にします。また、特定の時点での復元も提供します。

結論

継続バックアップを選択することで、データベースの復元が迅速に行えるようになります。これにより、サポートとの往復のやり取りを必要とせず、アプリケーションはバックアップが存在する任意の地域で特定の時点にデータベースを復元することができます。

結論として、可用性メトリクスはどんなアプリケーションにとっても重要ですが、その実現にはコストがかかります。標準構成よりも高い可用性を提供するオプションは追加費用が発生します。また、上記のオプションはすべてのCosmosを使用するアプリケーションにとって必要であるとは限らず、適しているとも限りません。ただし、Azure Cosmosでの最適な可用性を実現するためには、最善の手法を採用して実装することが重要です。

Source:
https://dzone.com/articles/how-to-maximize-the-azure-cosmos-db-availability