教程:模拟从主要区域读取数据时出现的故障

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

若要模拟故障,可以使用静态路由Fiddler。 使用这两种方法都可以模拟这样一个故障:对 RA-GZRS 存储帐户的主终结点发送请求,导致应用程序改为从辅助终结点读取数据。

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

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

先决条件

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

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

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

使用无效的静态路由模拟失败

对于向 RA-GZRS 存储帐户的主终结点发出的所有请求,可以创建一个无效的静态路由。 本教程使用本地主机作为网关来路由向存储帐户发出的请求。 使用本地主机作为网关会导致向存储帐户主终结点发出的所有请求都以循环方式返回到主机内,这会导致请求失败。 执行以下步骤,使用无效的静态路由模拟失败和主终结点还原。

启动和暂停应用程序

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

模拟故障

当应用程序处于暂停状态时,在 Windows 上以管理员身份打开命令提示符,或者在 Linux 上以 root 身份运行终端。

获取有关存储帐户主终结点域的信息,方法是在命令提示符下或终端中输入以下命令(请将 STORAGEACCOUNTNAME 替换为存储帐户的名称)。

nslookup STORAGEACCOUNTNAME.blob.core.chinacloudapi.cn

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

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

若要添加目标主机的静态路由,请在 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,选择“规则”和“自定义规则”。

Customize Fiddler rules

此时,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;
        }
    */

Paste customized rule

启动和暂停应用程序

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

模拟故障

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

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

模拟主终结点还原

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

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

后续步骤

本系列教程的第二部分介绍了如何模拟故障来测试读取访问异地冗余存储。

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