Azure VM 操作系统升级导致的角色实例重启

本文讨论在重启角色实例时Microsoft Azure 虚拟机(VM)操作系统(OS)升级的影响。 它包含有关 OS 和来宾代理升级计划、服务影响和要求、通知、检测以及如何解决常见问题的详细信息。

升级 计划

大约每月Microsoft发布 Azure 平台即服务(PaaS)VM 的新来宾 OS 版本。 确切的计划各不相同,在 Azure 来宾 OS 版本和 SDK 兼容性矩阵可以看到历史趋势。 在此推出期间, Azure Fabric 控制器 会通过所有数据中心执行两次传递(主机 OS 传递和来宾 OS 传递)。 Azure 来宾代理的定期更新也会在 VM 内部运行。

以下部分提供有关两个升级传递和来宾代理升级的更多详细信息。

传递 1:主机 OS

第一次传递升级主机 OS。 主机 OS 将重启角色实例,构造控制器确保每次只重启一个升级域中的实例。 在此重启期间,角色实例将经历标准关闭过程。 然后,将运行该 RoleEnvironment.OnStop 事件,让你有机会正常关闭实例。

主机 OS 更新可能需要几天时间,结构才能协调数据中心内所有不同托管服务和升级域的升级。 通常,部署的不同实例会相隔数小时更新。

有关主机 OS 升级过程的详细信息,请参阅 Azure 主机更新:原因、时间和 Azure 博客文章的方式

通过 2:来宾 OS

主机 OS 在数据中心内完成升级后,将为配置为使用自动来宾 OS 版本的服务升级来宾 OS。 此升级将继续对服务使用标准升级域规则。 VM 重启,并使用升级的 OS 重新映像 Windows 分区(D 驱动器)。

来宾 OS 更新过程比主机 OS 更新快得多。 这是因为构造必须仅协调托管服务和升级域中的更新。 服务的来宾 OS 更新过程的持续时间在很大程度上取决于以下因素:

  • 角色实例数
  • 升级域数
  • 服务关闭所需的时间(StoppingOnStop 事件)
  • 服务启动所需的时间(启动任务和 OnStart 事件)

来宾代理

Azure 来宾代理每月大约会更新一次。 更新来宾代理时,将执行以下操作:

  • 运行角色(通常是 WaWorkerHost 或 WaWebHost)的主机进程正常关闭。
  • 来宾代理会自行更新。
  • 主机进程再次启动。

有关来宾代理进程及其如何与服务交互的详细信息,请参阅 Windows Azure 经典 VM 体系结构的工作流。

服务影响和要求

以下列表描述了云服务的影响和要求:

  • 如果任一角色只有一个实例,则服务可能会遇到停机。 每个角色至少应有两个实例,因为服务级别协议(SLA)需要运行时间 99.95%。

  • 希望角色实例每月大约一次重新启动主机 OS 更新。 如果具有自动来宾 OS 更新,预期实例会再次重启。 通常,重启时间相隔数小时。 但是,此时间范围可能会根据数据中心内存在的不同服务的构成而变化。

  • 角色必须遵循管理主机 OS 更新的规则。 具体而言,角色实例应在启动任务后的 30 分钟内达到 Ready 状态。 有关此限制的详细信息,请参阅 升级如何继续

  • 主机 OS 升级会导致重启角色实例,来宾 OS 升级会导致实例的重置映像等效。 由于这些事件,角色实例必须能够处理以下过程:

    • 重启
    • 重置映像
    • Recycle

通知

目前,发生 OS 升级时,Azure 平台不提供主动通知。 角色实例在关闭之前将收到一个 RoleEnvironment.Stopping 事件。 可以使用该事件正常结束角色实例正在执行的任何工作,或通知管理员实例正在关闭。

可以订阅 Azure OS 更新 RSS 源。 此源应在开始向数据中心推出 OS 更新的同一天更新。 源通常不提供高级主动通知,但有助于确定更新何时发生。 更新过程可能需要几天才能完成。 因此,在 RSS 源更新和托管服务开始更新之间,可能需要等待一个或多个天。

Azure 来宾 OS 版本列表和可在Azure 门户中选择的 OS 版本列表通常在来宾 OS 推出完成后更新。 不应将这些列表中的最新条目用作 OS 更新正在进行时的指示。

检测

目前,无法直接检测主机 OS 升级。 但是,可以在 VM 上的日志中查看重启的证据。 为此,请执行以下操作之一:

  • 在事件查看器应用中,搜索事件源 USER32(事件 ID 1074)的系统事件日志。 此事件包含以下消息:

    进程 D:\Packages\GuestAgent\WaAppAgent.exe (RD00155D50206D) 已代表用户 NT AUTHORITY\SYSTEM 启动计算机RD00155D50206D关闭,原因如下:旧版 API 关闭

    此消息指示 Azure 构造来宾代理(WaAppAgent.exe)启动 VM 关闭。

  • 在文本编辑器中,在旧应用代理运行时日志文件AppAgentRuntime.log.old_Context_Start中搜索等于ContextStopContainer()的消息。 有关如何检查应用代理运行时日志中的上下文条目的详细信息,请参阅 故障排除方案 6 – 在 Azure 博客存档中运行一段时间 后的角色回收。

常见问题和解决方案

以下部分讨论了涉及角色实例重启的一些常见问题,以及如何解决这些问题。 有关正在运行的进程以及可用于故障排除的日志文件的位置的详细信息,请参阅 Windows Azure 经典 VM 体系结构的工作流。

问题 1:主机 OS 重启后第二次无法运行启动任务或代码

主机 OS 重启后,启动任务或函数中的OnStartRun代码可能会第二次失败。 重启应该调用启动任务以再次运行。 此失败可防止角色实例达到 Ready 状态。

如果在启动任务中执行某些操作,然后运行第二次运行后返回错误的命令,该怎么办? 在这种情况下,启动任务将失败,并导致角色实例开始回收。 例如,如果使用 APPCMD set config 命令在 Internet Information Services(IIS)中添加配置节,该命令在第二次运行时会失败。 该命令生成错误消息“新添加对象缺少所需属性。 无法添加类型重复的集合项...”然后,角色实例开始回收。

解决方案 1:连接到 VM 并远程调试启动或代码失败

若要排查此类故障,请使用远程桌面协议(RDP)远程连接到 VM。 检查事件日志中是否存在错误,并签入 WaHostBootstrapper.log 文件中是否有启动任务失败。 在典型的开发和测试过程中,应从Azure 门户主动启动角色实例重启。 此步骤可帮助你测试服务,以确保它在此方案中正常工作。

启动任务失败的常见解决方法是将命令 exit /b 0 添加到启动任务脚本的末尾。 此 退出 命令使用指示成功的退出代码结束脚本。 有关为何需要此命令的详细信息,请参阅 如何配置和运行 Azure 云服务(经典)的启动任务。

问题 2:启动任务或代码在重新映像 Windows 分区后未运行

Windows 分区(D 驱动器)通常是存储程序安装和注册表更改的位置。 在更新的来宾 OS 部分中,将重新映像 Windows 分区。 这可能会导致这些安装和更改丢失。 如果启动代码错误地假定在重新映像 Windows 分区后仍存在某些注册表更改,则角色实例可能无法正常工作。 此失败可防止角色实例达到 Ready 状态。

例如,启动任务可能会更改注册表。 然后,它会在 C 或 E 驱动器上存储该更改的记录,以确保注册表更改不会再次运行。 但是,由于重新映像,D 驱动器上的注册表更改将丢失,并且启动任务不会还原该注册表更改,因为该任务认为没有必要。 缺少的注册表更改最终可能导致启动任务的其余部分失败。

解决方案 2:测试从Azure 门户重新映像角色实例

在典型的开发和测试过程中,应主动从Azure 门户启动角色实例的映像。 此步骤可帮助你测试服务,并确保它在此方案中正常工作。

问题 3:启动代码需要 30 分钟以上才能完成

如果启动代码需要 30 分钟以上才能完成,则可能有多个角色实例同时服务不足。 当启动任务执行以下操作之一时,通常会出现这种情况:

  • 安装程序或功能
  • 下载缓存数据
  • 下载网站信息

解决方案 3:查看服务影响和要求

查看“服务影响和要求”部分,了解预期内容以及如何防止或缓解任何启动延迟。

问题 4:更新后,Azure 不会重启主机或来宾 OS

在极少数情况下,Azure 在更新后可能不会重启主机或来宾 OS。 在此方案中,你可能会在门户中看到一条“正在等待主机”消息,该消息在 30 分钟或之后不会更改。

解决方案 4a:修复启动代码

如果能够使用远程桌面协议(RDP)连接到角色实例,则启动代码中可能存在可以修复的故障。 有关如何修复启动代码的详细信息,请参阅 解决方案 1:连接到 VM 并远程调试启动或代码故障。

解决方案 4b:删除部署

如果无法使用 RDP 连接到角色实例,则恢复实例的唯一方法是删除部署。

问题 5:OS 升级期间不可用一个或多个角色实例

如果在 OS 升级期间任何角色实例不可用,这可能会导致服务容量减少。 例如,假设你有两个 Web 角色实例,这两个实例通常以 75% 的 CPU 使用率运行。 如果在升级期间重启了一个实例,流量会重定向到剩余实例。 该实例无法处理额外的负载。 这会导致服务可用性减少。

解决方案 5:在服务中保留足够的容量

确保服务有足够的过剩容量来吸收某些角色实例不可用的百分比。 若要计算必须提供的过剩容量量,请将第一个数字除以升级域数。 例如,如果有两个升级域,则需要 1/2 = 50% 的容量来处理升级域变得不可用。 如果有五个升级域,则需要 1/5 = 20% 的容量来处理五个升级域中的可用性丢失。

问题 6:客户端遇到中断或超时,因为网站需要很长时间才能预热

您的网站需要几分钟才能热身? (例如,网站预热可能包括标准 IIS 或 ASP.NET 预编译和模块加载,或者可能会预热缓存或其他特定于应用的任务。在这种情况下,客户端可能会遇到中断或随机超时。

角色实例重启并且 OnStart 代码完成其运行后,角色实例将还原到负载均衡器轮换。 然后,角色实例将开始接收传入的请求。 如果网站仍在预热,所有传入的请求都会排队并超时。假设只有两个 Web 角色实例。 在这种情况下, IN_0 实例在为来宾 OS 更新重启实例时 IN_1 将收到 100% 的传入请求。 但是, IN_0 实例仍在升温。 此方案可能会导致服务完全中断,直到网站在两个实例上完成预热。

解决方案 6:停止角色实例接收传入请求,直到预热完成

建议将角色实例的事件处理代码保留在 OnStart 网站完成预热之前完成。 若要实现此事件过程,可以使用以下示例代码:

public class WebRole : RoleEntryPoint {
    public override bool OnStart () {
        // For information about handling configuration changes, see the article
        // "Customize the Lifecycle of a Web or Worker role in .NET" at
        // https://learn.microsoft.com/azure/cloud-services/cloud-services-role-lifecycle-dotnet.
        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 = "https://" + ip;
        HttpWebRequest req = HttpWebRequest.Create (urlToPing) as HttpWebRequest;
        WebResponse resp = req.GetResponse ();
        return base.OnStart ();
    }
}

详细信息

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区