教程:模拟从主要区域读取数据的失败

本教程是一个系列中的第二部分。 在其中,你将通过模拟故障来了解 读取访问异地区域冗余存储 (RA-GZRS)的优点。

为了模拟故障,可以使用 静态路由Fiddler。 这两种方法都允许模拟对 RA-GZRS 存储帐户主终结点的请求失败,导致应用程序改为从辅助终结点读取。

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

本系列教程的第二部分将介绍如何:

先决条件

在开始本教程之前,请完成上一教程: 使应用程序数据在 Azure 存储中高度可用

要使用静态路由模拟故障,需要使用提升的命令提示符。

若要使用 Fiddler 模拟故障,请下载并 安装 Fiddler

模拟因无效静态路由导致的失败

可以为 RA-GZRS 存储帐户的主终结点的所有请求创建无效的静态路由。 在本教程中,本地主机用作网关,用于将请求路由到存储帐户。 使用本地主机作为网关会导致对存储帐户主终结点的所有请求在主机内部循环返回,这会导致请求失败。 按照以下步骤模拟故障,并使用无效的静态路由还原主终结点。

启动和暂停应用程序

使用前一篇教程中的说明启动示例并下载测试文件(确认该文件来自主存储)。 然后,可以根据目标平台手动暂停示例或等待提示。

模拟失败

暂停应用程序时,以管理员身份在 Windows 上打开命令提示符,或在 Linux 上以根身份运行终端。

通过在命令提示符或终端上输入以下命令(将 STORAGEACCOUNTNAME 替换为您的存储帐户名称)来获取有关存储帐户主终结点域的信息。

nslookup STORAGEACCOUNTNAME.blob.core.chinacloudapi.cn

将存储帐户的IP地址复制到文本编辑器以备后用。

若要获取本地主机的 IP 地址,请在 Windows 命令提示符或 ifconfig Linux 终端上键入ipconfig

若要为目标主机添加静态路由,请在 Windows 命令提示符或 Linux 终端上键入以下命令,替换为 <destination_ip> 存储帐户 IP 地址和 <gateway_ip> 本地主机 IP 地址。

Linux

sudo route add <destination_ip> gw <gateway_ip>

Windows操作系统

route add <destination_ip> <gateway_ip>

在运行示例的窗口中,恢复应用程序或按相应的键下载示例文件,并确认它来自辅助存储。 然后可以再次暂停示例或等待出现提示。

模拟主终结点还原

若要再次模拟主终结点的功能,请从路由表中删除无效的静态路由。 这允许通过默认网关路由对主终结点的所有请求。 在 Windows 命令提示符或 Linux 终端上键入以下命令。

Linux

sudo route del <destination_ip> gw <gateway_ip>

Windows操作系统

route delete <destination_ip>

然后可以恢复应用程序,或者按下相应的键再次下载示例文件,这一次请确认该文件来自主存储。

使用 Fiddler 模拟故障

若要使用 Fiddler 来模拟失败,请针对向 RA-GZRS 存储帐户的主终结点发出的请求注入一个失败的响应。

以下部分介绍了如何使用 fiddler 来模拟故障以及恢复主终节点。

启动 Fiddler

打开 Fiddler,选择“ 规则 ”和“ 自定义规则”。

自定义 Fiddler 规则

此时,Fiddler ScriptEditor 会启动,并显示 SampleRules.js 文件。 此文件用于自定义 Fiddler。

OnBeforeResponse 函数中粘贴以下代码示例(请将 STORAGEACCOUNTNAME 替换为存储帐户的名称)。 根据示例,您可能需要将 HelloWorld 替换为要下载的测试文件的名称,或者在条件不适用时删除该部分条件。 将新代码注释掉以确保它不会马上运行。

完成后,选择“文件和保存”以保存更改。 将 ScriptEditor 窗口保持打开状态,以便在以下步骤中使用。

    /*
        // Simulate data center failure
        // After it is successfully downloading the blob, pause the code in the sample,
        // uncomment these lines of script, and save the script.
        // It will intercept the (probably successful) responses and send back a 503 error.
        // When you're ready to stop sending back errors, comment these lines of script out again
        //     and save the changes.

        if ((oSession.hostname == "STORAGEACCOUNTNAME.blob.core.chinacloudapi.cn")
            // depending on the sample, you may need to modify or remove the line below
            && (oSession.PathAndQuery.Contains("HelloWorld"))) {
            oSession.responseCode = 503;
        }
    */

粘贴自定义规则

启动和暂停应用程序

使用前一篇教程中的说明启动示例并下载测试文件(确认该文件来自主存储)。 然后,可以根据目标平台手动暂停示例或等待提示。

模拟失败

当应用程序处于暂停状态时,切换回到 Fiddler,并取消注释在 OnBeforeResponse 函数中保存的自定义规则。 请务必选择“文件和保存”以保存所做的更改,以便规则生效。 此代码查找对 RA-GZRS 存储帐户的请求,如果路径包含示例文件的名称,则返回响应代码。503 - Service Unavailable

在运行示例的窗口中,恢复应用程序或按相应的键下载示例文件,并确认它来自辅助存储。 然后可以再次暂停示例或等待出现提示。

模拟主终结点还原

在 Fiddler 中,再次删除或注释掉自定义规则。 选择“文件”、“保存”,确保该规则不再生效。

在运行示例的窗口中恢复应用程序,或者按下相应的键下载示例文件,并再次确认该文件来自主存储。 然后可以退出示例。

后续步骤

本系列的第二部分中,你学习了如何通过模拟故障来测试读取访问异地冗余存储。

若要详细了解 RA-GZRS 存储的工作原理及其相关的风险,请参阅 使用 RA-GZRS 设计 HA 应用