Azure Compute Service工作人员在扩展后变得“忙碌”

时间:2014-08-12 18:34:35

标签: azure azure-worker-roles azure-cloud-services azure-configuration

我在Azure中运行了一个带有4个工作器实例的服务。当我扩展到5个工作器实例时,已启动的第一个实例进入“忙”状态。这是为什么?放大期间会发生什么? azure会重新运行所有启动任务吗?我很困惑,似乎无法找到任何关于此的文档。

在扩展到5个实例后,第一个实例将其状态更改为:

Busy (Waiting for role to start... Application startup tasks are running. [2014-08-12T18:36:52Z])

那里运行的java进程停止了。为什么会发生这种情况?!

任何帮助都将不胜感激。

STARTUP.CMD

REM   Log the startup date and time.
ECHO Startup.cmd: >> "%TEMP%\StartupLog.txt" 2>&1
ECHO Current date and time: >> "%TEMP%\StartupLog.txt" 2>&1
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1

REM enable ICMP
netsh advfirewall firewall add rule name="ICMPv6 echo" dir=in action=allow enable=yes protocol=icmpv6:128,any

ECHO Starting WebService >> "%TEMP%\StartupLog.txt" 2>&1
tasklist /FI "IMAGENAME eq java.exe" 2>NUL | find /I /N "java.exe" >NUL 2>&1
if "%ERRORLEVEL%"=="0" GOTO running

SET %ERRORLEVEL% = 0
START /B java -jar WEB-SERVICE-1_0--SNAPSHOT.jar app.properties >> "%TEMP%\StartupLog.txt" 2>&1

:running
SET %ERRORLEVEL% = 0

2 个答案:

答案 0 :(得分:5)

在扩展操作期间,Azure将通过Changing事件将RoleEnvironmentTopologyChange发送到所有现有实例。这使得这些实例可以发现新的角色实例,以便允许实例之间的通信。请注意,只有在您定义了内部端点时才会发生这种情况(如果您打开RDP然后隐式获取内部端点)。

默认情况下,这些拓扑更改不会影响正在运行的实例。但是,如果您订阅了Changing事件并设置了e.Cancel=True,则角色实例将重新启动并再次运行您的启动任务。

有关拓扑更改的详细信息,请参阅http://azure.microsoft.com/blog/2011/01/04/responding-to-role-topology-changes/

所以这里有两个问题:

  1. 为什么您的角色无法从回收中恢复?这是一个重要问题,您必须修复这个问题才能获得可靠的服务。您可以从http://blogs.msdn.com/b/kwill/archive/2013/08/09/windows-azure-paas-compute-diagnostics-data.aspx处的问题排查工作流程开始,特别是http://blogs.msdn.com/b/kwill/archive/2013/09/06/troubleshooting-scenario-3-role-stuck-in-busy.aspx处的方案3。
  2. 为什么要回收角色实例以响应拓扑更改?检查更改事件处理程序,确保未设置e.Cancel=true

答案 1 :(得分:0)

这对于评论来说太长了,只是添加了kwill已经告诉过的内容:

我的ASP.NET Web角色在任何地方都没有e.Cancel = true但仍然重新启动(或者更确切地说:回收,即使在调用OnStart() 10分钟之前,环境也完全重新初始化,只是在横向扩展之后,比如经过新的部署。所以我继续前进并添加了一个事件处理程序,它只是设置默认值:

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        RoleEnvironment.Changing += (sender, e) =>
        {
            if (e.Changes.Any(change => change is RoleEnvironmentTopologyChange))
            {
                e.Cancel = false;
            }
        };
    }
}

这有帮助!角色仍然很忙,但只需几秒钟而不是15-20分钟。似乎只有角色中的网站重新启动(或者可能是整个IIS),但角色不会重新启动,整个环境也不会重新初始化。