チュートリアル:Blob Storage を使用して高可用性アプリケーションを作成するTutorial: Build a highly available application with Blob storage

このチュートリアルは、シリーズの第 1 部です。This tutorial is part one of a series. ここでは、Azure でアプリケーション データを高可用にする方法について学習します。In it, you learn how to make your application data highly available in Azure.

このチュートリアルを完了すると、BLOB を読み取りアクセス geo 冗長ストレージ (RA-GRS) ストレージ アカウントにアップロードし、取得するコンソール アプリケーションが作成されます。When you've completed this tutorial, you will have a console application that uploads and retrieves a blob from a read-access geo-redundant (RA-GRS) storage account.

RA-GRS は、プライマリ リージョンからセカンダリ リージョンにトランザクションをレプリケートすることによって機能します。RA-GRS works by replicating transactions from a primary region to a secondary region. このレプリケーション プロセスにより、セカンダリ リージョンのデータの結果整合性が保証されます。This replication process guarantees that the data in the secondary region is eventually consistent. アプリケーションでは、サーキット ブレーカー パターンを使用して、接続先のエンドポイントを判断し、障害と復旧がシミュレートされたときに自動的にエンドポイント間を切り替えます。The application uses the Circuit Breaker pattern to determine which endpoint to connect to, automatically switching between endpoints as failures and recoveries are simulated.

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。If you don't have an Azure subscription, create a free account before you begin.

シリーズの第 1 部で学習する内容は次のとおりです。In part one of the series, you learn how to:

  • ストレージ アカウントの作成Create a storage account
  • 接続文字列の設定Set the connection string
  • コンソール アプリケーションを実行するRun the console application

前提条件Prerequisites

このチュートリアルを完了するには、以下が必要です。To complete this tutorial:

Azure portal にサインインしますSign in to the Azure portal

Azure Portal にサインインします。Sign in to the Azure portal.

ストレージ アカウントの作成Create a storage account

ストレージ アカウントは、Azure Storage データ オブジェクトを格納してアクセスするための一意の名前空間を提供します。A storage account provides a unique namespace to store and access your Azure Storage data objects.

次の手順で、読み取りアクセス geo 冗長ストレージ アカウントを作成します。Follow these steps to create a read-access geo-redundant storage account:

  1. Azure Portal の左上隅にある [リソースの作成] ボタンを選択します。Select the Create a resource button found on the upper left-hand corner of the Azure portal.

  2. [新規] ページから [ストレージ] を選択します。Select Storage from the New page.

  3. [おすすめ] の下にある [ストレージ アカウント - Blob、File、Table、Queue] を選択します。Select Storage account - blob, file, table, queue under Featured.

  4. 下図のように、ストレージ アカウント フォームに次の情報を入力し、[作成] を選択します。Fill out the storage account form with the following information, as shown in the following image and select Create:

    SettingSetting       推奨値Suggested value DescriptionDescription
    NameName mystorageaccountmystorageaccount ストレージ アカウント用の一意の値A unique value for your storage account
    デプロイ モデルDeployment model リソース マネージャーResource Manager Resource Manager には最新の機能が含まれています。Resource Manager contains the latest features.
    アカウントの種類Account kind StorageV2StorageV2 アカウントの種類の詳細については、「ストレージ アカウントの種類」を参照してくださいFor details on the types of accounts, see types of storage accounts
    パフォーマンスPerformance StandardStandard このサンプル シナリオでは、標準で十分です。Standard is sufficient for the example scenario.
    レプリケーションReplication 読み取りアクセス geo 冗長ストレージ (RA-GRS)Read-access geo-redundant storage (RA-GRS) サンプルが動作するには、この設定が必要です。This is necessary for the sample to work.
    サブスクリプションSubscription 該当するサブスクリプションyour subscription サブスクリプションの詳細については、サブスクリプションに関するページを参照してください。For details about your subscriptions, see Subscriptions.
    ResourceGroupResourceGroup myResourceGroupmyResourceGroup 有効なリソース グループ名については、名前付け規則と制限に関するページを参照してください。For valid resource group names, see Naming rules and restrictions.
    場所Location 米国東部East US 場所を選択します。Choose a location.

ストレージ アカウントの作成

サンプルのダウンロードDownload the sample

サンプル プロジェクトをダウンロードし、storage-dotnet-circuit-breaker-pattern-ha-apps-using-ra-grs.zip ファイルを抽出 (解凍) します。Download the sample project and extract (unzip) the storage-dotnet-circuit-breaker-pattern-ha-apps-using-ra-grs.zip file. git を使って、アプリケーションのコピーを開発環境にダウンロードすることもできます。You can also use git to download a copy of the application to your development environment. サンプル プロジェクトにはコンソール アプリケーションが含まれています。The sample project contains a console application.

git clone https://github.com/Azure-Samples/storage-dotnet-circuit-breaker-pattern-ha-apps-using-ra-grs.git

サンプルの構成Configure the sample

アプリケーションでは、ストレージ アカウントの接続文字列を指定する必要があります。In the application, you must provide the connection string for your storage account. アプリケーションが実行されているローカル コンピューターの環境変数内に、この接続文字列を格納することができます。You can store this connection string within an environment variable on the local machine running the application. 環境変数を作成するオペレーティング システムに応じて、以下の例のいずれかに従います。Follow one of the examples below depending on your Operating System to create the environment variable.

Azure Portal のストレージ アカウントに移動します。In the Azure portal, navigate to your storage account. ストレージ アカウントの [設定] の下にある [アクセス キー] を選択します。Select Access keys under Settings in your storage account. プライマリ キーまたはセカンダリ キーの接続文字列をコピーします。Copy the connection string from the primary or secondary key. オペレーティング システムに基づいて次のコマンドのいずれかを実行します。<yourconnectionstring> は実際の接続文字列に置き換えてください。Run one of the following commands based on your operating system, replacing <yourconnectionstring> with your actual connection string. このコマンドで、環境変数をローカル コンピューターに保存します。This command saves an environment variable to the local machine. Windows では、環境変数は、使用しているコマンド プロンプトまたはシェルを再度読み込むまで使用できません。In Windows, the environment variable is not available until you reload the Command Prompt or shell you are using.

LinuxLinux

export storageconnectionstring=<yourconnectionstring>

WindowsWindows

setx storageconnectionstring "<yourconnectionstring>"

コンソール アプリケーションを実行するRun the console application

Visual Studio で F5 キーを押すか [スタート] を選択してアプリケーションのデバッグを開始します。In Visual Studio, press F5 or select Start to begin debugging the application. 構成に応じて、不足している NuGet パッケージが Visual Studio で自動的に復元されます。詳細については、パッケージの復元によるパッケージのインストールと再インストールに関するセクションを参照してください。Visual studio automatically restores missing NuGet packages if configured, visit Installing and reinstalling packages with package restore to learn more.

コンソール ウィンドウが起動し、アプリケーションの実行が開始されます。A console window launches and the application begins running. アプリケーションは、ソリューションの HelloWorld.png イメージをストレージ アカウントにアップロードします。The application uploads the HelloWorld.png image from the solution to the storage account. アプリケーションは、イメージがセカンダリ RA-GRS エンドポイントにレプリケートされたことを確認します。The application checks to ensure the image has replicated to the secondary RA-GRS endpoint. 次に、イメージのダウンロードを開始し、最大 999 回試行します。It then begins downloading the image up to 999 times. 各読み取りは P または S で表されます。この P はプライマリ エンドポイント、S はセカンダリ エンドポイントを示します。Each read is represented by a P or an S. Where P represents the primary endpoint and S represents the secondary endpoint.

コンソール アプリの実行

このサンプル コードで、Program.cs ファイルの RunCircuitBreakerAsync タスクは、DownloadToFileAsync メソッドを使用してストレージ アカウントからイメージをダウンロードするために使用されます。In the sample code, the RunCircuitBreakerAsync task in the Program.cs file is used to download an image from the storage account using the DownloadToFileAsync method. そのダウンロードの前に、OperationContext が定義されています。Prior to the download, an OperationContext is defined. 操作コンテキストにイベント ハンドラーが定義され、ダウンロードが正常に完了したとき、またはダウンロードが失敗して再試行する場合に呼び出されます。The operation context defines event handlers, that fire when a download completes successfully or if a download fails and is retrying.

サンプル コードを理解するUnderstand the sample code

イベント ハンドラーを再試行するRetry event handler

OperationContextRetrying イベント ハンドラーは、イメージのダウンロードが失敗し、再試行するように設定されたときに呼び出されます。The OperationContextRetrying event handler is called when the download of the image fails and is set to retry. アプリケーションに定義されている最大試行回数に達すると、要求の LocationModeSecondaryOnly に変わります。If the maximum number of retries defined in the application are reached, the LocationMode of the request is changed to SecondaryOnly. この設定で、アプリケーションはセカンダリ エンドポイントからイメージをダウンロードを試行するように強制されます。This setting forces the application to attempt to download the image from the secondary endpoint. この構成では、プライマリ エンドポイントは永続的に再試行されないので、イメージの要求にかかる時間が短縮されます。This configuration reduces the time taken to request the image as the primary endpoint is not retried indefinitely.

private static void OperationContextRetrying(object sender, RequestEventArgs e)
{
    retryCount++;
    Console.WriteLine("Retrying event because of failure reading the primary. RetryCount = " + retryCount);

    // Check if we have had more than n retries in which case switch to secondary.
    if (retryCount >= retryThreshold)
    {

        // Check to see if we can fail over to secondary.
        if (blobClient.DefaultRequestOptions.LocationMode != LocationMode.SecondaryOnly)
        {
            blobClient.DefaultRequestOptions.LocationMode = LocationMode.SecondaryOnly;
            retryCount = 0;
        }
        else
        {
            throw new ApplicationException("Both primary and secondary are unreachable. Check your application's network connection. ");
        }
    }
}

要求が完了したイベント ハンドラーRequest completed event handler

OperationContextRequestCompleted イベント ハンドラーは、イメージのダウンロードが成功したときに呼び出されます。The OperationContextRequestCompleted event handler is called when the download of the image is successful. アプリケーションがセカンダリ エンドポイントを使用している場合、アプリケーションはセカンダリ エンドポイントを最大 20 回継続して使用します。If the application is using the secondary endpoint, the application continues to use this endpoint up to 20 times. 20 回の後、アプリケーションは LocationModePrimaryThenSecondary に戻し、プライマリ エンドポイントを再試行します。After 20 times, the application sets the LocationMode back to PrimaryThenSecondary and retries the primary endpoint. 要求が成功した場合、アプリケーションはプライマリ エンドポイントからの読み取りを継続します。If a request is successful, the application continues to read from the primary endpoint.

private static void OperationContextRequestCompleted(object sender, RequestEventArgs e)
{
    if (blobClient.DefaultRequestOptions.LocationMode == LocationMode.SecondaryOnly)
    {
        // You're reading the secondary. Let it read the secondary [secondaryThreshold] times,
        //    then switch back to the primary and see if it's available now.
        secondaryReadCount++;
        if (secondaryReadCount >= secondaryThreshold)
        {
            blobClient.DefaultRequestOptions.LocationMode = LocationMode.PrimaryThenSecondary;
            secondaryReadCount = 0;
        }
    }
}

次の手順Next steps

シリーズの第 1 部では、RA-GRS ストレージ アカウントでアプリケーションを高可用にする方法について学習しました。In part one of the series, you learned about making an application highly available with RA-GRS storage accounts.

シリーズの第 2 部に進んで、エラーをシミュレートし、アプリケーションがセカンダリ RA-GRS エンドポイントを使用するように強制する方法について学んでください。Advance to part two of the series to learn how to simulate a failure and force your application to use the secondary RA-GRS endpoint.