教程:模拟在访问读取访问冗余存储时出现的故障

本教程是一个系列中的第二部分。 本教程通过模拟一个故障,介绍读取访问异地冗余 (RA-GRS) 的优点。

可以使用 Fiddler静态路由来模拟一个故障。 可以使用任一方法来模拟这样一个故障:向读取访问异地冗余 (RA-GRS) 存储帐户的主终结点发送请求失败,导致应用程序改从辅助终结点读取内容。

如果没有 Azure 订阅,可在开始前创建一个 1 元人民币试用帐户

此系列的第二部分介绍如何:

先决条件

开始学习本教程之前,请完成前一教程:使用 Azure 存储实现应用程序数据的高可用性

若要使用 Fiddler 模拟失败,请执行以下操作:

使用 Fiddler 模拟失败

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

以下部分介绍如何使用 fiddler 模拟失败和主终结点还原。

启动 Fiddler

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

自定义 Fiddler 规则

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

将以下代码示例粘贴到 OnBeforeResponse 函数中。 注释掉新代码是为了确保其创建的逻辑不会立即实现。

完成后,依次选择“文件”和“保存”,保存所做的更改。

    /*
        // 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 == "contosoragrs.blob.core.chinacloudapi.cn") 
            && (oSession.PathAndQuery.Contains("HelloWorld"))) {
            oSession.responseCode = 503;  
        }
    */

粘贴自定义的规则

中断应用程序

在 IDE 或 shell 中运行应用程序。

应用程序开始从主终结点读取数据以后,按控制台窗口中的任意键即可暂停应用程序。

方案应用

模拟故障

当应用程序暂停后,取消注释在 Fiddler 中保存的自定义规则。

此代码示例查找对 RA-GRS 存储帐户发出的请求,如果路径包含文件 HelloWorld 的名称,则返回响应代码 503 - Service Unavailable

导航到 Fiddler,然后选择“规则” -> “自定义规则...”。

取消注释以下行,将 STORAGEACCOUNTNAME 替换为存储帐户名称。 选择“文件” -> “保存”,保存所做的更改。

Note

如果是在 Linux 上运行示例应用程序,则需在编辑 CustomRule.js 文件时重启 Fiddler,以便 Fiddler 安装自定义逻辑。

         if ((oSession.hostname == "STORAGEACCOUNTNAME.blob.core.chinacloudapi.cn")
         && (oSession.PathAndQuery.Contains("HelloWorld"))) {
         oSession.responseCode = 503;
         }

若要恢复应用程序,请按任意键。

应用程序重新开始运行以后,对主终结点的请求就会失败。 应用程序尝试重新连接到主终结点 5 次。 达到故障阈值(五次尝试)以后,就会从处于只读状态的辅助终结点请求图像。 从辅助终结点成功检索映像 20 次后,应用程序便会尝试连接到主终结点。 如果仍无法访问主终结点,应用程序会继续从辅助终结点读取数据。

粘贴自定义的规则

模拟主终结点还原

由于在前面的步骤中已设置 Fiddler 自定义规则,因此对主终结点的请求失败。

若要模拟主终结点再次运行的情况,请删除用于注入 503 错误的逻辑。

若要暂停应用程序,请按任意键。

导航到 Fiddler,然后选择“规则”和“自定义规则...”。

注释或删除 OnBeforeResponse 函数中的自定义逻辑,保留默认函数。

选择“文件”和“保存”,保存所做的更改。

删除自定义的规则

完成后,按任意键即可恢复应用程序。 应用程序继续从主终结点读取数据,直到达到 999 次读取的限制。

恢复应用程序

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

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

启动和暂停应用程序

在 IDE 或 shell 中运行应用程序。 应用程序开始从主终结点读取数据以后,按控制台窗口中的任意键即可暂停应用程序。

模拟故障

在应用程序暂停后,在 Windows 上以管理员身份启动命令提示符,或者在 Linux 上以根用户身份运行终端。

获取有关存储帐户主终结点域的信息,方法是在命令提示符处或终端上输入以下命令。

nslookup STORAGEACCOUNTNAME.blob.core.chinacloudapi.cn

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

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

若要添加目标主机的静态路由,请在 Windows 命令提示符处或 Linux 终端上键入以下命令。

Linux

route add <destination_ip> gw <gateway_ip>

Windows

route add <destination_ip> <gateway_ip>

<destination_ip> 替换为存储帐户 IP 地址,将 <gateway_ip> 替换为本地主机 IP 地址。

若要恢复应用程序,请按任意键。

应用程序重新开始运行以后,对主终结点的请求就会失败。 应用程序尝试重新连接到主终结点 5 次。 达到故障阈值(五次尝试)以后,就会从处于只读状态的辅助终结点请求图像。 成功地从辅助终结点检索图像 20 次以后,应用程序就会尝试连接到主终结点。 如果仍无法访问主终结点,应用程序会继续从辅助终结点读取数据。

模拟主终结点还原

若要再次模拟主终结点功能,请从路由表中删除主终结点的静态路由。 这样就可以让发送到主终结点的所有请求通过默认网关来路由。

若要删除目标主机(存储帐户)的静态路由,请在 Windows 命令提示符处或 Linux 终端上键入以下命令。

Linux

route del <destination_ip> gw <gateway_ip>

Windows

route delete <destination_ip>

若要恢复应用程序,请按任意键。 应用程序继续从主终结点读取数据,直到达到 999 次读取的限制。

恢复应用程序

后续步骤

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

若要详细了解 RA-GRS 存储的工作原理以及相关风险,请阅读以下文章: