Azure Metadata Service: Schemalagda händelser för virtuella Linux-datorer
Gäller för: ✔️ Virtuella Linux-datorer ✔️ – flexibla skalningsuppsättningar ✔️ – enhetliga skalningsuppsättningar
Schemalagda händelser är en Azure Metadata Service som ger ditt program tid att förbereda underhåll av virtuella datorer (VM). Den innehåller information om kommande underhållshändelser (till exempel omstart) så att ditt program kan förbereda sig och begränsa avbrott. Den är tillgänglig för alla typer av Azures virtuella datorer, inklusive PaaS och IaaS på både Windows och Linux.
Information om schemalagda händelser i Windows finns i Schemalagda händelser för virtuella Windows-datorer.
Anteckning
Schemalagda händelser är allmänt tillgängliga i alla Azure-regioner. Den senaste versionsinformationen finns i Tillgänglighet för version och region .
Varför ska jag använda schemalagda händelser?
Många program kan dra nytta av tiden att förbereda sig inför underhåll av virtuella datorer. Tiden kan användas för att utföra programspecifika uppgifter som förbättrar tillgänglighet, tillförlitlighet och användbarhet, till exempel:
- Kontrollpunkt och återställning.
- Anslutningstömning.
- Primär replikeringsredundans.
- Borttagning från en lastbalanseringspool.
- Händelseloggning.
- Korrekt avstängning.
Med schemalagda händelser kan ditt program identifiera när underhåll ska ske och utföra uppgifter för att begränsa dess påverkan.
Schemalagda händelser tillhandahåller händelser i följande användningsfall:
- Plattformsinitierat underhåll (till exempel omstart av virtuell dator, direktmigrering eller minnesbevarande uppdateringar för värden).
- Den virtuella datorn körs på degraderad värdmaskinvara som förväntas misslyckas snart.
- Den virtuella datorn kördes på en värd som drabbats av ett maskinvarufel.
- Användarinitierat underhåll (till exempel startar en användare om eller omdistribuerar en virtuell dator).
- Avlägsning av instanser för VM för oanvänd kapacitet och Skalningsuppsättning för oanvänd kapacitet.
Grunderna
Metadata Service visar information om hur du kör virtuella datorer med hjälp av en REST-slutpunkt som är tillgänglig inifrån den virtuella datorn. Informationen är tillgänglig via en icke-utfällbar IP-adress så att den inte exponeras utanför den virtuella datorn.
Omfång
Schemalagda händelser levereras till och kan bekräftas av:
- Fristående Virtual Machines.
- Alla virtuella datorer i en Azure-molntjänst (klassisk).
- Alla virtuella datorer i en tillgänglighetsuppsättning.
- Alla virtuella datorer i en skalningsuppsättnings placeringsgrupp.
Anteckning
Schemalagda händelser för alla virtuella datorer i en klientorganisation för infrastrukturkontrollanter (FC) levereras till alla virtuella datorer i en FC-klientorganisation. FC-klientorganisationen motsvarar en fristående virtuell dator, en hel molntjänst, en hel tillgänglighetsuppsättning och en placeringsgrupp för en VM-skalningsuppsättning (VMSS) oavsett användning av tillgänglighetszon. Om du till exempel har 100 virtuella datorer i en tillgänglighetsuppsättning och det finns en uppdatering av en av dem, går den schemalagda händelsen till alla 100, medan om det finns 100 enskilda virtuella datorer i en zon går händelsen bara till den virtuella dator som påverkas.
Därför kontrollerar du fältet Resources
i händelsen för att identifiera vilka virtuella datorer som påverkas.
Slutpunktsidentifiering
För VNET-aktiverade virtuella datorer är Metadata Service tillgängligt från en statisk icke-utfällbar IP-adress, 169.254.169.254
. Den fullständiga slutpunkten för den senaste versionen av Schemalagda händelser är:
http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
Om den virtuella datorn inte skapas inom en Virtual Network, standardfallen för molntjänster och klassiska virtuella datorer, krävs extra logik för att identifiera IP-adressen som ska användas. Information om hur du identifierar värdslutpunkten finns i det här exemplet.
Tillgänglighet för version och region
Tjänsten Schemalagda händelser är versionshanterad. Versioner är obligatoriska. den aktuella versionen är 2020-07-01
.
Version | Versionstyp | Regioner | Viktig information |
---|---|---|---|
2020-07-01 | Allmän tillgänglighet | Alla | |
2019-08-01 | Allmän tillgänglighet | Alla | |
2019-04-01 | Allmän tillgänglighet | Alla | |
2019-01-01 | Allmän tillgänglighet | Alla | |
2017-11-01 | Allmän tillgänglighet | Alla | |
2017-08-01 | Allmän tillgänglighet | Alla | |
2017-03-01 | Förhandsgranskning | Alla |
Anteckning
Tidigare förhandsversioner av schemalagda händelser hade stöd för {latest} som API-version. Det här formatet stöds inte längre och kommer att bli inaktuellt i framtiden.
Aktivera och inaktivera schemalagda händelser
Schemalagda händelser aktiveras för din tjänst första gången du begär händelser. Du bör förvänta dig ett fördröjt svar i ditt första anrop på upp till två minuter.
Schemalagda händelser inaktiveras för din tjänst om den inte gör en begäran på 24 timmar.
Användarinitierat underhåll
Användarinitierat VM-underhåll via Azure Portal, API, CLI eller PowerShell resulterar i en schemalagd händelse. Sedan kan du testa logiken för underhållsförberedelse i ditt program och programmet kan förbereda sig för användarinitierat underhåll.
Om du startar om en virtuell dator schemaläggs en händelse med typen Reboot
. Om du distribuerar om en virtuell dator schemaläggs en händelse med typen Redeploy
. Vanligtvis kan händelser med en användarhändelsekälla godkännas omedelbart för att undvika en fördröjning vid användarinitierade åtgärder. Vi rekommenderar att en primär och sekundär virtuell dator kommunicerar och godkänner användargenererade schemalagda händelser om den primära virtuella datorn slutar svara. Det här arrangemanget förhindrar fördröjningar i återställningen av programmet till ett bra tillstånd.
Använda API:et
Sidhuvuden
När du frågar Metadata Service måste du ange huvudet Metadata:true
för att säkerställa att begäran inte oavsiktligt omdirigerades. Rubriken Metadata:true
krävs för alla schemalagda händelsebegäranden. Om du inte tar med huvudet i begäran resulterar det i ett "Felaktig begäran"-svar från metadatatjänsten.
Fråga efter händelser
Du kan fråga efter schemalagda händelser genom att göra följande anrop:
Bash-exempel
curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
Python-exempel
import json
import requests
metadata_url ="http://169.254.169.254/metadata/scheduledevents"
header = {'Metadata' : 'true'}
query_params = {'api-version':'2020-07-01'}
def get_scheduled_events():
resp = requests.get(metadata_url, headers = header, params = query_params)
data = resp.json()
return data
Ett svar innehåller en matris med schemalagda händelser. En tom matris innebär att inga händelser för närvarande är schemalagda. Om det finns schemalagda händelser innehåller svaret en matris med händelser.
{
"DocumentIncarnation": {IncarnationID},
"Events": [
{
"EventId": {eventID},
"EventType": "Reboot" | "Redeploy" | "Freeze" | "Preempt" | "Terminate",
"ResourceType": "VirtualMachine",
"Resources": [{resourceName}],
"EventStatus": "Scheduled" | "Started",
"NotBefore": {timeInUTC},
"Description": {eventDescription},
"EventSource" : "Platform" | "User",
"DurationInSeconds" : {timeInSeconds},
}
]
}
Händelseegenskaper
Egenskap | Beskrivning |
---|---|
Inkarnation av dokument | Heltal som ökar när händelsematrisen ändras. Dokument med samma inkarnation innehåller samma händelseinformation och inkarnationen ökas när en händelse ändras. |
EventID | Globalt unik identifierare för den här händelsen. Exempel:
|
Eventtype | Påverka den här händelsens orsaker. Värden:
|
ResourceType | Typ av resurs som den här händelsen påverkar. Värden:
|
Resurser | Lista över resurser som händelsen påverkar. Exempel:
|
EventStatus | Status för den här händelsen. Värden:
Completed eller liknande status har någonsin angetts. Händelsen returneras inte längre när händelsen är klar. |
NotBefore | Tid efter vilken den här händelsen kan starta. Händelsen kommer garanterat inte att starta innan den här gången. Kommer att vara tomt om händelsen redan har startats Exempel:
|
Description | Beskrivning av den här händelsen. Exempel:
|
EventSource | Initieraren av händelsen. Exempel:
|
DurationInSeconds | Den förväntade varaktigheten för avbrottet som orsakas av händelsen. Exempel:
|
Schemaläggning av händelser
Varje händelse schemaläggs en minsta tid i framtiden baserat på händelsetypen. Den här gången återspeglas i en händelses NotBefore
egenskap.
Eventtype | Minsta varsel |
---|---|
Frysa | 15 minuter |
Starta om | 15 minuter |
Omdistribuera | 10 minuter |
Föregripa | 30 sekunder |
Terminate | Användaren kan konfigureras: 5 till 15 minuter |
Anteckning
I vissa fall kan Azure förutsäga värdfel på grund av försämrad maskinvara och försöker minimera störningar i tjänsten genom att schemalägga en migrering. Berörda virtuella datorer får en schemalagd händelse med en NotBefore
som vanligtvis är några dagar i framtiden. Den faktiska tiden varierar beroende på den förväntade felriskbedömningen. Azure försöker ge 7 dagars förvarning när det är möjligt, men den faktiska tiden varierar och kan vara mindre om förutsägelsen är att det finns en stor chans att maskinvaran misslyckas inom kort. För att minimera risken för din tjänst om maskinvaran misslyckas innan den systeminitierade migreringen rekommenderar vi att du distribuerar om den virtuella datorn så snart som möjligt.
Anteckning
Om värdnoden drabbas av ett maskinvarufel kringgår Azure den minsta uppsägningstiden och påbörjar omedelbart återställningsprocessen för berörda virtuella datorer. Detta minskar återställningstiden om de berörda virtuella datorerna inte kan svara. Under återställningsprocessen skapas en händelse för alla berörda virtuella datorer med EventType = Reboot
och EventStatus = Started
.
Avsökningsfrekvens
Du kan avsöka slutpunkten efter uppdateringar så ofta eller sällan som du vill. Men ju längre tid mellan begäranden, desto mer tid kan du eventuellt förlora för att reagera på en kommande händelse. De flesta händelser har 5 till 15 minuters förvarning, men i vissa fall kan förvarning vara så lite som 30 sekunder. För att säkerställa att du har så mycket tid som möjligt för att vidta åtgärder rekommenderar vi att du avsöker tjänsten en gång per sekund.
Starta en händelse
När du har lärt dig om en kommande händelse och slutför logiken för en graciös avstängning kan du godkänna den utestående händelsen genom att göra ett POST
anrop till Metadata Service med EventId
. Det här anropet anger för Azure att det kan förkorta den minsta meddelandetiden (när det är möjligt). Händelsen kanske inte startar omedelbart efter godkännande, i vissa fall kräver Azure godkännande av alla virtuella datorer som finns på noden innan du fortsätter med händelsen.
Följande JSON-exempel förväntas i begärandetexten POST
. Begäran ska innehålla en lista med StartRequests
. Var och StartRequest
en innehåller EventId
för den händelse som du vill påskynda:
{
"StartRequests" : [
{
"EventId": {EventId}
}
]
}
Tjänsten returnerar alltid en 200-framgångskod för ett giltigt händelse-ID, även om den redan har godkänts av en annan virtuell dator. En 400-felkod anger att begärandehuvudet eller nyttolasten var felaktigt formulerad.
Bash-exempel
curl -H Metadata:true -X POST -d '{"StartRequests": [{"EventId": "f020ba2e-3bc0-4c40-a10b-86575a9eabd5"}]}' http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
Python-exempel
import json
import requests
def confirm_scheduled_event(event_id):
# This payload confirms a single event with id event_id
payload = json.dumps({"StartRequests": [{"EventId": event_id }]})
response = requests.post("http://169.254.169.254/metadata/scheduledevents",
headers = {'Metadata' : 'true'},
params = {'api-version':'2020-07-01'},
data = payload)
return response.status_code
Anteckning
Genom att bekräfta en händelse kan händelsen fortsätta för alla Resources
i händelsen, inte bara den virtuella dator som bekräftar händelsen. Därför kan du välja att välja en ledare för att samordna bekräftelsen, vilket kan vara så enkelt som den första datorn i Resources
fältet.
Exempelsvar
Följande svar är ett exempel på en serie händelser som visades av två virtuella datorer som direkt migrerades till en annan nod.
DocumentIncarnation
Ändras varje gång det finns ny information i Events
. Ett godkännande av händelsen skulle göra det möjligt för frysningen att fortsätta för både WestNO_0 och WestNO_1. - DurationInSeconds
1 anger att plattformen inte vet hur lång tid åtgärden tar.
{
"DocumentIncarnation": 1,
"Events": [
]
}
{
"DocumentIncarnation": 2,
"Events": [
{
"EventId": "C7061BAC-AFDC-4513-B24B-AA5F13A16123",
"EventStatus": "Scheduled",
"EventType": "Freeze",
"ResourceType": "VirtualMachine",
"Resources": [
"WestNO_0",
"WestNO_1"
],
"NotBefore": "Mon, 11 Apr 2022 22:26:58 GMT",
"Description": "Virtual machine is being paused because of a memory-preserving Live Migration operation.",
"EventSource": "Platform",
"DurationInSeconds": 5
}
]
}
{
"DocumentIncarnation": 3,
"Events": [
{
"EventId": "C7061BAC-AFDC-4513-B24B-AA5F13A16123",
"EventStatus": "Started",
"EventType": "Freeze",
"ResourceType": "VirtualMachine",
"Resources": [
"WestNO_0",
"WestNO_1"
],
"NotBefore": "",
"Description": "Virtual machine is being paused because of a memory-preserving Live Migration operation.",
"EventSource": "Platform",
"DurationInSeconds": 5
}
]
}
{
"DocumentIncarnation": 4,
"Events": [
]
}
Python-exempel
Följande exempel frågar metadatatjänsten för schemalagda händelser och godkänner varje utestående händelse:
#!/usr/bin/python
import json
import requests
from time import sleep
# The URL to access the metadata service
metadata_url ="http://169.254.169.254/metadata/scheduledevents"
# This must be sent otherwise the request will be ignored
header = {'Metadata' : 'true'}
# Current version of the API
query_params = {'api-version':'2020-07-01'}
def get_scheduled_events():
resp = requests.get(metadata_url, headers = header, params = query_params)
data = resp.json()
return data
def confirm_scheduled_event(event_id):
# This payload confirms a single event with id event_id
# You can confirm multiple events in a single request if needed
payload = json.dumps({"StartRequests": [{"EventId": event_id }]})
response = requests.post(metadata_url,
headers= header,
params = query_params,
data = payload)
return response.status_code
def log(event):
# This is an optional placeholder for logging events to your system
print(event["Description"])
return
def advanced_sample(last_document_incarnation):
# Poll every second to see if there are new scheduled events to process
# Since some events may have necessarily short warning periods, it is
# recommended to poll frequently
found_document_incarnation = last_document_incarnation
while (last_document_incarnation == found_document_incarnation):
sleep(1)
payload = get_scheduled_events()
found_document_incarnation = payload["DocumentIncarnation"]
# We recommend processing all events in a document together,
# even if you won't be actioning on them right away
for event in payload["Events"]:
# Events that have already started, logged for tracking
if (event["EventStatus"] == "Started"):
log(event)
# Approve all user initiated events. These are typically created by an
# administrator and approving them immediately can help to avoid delays
# in admin actions
elif (event["EventSource"] == "User"):
confirm_scheduled_event(event["EventId"])
# For this application, freeze events less that 9 seconds are considered
# no impact. This will immediately approve them
elif (event["EventType"] == "Freeze" and
int(event["DurationInSeconds"]) >= 0 and
int(event["DurationInSeconds"]) < 9):
confirm_scheduled_event(event["EventId"])
# Events that may be impactful (for example, Reboot or redeploy) may need custom
# handling for your application
else:
#TODO Custom handling for impactful events
log(event)
print("Processed events from document: " + str(found_document_incarnation))
return found_document_incarnation
def main():
# This will track the last set of events seen
last_document_incarnation = "-1"
input_text = "\
Press 1 to poll for new events \n\
Press 2 to exit \n "
program_exit = False
while program_exit == False:
user_input = input(input_text)
if (user_input == "1"):
last_document_incarnation = advanced_sample(last_document_incarnation)
elif (user_input == "2"):
program_exit = True
if __name__ == '__main__':
main()
Nästa steg
- Granska kodexemplen schemalagda händelser i GitHub-lagringsplatsen schemalagda azure-instansmetadata.
- Granska kodexemplen för Node.js schemalagda händelser i GitHub-lagringsplatsen Azure Samples.
- Läs mer om de API:er som är tillgängliga i instansmetadatatjänsten.
- Lär dig mer om planerat underhåll för virtuella Linux-datorer i Azure.
- Lär dig hur du loggar schemalagda händelser med hjälp av Azure Event Hubs på GitHub-lagringsplatsen azure samples.