【问题标题】:How do I scale my Azure application without having a temporary outage?如何在不发生临时中断的情况下扩展我的 Azure 应用程序?
【发布时间】:2012-04-17 23:28:09
【问题描述】:

我正在使用 Windows Azure 管理 API 来扩展我的 Azure Web 角色。在某个时候,我有一个实例,并决定要从一个实例转到两个实例。我发送一个 HTTP POST 请求到

https://management.core.windows.net:443/<my-subscription-id>/services/hostedservices/<my-service-name>/deployments/<my-deployment-name>/?comp=config

使用 XML 指定与当前部署相同的配置,并将实例计数设置为两个。调用成功,更改开始。现在大约 30 秒,Web 角色将不接受 HTTP 调用 - 调用者将获得

10061 connection refused

在浏览器中。这意味着该角色不服务于客户端请求。这是个问题。

如何扩展 Web 角色以使其始终服务于客户端请求?

【问题讨论】:

  • 如果你从 2 到 3,它会阻止调用吗?我只是想知道这是否是因为你只有 1 个实例在运行。我通常从 2 到 4 进行扩展和缩减,并且在这些期间从未经历过任何停机时间。
  • 对我来说,如果我从 3 降到 1,剩余的实例会重新启动......我认为这是因为我降到 1 并且 SLA 需要 > 1 个实例
  • @Ilyas:不,这不是因为 SLA,这可能是因为您以 Azure 决定重新启动实例的方式处理 RoleEnvironment 事件。你问了一个关于 stackoverflow.com/q/16907000/57428 的单独问题

标签: windows api azure azure-web-roles


【解决方案1】:

根据SLA(服务水平协议 - 计算):

我们保证在您部署两个或更多角色实例时 您面向 Internet 的角色将使用不同的故障和升级域 至少 99.95% 的时间都有外部连接。

这意味着 SLA 不支持拥有一个实例,因此您可能(或将要)停机。如果从 2 或更多扩展,或从更多扩展至 2,则不会出现任何中断。

This blog post 对故障和升级域进行了很好的解释。毕竟,扩展意味着“升级”——您正在更改配置,这种配置更改需要通过所有角色和实例传播。在不停机的情况下(目前)唯一的方法是拥有至少两个实例,每个实例都位于不同的域中。

【讨论】:

    【解决方案2】:

    请注意,当您拥有 2 个或更多实例时,您在修改服务配置(例如使用服务管理 API 更改实例数量)时仍可能会遇到中断。任何配置更改都会触发您的实例重启。

    为防止这种情况,您需要在 WebRole.cs/WorkerRole.cs 中实现以下代码(因此,当您更改实例数量时不会出现中断):

    public override bool OnStart()
    {
        RoleEnvironment.Changing += RoleEnvironmentChanging;
        return base.OnStart();
    }
    
    private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
    {
        if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))
        {
            e.Cancel = false;
        }
    }
    

    编辑:请参阅下面的 astaykov 评论。

    【讨论】:

    • 这种变化究竟会起到什么作用?
    • e.Cancel = false 将阻止角色回收。但是,如果您的应用程序中有一些依赖于 azure 配置中的设置的逻辑,则您已明确处理此配置更改。您还必须挂钩 RoleEnvironmentChanged,因此如果您阻止回收,则必须触发重新读取配置设置。
    • @Sandrino,我倾向于不同意你的说法。这是至少有两个实例的想法,它们在不同的升级/故障域中运行。该过程应首先更新您的一个实例,然后在完全恢复后更新另一个。您可以查看我在回答中提供的链接,或者查找有关故障和升级域的更多详细信息。
    • @astaykov,你说得对,我没有考虑升级域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多