【问题标题】:How do I detect the case when my Azure role is moved to on a new VM?当我的 Azure 角色移动到新 VM 上时,如何检测这种情况?
【发布时间】:2013-05-07 09:25:10
【问题描述】:

Azure 有时可以重新启动运行我的角色实例的 VM,有时它可以在一个 VM 上停止它,然后将其部署到另一个 VM - 例如,如果运行 VM 的硬件发生故障。

很明显,在这两种情况下,VM 正常运行时间都会重置。

如何检测后者 - 经过一些自动清理后,我如何判断它是新虚拟机,而不是旧虚拟机?

【问题讨论】:

  • 你为什么想知道这个?
  • @GerrieSchenck:我需要尽可能多的细节来进行调试。
  • 你到底在调试什么?我想不出有什么理由需要这些信息。
  • @Jaxidian:我周一到办公室,拿到日志,发现所有实例都在周六重新启动。我想知道发生了什么。

标签: windows azure virtual-machine azure-web-roles azure-worker-roles


【解决方案1】:

我不确定这是否可行,但也许您可以创建一个本地存储驱动器,并将“角色回收时清理”设置为 false。当您的角色开始时,请检查是否存在预定文件。如果该文件在那里,那么您将在旧 VM 上重新启动。如果没有文件,您将在新 VM 上启动。无论哪种情况,请在检查后写入文件。

【讨论】:

  • 我正在使用这个解决方案。工作正常。
【解决方案2】:

不是 100% 万无一失的方法,但您可以做的是,当虚拟机启动时,您可以使用 RoleInstance.Id 属性获取角色实例的 ID,使用 Environment.MachineName 属性获取虚拟机的计算机名称并将其保存在某处在表存储中。然后,每次启动 VM 时,您都可以检查此表以确定是否已将新 VM 分配给您的角色实例。

【讨论】:

  • 如果我的实例被移动到另一个虚拟机,它的RoleInstance.Id 肯定不会改变。我能否确定新 VM 不会重复使用 VM 计算机名称?
  • 我不能 100% 确定是否不能再次使用相同的计算机名称。这就是为什么我说它不是 100% 万无一失的。只是大声思考——您可以有一个带有 PartitionKey = RoleInstance.Id 和 RowKey = 计算机名称(反之亦然)的表,然后添加一些额外的参数(不确定它们是什么)来帮助您唯一和细化地识别它。
【解决方案3】:

我建议您捕获并记录(到 ATS/blob/SQLAzure 等共享存储)所有 RoleEnvironment 事件,例如 Stopping/Starting/etc 以及机器名称和实例 ID。这将为您提供所有必要的信息,以便在您的机器重新启动以及它们是否被移动时进行调试。

【讨论】:

  • 我已经这样做了,但是如果机器名称被重新用于新 VM,那将无济于事。
  • 不会。也许,当您的应用程序第一次启动时,请在本地硬盘驱动器上的某个位置使用时间戳和其他相关信息?然后,在应用程序启动期间的后续时间,首先检查文件是否存在,如果不存在则仅添加它。这样,如果机器被重新映像并且文件消失了,您就会知道发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多