Azure 元数据服务:适用于 Windows VM 的计划事件(预览)
计划事件是 Azure 元数据服务中的其中一个子服务。 它负责显示有关即将发生的事件(例如,重新启动)的信息,使应用程序可以为其做准备并限制中断。 它可用于所有 Azure 虚拟机类型(包括 PaaS 和 IaaS)。 计划事件为虚拟机提供了执行预防性任务的时间,将事件的影响降到最低。
计划事件可用于 Linux 和 Windows VM。 有关 Linux 上的计划事件的信息,请参阅适用于 Linux VM 的计划事件。
为何使用计划事件?
通过计划事件,可以采取措施限制由平台启动的维护或由用户启动的操作对服务带来的影响。
使用复制技术保持状态的多实例工作负荷可能易受到跨多个实例频繁发生的服务中断的影响。 此类中断可能导致任务开销昂贵(例如,重新生成索引)甚至副本丢失。
在很多其他情况下,通过正常关闭序列(如完成或取消正在进行的事务)、将任务重新分配给群集中的其他 VM(手动故障转移)或从网络负载均衡器池中删除虚拟机,可能都可提高服务的整体可用性。
有时通知管理员即将发生的事件或记录此类事件也可帮助提高在云中托管的应用程序的可服务性。
Azure 元数据服务在以下用例中显示计划事件:
- 平台启动的维护(例如,主机 OS 部署)
- 用户启动的调用(例如,用户重启或重新部署 VM)
基础知识
Azure 元数据服务公开在 VM 中使用可访问的 REST 终结点运行虚拟机的相关信息。 该信息通过不可路由的 IP 提供,因此不会在 VM 外部公开。
范围
计划事件会显示到云服务中的所有虚拟机或可用性集中的所有虚拟机上。 因此,应查看事件中的 Resources 字段以确定将受到影响的 VM。
发现终结点
如果在虚拟网络 (VNet) 中创建虚拟机,可从不可路由 IP 169.254.169.254 获得元数据服务。 如果不在虚拟网络中创建虚拟机(云服务和经典 VM 的默认情况),需要使用其他逻辑发现可使用的终结点。 请参阅此示例,了解如何发现主机终结点。
版本控制
已对实例元数据服务进行了版本控制。 版本是必需的,当前版本为 2017-03-01。
Note
支持的计划事件的前一预览版 {latest} 发布为 api-version。 此格式不再受支持,并且将在未来弃用。
使用标头
查询元数据服务时,必须提供标头 Metadata: true 以确保不会在无意中重定向该请求。
启用计划事件
首次请求计划事件时,Azure 会在虚拟机上隐式启用该功能。 因此,第一次调用时应该会延迟响应最多两分钟。
用户启动的维护
用户通过 Azure 门户、API、CLI 或 PowerShell 启动的虚拟机维护会生成计划事件。 这样便可以在应用程序中测试维护准备逻辑,并可以通过应用程序准备用户启动的维护。
重启虚拟机会计划 Reboot 类型的事件。 重新部署虚拟机会计划 Redeploy 类型的事件。
Note
目前,可以同时计划最多 10 个用户启动的维护操作。 在计划事件公开发布之前将放宽此限制。
Note
目前,生成计划事件的用户启动的维护不可配置。 可配置性已计划在将来的版本中推出。
使用 API
查询事件
只需进行以下调用即可查询计划事件:
curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2017-03-01
响应包含计划事件的数组。 数组为空意味着目前没有计划事件。 如果有计划事件,响应会包含事件的数组:
{
"DocumentIncarnation": {IncarnationID},
"Events": [
{
"EventId": {eventID},
"EventType": "Reboot" | "Redeploy" | "Freeze",
"ResourceType": "VirtualMachine",
"Resources": [{resourceName}],
"EventStatus": "Scheduled" | "Started",
"NotBefore": {timeInUTC},
}
]
}
事件属性
| 属性 | 说明 |
|---|---|
| EventId | 此事件的全局唯一标识符。
示例:
|
| EventType | 此事件造成的影响。
值:
|
| ResourceType | 此事件影响的资源的类型。
值:
|
| 资源 | 此事件影响的资源的列表。 它保证最多只能包含一个更新域的计算机,但可能不包含该更新域中的所有计算机。
示例:
|
| 事件状态 | 此事件的状态。
值:
不提供 |
| NotBefore | 此事件可能会在之后启动的时间。
示例:
|
事件计划
将根据事件类型为每个事件计划将来的最小量时间。 此时间反映在某个事件的 NotBefore 属性上。
| EventType | 最小值通知 |
|---|---|
| 冻结 | 15 分钟 |
| 重新启动 | 15 分钟 |
| 重新部署 | 10 分钟 |
启动事件
了解即将发生的事件并完成正常关闭逻辑后,可以通过使用 EventId 对元数据服务进行 POST 调用来批准未完成的事件。 这指示 Azure 可以缩短最小通知时间(如可能)。
curl -H Metadata:true -X POST -d '{"DocumentIncarnation":"5", "StartRequests": [{"EventId": "f020ba2e-3bc0-4c40-a10b-86575a9eabd5"}]}' http://169.254.169.254/metadata/scheduledevents?api-version=2017-03-01
Note
确认事件后,即可允许事件针对事件中所有的 Resources 继续进行,而不仅仅是确认该事件的虚拟机。 因此,可以选择一个指挥计算机来协调该确认,为简单起见,可选择 Resources 字段中的第一个计算机。
PowerShell 示例
下例将查询计划事件的元数据服务器并审核所有未完成的事件。
# How to get scheduled events
function GetScheduledEvents($uri)
{
$scheduledEvents = Invoke-RestMethod -Headers @{"Metadata"="true"} -URI $uri -Method get
$json = ConvertTo-Json $scheduledEvents
Write-Host "Received following events: `n" $json
return $scheduledEvents
}
# How to approve a scheduled event
function ApproveScheduledEvent($eventId, $docIncarnation, $uri)
{
# Create the Scheduled Events Approval Document
$startRequests = [array]@{"EventId" = $eventId}
$scheduledEventsApproval = @{"StartRequests" = $startRequests; "DocumentIncarnation" = $docIncarnation}
# Convert to JSON string
$approvalString = ConvertTo-Json $scheduledEventsApproval
Write-Host "Approving with the following: `n" $approvalString
# Post approval string to scheduled events endpoint
Invoke-RestMethod -Uri $uri -Headers @{"Metadata"="true"} -Method POST -Body $approvalString
}
function HandleScheduledEvents($scheduledEvents)
{
# Add logic for handling events here
}
######### Sample Scheduled Events Interaction #########
# Set up the scheduled events URI for a VNET-enabled VM
$localHostIP = "169.254.169.254"
$scheduledEventURI = 'http://{0}/metadata/scheduledevents?api-version=2017-03-01' -f $localHostIP
# Get events
$scheduledEvents = GetScheduledEvents $scheduledEventURI
# Handle events however is best for your service
HandleScheduledEvents $scheduledEvents
# Approve events when ready (optional)
foreach($event in $scheduledEvents.Events)
{
Write-Host "Current Event: `n" $event
$entry = Read-Host "`nApprove event? Y/N"
if($entry -eq "Y" -or $entry -eq "y")
{
ApproveScheduledEvent $event.EventId $scheduledEvents.DocumentIncarnation $scheduledEventURI
}
}
C# 示例
下例是关于与元数据服务进行通信的简单客户端。
public class ScheduledEventsClient
{
private readonly string scheduledEventsEndpoint;
private readonly string defaultIpAddress = "169.254.169.254";
// Set up the scheduled events URI for a VNET-enabled VM
public ScheduledEventsClient()
{
scheduledEventsEndpoint = string.Format("http://{0}/metadata/scheduledevents?api-version=2017-03-01", defaultIpAddress);
}
// Get events
public string GetScheduledEvents()
{
Uri cloudControlUri = new Uri(scheduledEventsEndpoint);
using (var webClient = new WebClient())
{
webClient.Headers.Add("Metadata", "true");
return webClient.DownloadString(cloudControlUri);
}
}
// Approve events
public void ApproveScheduledEvents(string jsonPost)
{
using (var webClient = new WebClient())
{
webClient.Headers.Add("Content-Type", "application/json");
webClient.UploadString(scheduledEventsEndpoint, jsonPost);
}
}
}
无法使用以下数据结构表示计划事件:
public class ScheduledEventsDocument
{
public string DocumentIncarnation;
public List<CloudControlEvent> Events { get; set; }
}
public class CloudControlEvent
{
public string EventId { get; set; }
public string EventStatus { get; set; }
public string EventType { get; set; }
public string ResourceType { get; set; }
public List<string> Resources { get; set; }
public DateTime? NotBefore { get; set; }
}
public class ScheduledEventsApproval
{
public string DocumentIncarnation;
public List<StartRequest> StartRequests = new List<StartRequest>();
}
public class StartRequest
{
[JsonProperty("EventId")]
private string eventId;
public StartRequest(string eventId)
{
this.eventId = eventId;
}
}
下例将查询计划事件的元数据服务器并审核所有未完成的事件。
public class Program
{
static ScheduledEventsClient client;
static void Main(string[] args)
{
client = new ScheduledEventsClient();
while (true)
{
string json = client.GetDocument();
ScheduledEventsDocument scheduledEventsDocument = JsonConvert.DeserializeObject<ScheduledEventsDocument>(json);
HandleEvents(scheduledEventsDocument.Events);
// Wait for user response
Console.WriteLine("Press Enter to approve executing events\n");
Console.ReadLine();
// Approve events
ScheduledEventsApproval scheduledEventsApprovalDocument = new ScheduledEventsApproval()
{
DocumentIncarnation = scheduledEventsDocument.DocumentIncarnation
};
foreach (CloudControlEvent event in scheduledEventsDocument.Events)
{
scheduledEventsApprovalDocument.StartRequests.Add(new StartRequest(event.EventId));
}
if (scheduledEventsApprovalDocument.StartRequests.Count > 0)
{
// Serialize using Newtonsoft.Json
string approveEventsJsonDocument =
JsonConvert.SerializeObject(scheduledEventsApprovalDocument);
Console.WriteLine($"Approving events with json: {approveEventsJsonDocument}\n");
client.ApproveScheduledEvents(approveEventsJsonDocument);
}
Console.WriteLine("Complete. Press enter to repeat\n\n");
Console.ReadLine();
Console.Clear();
}
}
private static void HandleEvents(List<CloudControlEvent> events)
{
// Add logic for handling events here
}
}
Python 示例
下例将查询计划事件的元数据服务器并审核所有未完成的事件。
#!/usr/bin/python
import json
import urllib2
import socket
import sys
metadata_url = "http://169.254.169.254/metadata/scheduledevents?api-version=2017-03-01"
headers = "{Metadata:true}"
this_host = socket.gethostname()
def get_scheduled_events():
req = urllib2.Request(metadata_url)
req.add_header('Metadata', 'true')
resp = urllib2.urlopen(req)
data = json.loads(resp.read())
return data
def handle_scheduled_events(data):
for evt in data['Events']:
eventid = evt['EventId']
status = evt['EventStatus']
resources = evt['Resources']
eventtype = evt['EventType']
resourcetype = evt['ResourceType']
notbefore = evt['NotBefore'].replace(" ","_")
if this_host in resources:
print "+ Scheduled Event. This host is scheduled for " + eventype + " not before " + notbefore
# Add logic for handling events here
def main():
data = get_scheduled_events()
handle_scheduled_events(data)
if __name__ == '__main__':
main()
sys.exit(0)
后续步骤
- 有关 API 的更多信息,请参阅实例元数据服务。
- 了解 Azure 中 Windows 虚拟机的计划内维护。
立即访问http://market.azure.cn
Azure 元数据服务:适用于 Windows VM 的计划事件(预览)的更多相关文章
- 适用于 Windows VM 的 Azure 示例基础结构演练
本文是更广泛系列的一部分,当你在 Azure 中构建应用程序基础结构时,这些系列向你提供设计注意事项和准则. 用户可以查看系列中的其他主题. 尽管用户可以在 Azure 中快速地构建出开发/测试环境, ...
- 如何使用 Azure PowerShell 在 Azure Marketplace 中查找 Windows VM 映像
本主题介绍如何使用 Azure PowerShell 在 Azure Marketplace 中查找 VM 映像. 创建 Windows VM 时使用此信息来指定 Marketplace 映像. 确保 ...
- svn服务支持网页显示并增加在线预览功能,支持视频在线播放
1.svn服务器支持网页显示 VisualSVN Server是一个非常不错的SVN Server程序,方便,直观,用户管理也异常方便.不过,它本身并没有提供在线修改密码的功能.由于在实际使用过程中, ...
- 关于Windows 10上MarkdownPad2无法预览的解决办法
升级win10后,发现一直可以用的MarkdownPad2预览功能不可以用了.于是在网上搜索了一下,刚开始没有解决.不过现在可以了.现在把解决方案记录下来.Windows10上使用MarkdownPa ...
- 使用 Azure 资源管理器向 Windows VM 应用策略
通过使用策略,组织可以在整个企业中强制实施各种约定和规则. 强制实施所需行为有助于消除风险,同时为组织的成功做出贡献. 本文介绍如何使用 Azure 资源管理器策略,为组织中的虚拟机定义所需的行为. ...
- Windows server 2008 R2如何预览图片而不是显示图标?
Previews of media files are disabled by default in Windows Server 2008. In this article we will en ...
- windows 下 php 实现在线预览附件(pdf)
(写的有点啰嗦,具体的实现方法只是粗体和代码就够了) 给市场部门用dede做个cms,需要附件在线查看.公司有个系统(就叫develop_cms吧)是已经实现的,本以为很容易,不过是下一个插件然后把附 ...
- 宣布正式发布 Windows Azure 移动服务、网站及持续的服务创新
我们努力创新,向开发人员提供多样化平台以构建最好的云应用程序并在第一时间提供给世界各地的客户.许多新应用程序都属于"现代化应用程序",即始终基于 Web,且可以通过各种移动设备进行 ...
- 宣布发布 Windows Azure 导入/导出服务的预览版以及 Web 和移动解决方案场景的若干增强功能
客户评估基于云的存储解决方案时,面临的挑战之一是以经济高效.安全快速的方式从 Blob 存储区移进和移出大量数据.今天,我们很高兴地宣布发布 Windows Azure 导入/导出的预览版,这款新服务 ...
随机推荐
- CCF 201509-3 模版生成系统
试题编号: 201509-3 试题名称: 模板生成系统 时间限制: 1.0s 内存限制: 256.0MB 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的 ...
- [Python 从入门到放弃] 2. 列表的其它操作
1. 列表可以混合不同类型的数据项 movies=['<黄飞鸿之英雄有梦>','<寒战2>','<乘风破浪>'] 在这句代码中,数据项为电影名称,现在这个列表用来保 ...
- 从QQ音乐开发,探讨如何利用腾讯云SDK在直播中加入视频动画
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 看着精彩的德甲赛事,突然裁判一声口哨,球赛断掉了,屏幕开始自动播放"吃麦趣鸡盒,看德甲比赛&q ...
- GoogLeNetv3 论文研读笔记
Rethinking the Inception Architecture for Computer Vision 原文链接 摘要 卷积网络是目前最新的计算机视觉解决方案的核心,对于大多数任务而言,虽 ...
- 没有什么,开发ASP.NET时随便写写,想到什么写什么
没有什么,开发ASP.NET时随便写写,想到什么写什么,这次想写点开发过程中,比如在数据库,某一张表中有一个字段,如下: 上面代码示例中高亮字段,数据类型为BIT,它存储的值将为"True& ...
- 音频播放时出现 Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first. https://goo.gl/xX8pDD
<audio id="play" controls="controls" loop="loop"> <source src ...
- tomcat内存设置问题
一. tomcat内存设置问题 收藏 在使用Java程序从数据库中查询大量的数据或是应用服务器(如tomcat.jboss,weblogic)加载jar包时会出现java.lang.OutOfMemo ...
- ajax 拼接html标签 thinkphp
ajax 拼接html标签 thinkphp框架 一.html部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional ...
- [日常] Go语言圣经--接口约定习题
Go语言圣经-接口1.接口类型是对其它类型行为的抽象和概括2.Go语言中接口类型的独特之处在于它是满足隐式实现的3.Go语言中还存在着另外一种类型:接口类型.接口类型是一种抽象的类型4.一个类型可以自 ...
- CSS学习笔记03 CSS层叠性、继承性、特殊性
层叠性 所谓层叠性是指多种CSS样式的叠加,也就是说后面设置的样式会层叠(覆盖)之前的样式,层叠性的前提是CSS的选择器的优先级相同,例如,当使用内嵌式CSS样式表定义<p>标记字号大小为 ...