【问题标题】:Azure Autoscale Restarts Running InstancesAzure Autoscale 重新启动正在运行的实例
【发布时间】:2014-04-10 18:14:58
【问题描述】:

我一直在使用 Autoscale 在 2 和 1 个云服务实例之间切换,以降低成本。这主要是有效的,除了有时(不确定这里的模式似乎是什么),扩展 (1->2) 的行为会导致 both 实例进行回收,从而产生服务中断用户。

假设 RoleEntry 中没有发生任何奇特的事情来响应拓扑变化,为什么从 1->2 缩放会重新启动已经运行的实例?

补充说明:

  • 通过查看 Instances,很明显两个实例都在回收 管理门户中的选项卡。中断也可以通过点击确认 公共网站。
  • 这种情况并非始终如一,但我不确定模式是什么。感觉就像当 1-instance 配置已经运行了多天时,尝试扩大回收两者。但是,如果 1 实例配置仅运行了几个小时,您可以在不中断的情况下进行扩展和缩减。
  • 第一个实例的返回速度总是比引入的第二个实例快得多。

【问题讨论】:

  • 你如何确定两个实例都在回收?
  • @kwill 在管理门户中的实例选项卡上报告...我可以通过点击该站点并看到它没有响应来确认。

标签: azure azure-role-environment


【解决方案1】:

一直都是这样。当您运行 1 个服务器并转到 2+ 时,初始服务器将重新启动。为了获得完整的 SLA,您需要始终拥有 2 台以上的服务器。

【讨论】:

  • 是的,这应该是答案。 Microsoft 甚至在发布您的服务之前警告说,在许多 VM 上没有 1 个角色。事实上,您可以设置一个属性来阻止仅部署到一个实例。
  • 任何官方文档的链接?我认为拥有超过 1 个实例的建议始终是因为确保您在不同的故障域中有实例,以便在 MS 重新启动实例以进行 Windows 更新或执行维护时?他们在哪里说从 1 个实例扩展到 2 个实例会导致停机?
【解决方案2】:

Nariman,请参阅我对 Brent 帖子的评论,了解有关正在发生的事情的一些信息。您应该可以使用以下代码解决此问题:

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        // For information on handling configuration changes
        // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
        IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());
        string ip = null;
        foreach (IPAddress ipaddress in ipEntry.AddressList)
        {
            if (ipaddress.AddressFamily.ToString() == "InterNetwork")
            {
                ip = ipaddress.ToString();
            }
        }

        string urlToPing = "http://" + ip;
        HttpWebRequest req = HttpWebRequest.Create(urlToPing) as HttpWebRequest;
        WebResponse resp = req.GetResponse();
        return base.OnStart();
    }
}

【讨论】:

  • 这会向自身发出请求以启动 w3wp,因此不需要最终用户请求?我更希望不要在这个已经运行的实例上调用 OnStart。
  • 此代码只会在实例 2 上运行 - 实例 1 已经在运行并且不会回收。此代码在实例 2 上运行时,将延迟实例 2 达到就绪状态,直到 w3wp 就绪。这意味着当实例 1 暂时从负载均衡器轮换中移除时,实例 2 就可以接收流量了。
  • 我看到实例 1 在实例 2 启动并处于就绪状态之前很久就从 LB 中移除(拓扑更改事件触发)。我认为拓扑更改事件甚至在创建第二个虚拟机之前就发生了
【解决方案3】:

您应该能够控制这种行为。在roleEntrypoint 中,有一个您可以捕获的事件RoleEnvironmentChanging

将一些代码放入您的解决方案的外壳看起来像......

RoleEnvironment.Changing += RoleEnvironmentChanging;

private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
}

RoleEnvironment.Changed += RoleEnvironmentChanged;

private void RoleEnvironmentChanged(object sender, RoleEnvironmentChangedEventArgs e)
{
}

然后,在 RoleEnvironmentChanged 方法中,我们可以检测到更改是什么,并告诉 Azure 我们是否要重新启动。

if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)))
{
    e.Cancel = true; // don't recycle the role
}

【讨论】:

  • 我相信,如果您有 1 台服务器,它仍然会重新启动并从 LB 中拉出,无论是否处理 Changed 事件。这是基于 AzureWatch 客户的众多 cmets
  • 谢谢伊戈尔,我会在这个周末抽出一些时间来验证一下。 :)
  • 如果有机会,我会尝试整理一些细节,但基本上 Igor 是正确的。发生的情况是,当第二个实例达到就绪状态时,第一个实例将退出 LB 轮换,以处理拓扑更改。在此期间,如果实例 2 具有较长的 w3wp 预热时间,则客户端将超时或运行请求非常长。
  • 这很有意义,并且反映了我在 IaaS 方面看到的可用性集问题。但我仍然想知道的是 Igor 在单个实例上看到的重启。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多