2014-03-07 126 views
8

为了降低成本,我一直在使用Autoscale在2到1个云服务实例之间切换。除了时常(不知道模式似乎在这里),大多数情况下工作起来,放大(1-> 2)的行为导致实例回收,导致用户产生服务中断。Azure Autoscale重新启动运行实例

假设RoleEntry中没有什么特别的事情可以响应拓扑变化,为什么要从1-> 2进行缩放会重新启动已经运行的实例?

其他注意事项:

  • 很显然,这两种情况都通过管理门户看实例 标签回收。停电也可以通过点击 公共站点来确认。
  • 它不会一直发生,但我不知道该模式是什么。这感觉就像一个实例配置已经运行多天,试图扩大回收。但是,如果1实例配置只运行了几个小时,则可以在不中断的情况下进行扩展和缩减。
  • 第一个实例总是比第二个实例快得多。
+0

你是如何确定两个实例都回收的? – kwill

+0

@kwill报告管理门户中的实例选项卡...我可以通过点击该网站进行确认,发现该网站没有响应。 – Nariman

回答

1

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

+0

是的,这应该是答案。微软甚至警告说,在发布你的服务之前,在许多虚拟机上没有1个角色。实际上,您可以设置一个属性来防止仅部署到一个实例。 –

+0

这个官方文档的任何链接?我认为有超过1个实例的建议始终是由于确保您有不同的故障域中的实例,以便MS重新启动Windows更新实例或执行维护时?他们在哪里说从1个实例扩展到2个实例导致停机? – OffHeGoes

0

您应该能够控制此行为。在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 
} 
+0

我相信,如果您有1台服务器,无论处理Changed事件,它仍然会重新启动并从LB中抽出。这是基于来自AzureWatch客户的众多评论 – Igorek

+0

谢谢伊戈尔,我会尽力在本周末花些时间来验证。 :) – BrentDaCodeMonkey

+0

我会尝试把一些细节放在一起,当我有机会,但基本上伊戈尔是正确的。会发生什么情况是,当第二个实例达到就绪状态时,第一个实例将从LB旋转中移出以处理拓扑更改。在这段时间内,如果实例2的w3wp预热时间很长,则客户端将超时或有很长时间的运行请求。 – kwill

0

Nariman,请参阅我对布伦特职位的评论,了解有关发生的事情的一些信息。你应该可以用下面的代码解决这个问题:

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(); 
    } 
} 
+0

这会向自己发出请求以启动w3wp,因此不需要最终用户请求?我更希望OnStart不会在这个已经运行的实例上被调用。 – Nariman

+0

此代码仅在实例2上运行 - 实例1已在运行且不会回收。此代码在实例2上运行时,将延迟实例2达到就绪状态,直到w3wp准备就绪。这意味着当实例1暂时从负载平衡器旋转中移除时,实例2已准备好接收流量。 – kwill

+0

在实例2启动并处于就绪状态之前,我看到实例1从LB中移除(拓扑更改事件触发)。我认为即使在创建第二台虚拟机之前,拓扑更改事件也会发生 – Nariman

相关问题