教程:使用 Blob 存储构建高度可用的应用程序

本教程是一个系列中的第一部分。 本教程介绍如何在 Azure 中实现应用程序数据的高可用性。

完成本教程后,将会生成一个控制台应用程序,用于上传 Blob 并从读取访问异地区域冗余 (RA-GZRS) 存储帐户检索它。

Azure 存储中的异地冗余会将事务从主要区域异步复制到数百英里外的次要区域。 此复制过程可确保次要区域中的数据最终一致。 控制台应用程序使用断路器模式确定要连接到的终结点,在模拟故障和恢复时在终结点之间自动切换。

如果没有 Azure 订阅,请在开始前创建一个试用帐户

在该系列的第一部分中,你会学习如何:

  • 创建存储帐户
  • 设置连接字符串
  • 运行控制台应用程序

先决条件

完成本教程:

登录到 Azure 门户

登录 Azure 门户

创建存储帐户

存储帐户提供唯一的命名空间来存储和访问 Azure 存储数据对象。

请按照以下步骤操作,创建读取访问异地区域冗余 (RA-GZRS) 存储帐户:

  1. 在 Azure 门户中选择“创建资源”按钮。

  2. 从“新建”页中选择“存储帐户 - blob、文件、表、队列”。

  3. 使用以下信息填充存储帐户窗体(如下图所示),然后选择“创建”:

    设置 示例值 说明
    订阅 我的订阅 有关订阅的详细信息,请参阅订阅
    ResourceGroup myResourceGroup 如需有效的资源组名称,请参阅 Naming rules and restrictions(命名规则和限制)。
    名称 mystorageaccount 存储帐户的唯一名称。
    位置 中国北部 3 选择一个位置。
    “性能” 标准 对于示例方案,“标准”性能是一个不错的选项。
    帐户类型 StorageV2 建议使用常规用途 v2 存储帐户。 有关 Azure 存储帐户类型的详细信息,请参阅存储帐户概述
    复制 读取访问异地区域冗余存储 (RA-GZRS) 主要区域是区域冗余的,将在启用了对次要区域的读取访问权限的情况下复制到次要区域。
    访问层 热访问层 将热访问层用于经常访问的数据。

    create storage account

下载示例

下载示例项目,提取(解压缩)storage-dotnet-circuit-breaker-pattern-ha-apps-using-ra-grs.zip 文件,然后导航到 v12 文件夹以查找项目文件。

还可以使用 git 将存储库克隆到本地开发环境。 v12 文件夹中的示例项目包含控制台应用程序。

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

配置示例

对 Azure Blob 存储的应用程序请求必须获得授权。 建议的方法是使用 Azure.Identity 客户端库提供的 DefaultAzureCredential 类连接到代码中的 Azure 服务。 .NET v12 代码示例使用此方法。 若要了解详细信息,请参阅 DefaultAzureCredential 概述

你还可以使用帐户访问密钥授权对 Azure Blob 存储的请求。 但是,应谨慎使用此方法,以防公开访问密钥。

运行控制台应用程序

在 Visual Studio 中,按 F5 或选择“启动”,开始调试应用程序。 如果配置了包还原,Visual Studio 会自动还原丢失的 NuGet 包。 请参阅使用包还原安装和重新安装包,了解详细信息。

控制台窗口启动时,应用将获取次要区域的状态,并将该信息写入控制台。 然后,应用将在存储帐户中创建容器,并将 Blob 上传到容器。 上传 Blob 后,应用将持续检查 Blob 是否已复制到次要区域。 此检查会一直持续到复制 Blob 完成,或者达到循环条件定义的最大迭代数。

接下来,应用程序会输入一个循环,并提示下载 Blob,最初从主存储进行读取。 按任意键下载 Blob。 如果从主要区域读取出现可重试错误,则会对次要区域终结点重试读取请求。 当区域切换到次要区域时,控制台输出将显示。

Screenshot of Console output for secondary request.

若要退出循环并清理资源,请在 Blob 下载提示处按 Esc 键。

了解示例代码

该示例创建了一个配置了重试选项和次要区域终结点的 BlobServiceClient 对象。 如果请求在主要区域终结点上失败,则此配置允许应用程序自动切换到次要区域。

string accountName = "<YOURSTORAGEACCOUNTNAME>";
Uri primaryAccountUri = new Uri($"https://{accountName}.blob.core.chinacloudapi.cn/");
Uri secondaryAccountUri = new Uri($"https://{accountName}-secondary.blob.core.chinacloudapi.cn/");

// Provide the client configuration options for connecting to Azure Blob storage
BlobClientOptions blobClientOptions = new BlobClientOptions()
{
    Retry = {
        // The delay between retry attempts for a fixed approach or the delay
        // on which to base calculations for a backoff-based approach
        Delay = TimeSpan.FromSeconds(2),

        // The maximum number of retry attempts before giving up
        MaxRetries = 5,

        // The approach to use for calculating retry delays
        Mode = RetryMode.Exponential,

        // The maximum permissible delay between retry attempts
        MaxDelay = TimeSpan.FromSeconds(10)
    },

    // Secondary region endpoint
    GeoRedundantSecondaryUri = secondaryAccountUri
};

// Create a BlobServiceClient object using the configuration options above
BlobServiceClient blobServiceClient = new BlobServiceClient(primaryAccountUri, new DefaultAzureCredential(), blobClientOptions);

BlobClientOptions 中设置 GeoRedundantSecondaryUri 属性时,GET 或 HEAD 请求的重试将切换为使用辅助终结点。 后续重试将在主终结点和辅助终结点之间交替。 但是,如果辅助 URI 的响应状态为 404,则请求的后续重试将不再使用辅助 URI,因为此错误代码表示资源尚未复制到次要区域。

后续步骤

本系列教程的第一部分介绍了如何使用 RA-GZRS 存储帐户实现应用程序的高可用性。

请继续学习本系列教程的第二部分,了解如何模拟故障和强制应用程序使用辅助 RA-GZRS 终结点。

资源

有关使用已弃用 SDK 的相关代码示例,请参阅以下资源: