خدمة بيانات تعريف Azure: الأحداث المجدولة لأجهزة Windows الظاهرية
ينطبق على: ✔️ أجهزة Windows الظاهرية ✔️ مجموعات المقاييس المرنة ✔️ مجموعات المقاييس الموحدة
Scheduled Events هي خدمة بيانات تعريف Azure التي تعطي وقت التطبيق الخاص بك للتحضير لصيانة الجهاز الظاهري (VM). حيث توفر معلومات حول أحداث الصيانة القادمة (على سبيل المثال، إعادة التشغيل) بحيث يمكن للتطبيق الخاص بك الاستعداد لها والحد من التعطيل. وهي متاحة لجميع أنواع الأجهزة الظاهرية Azure، بما في ذلك PaaS وIaaS على كل من Windows وLinux.
للحصول على معلومات حول الأحداث المجدولة على Linux، راجع الأحداث المجدولة لأجهزة Linux الظاهرية.
ملاحظة
تتوفر الأحداث المجدولة بشكل عام في جميع مناطق Azure. راجع الإصدار وتوفر المنطقة للحصول على أحدث معلومات الإصدار.
لماذا تستخدم الأحداث المجدولة؟
يمكن للعديد من التطبيقات الاستفادة من الوقت المخصص للتحضير لصيانة الجهاز الظاهري. يمكن استخدام الوقت لتنفيذ مهام خاصة بالتطبيقات تعمل على تحسين التوفر والموثوقية وإمكانية الخدمة، بما في ذلك:
- نقطة التحقق والاستعادة.
- استنزاف الاتصال.
- تجاوز فشل نسخة متماثلة أساسية.
- إزالة من مجموعة موازنة تحميل.
- تسجيل الأحداث.
- إيقاف تشغيل آمن.
باستخدام الأحداث المجدولة، يمكن للتطبيق اكتشاف وقت حدوث الصيانة وتشغيل المهام للحد من تأثيرها.
توفر الأحداث المجدولة الأحداث في حالات الاستخدام التالية:
- الصيانة التي بدأها النظام الأساسي (على سبيل المثال، إعادة تهيئة الجهاز الظاهري، أو الترحيل المباشر، أو تحديثات حفظ الذاكرة للمضيف).
- يعمل الجهاز الظاهري على الأجهزة المضيفة المتدهورة التي من المتوقع فشلها قريباً.
- كان الجهاز الظاهري يعمل على مضيف عانى من فشل في الأجهزة.
- الصيانة التي يبدأها المستخدم (على سبيل المثال، يعيد المستخدم تشغيل جهاز ظاهري أو يعيد توزيعه).
- عمليات إخلاء مثيل مجموعة جهاز Spot الظاهري ومقياس Spot.
الأساسيات
تعرض "خدمة بيانات التعريف" معلومات حول تشغيل الأجهزة الظاهرية باستخدام نقطة نهاية REST التي يمكن الوصول إليها من داخل الجهاز الظاهري. تتوفر المعلومات عبر عنوان IP غير قابل للتوجيه، بحيث لا يتم كشفه خارج الجهاز الظاهري.
النطاق
يتم تسليم الأحداث المجدولة إلى:
- أجهزة ظاهرية مستقلة.
- جميع الأجهزة الظاهرية في خدمة سحابية.
- جميع الأجهزة الظاهرية في مجموعة التوفر.
- جميع الأجهزة الظاهرية في منطقة توفر.
- كل الأجهزة الظاهرية في مجموعة مواضع مجموعة المقياس.
ملاحظة
يتم تسليم الأحداث المجدولة لجميع الأجهزة الظاهرية في مستأجر Fabric Controller (FC) إلى كافة الأجهزة الظاهرية في مستأجر FC. يعادل مستأجر FC جهازًا ظاهريًا مستقلاً، وخدمة سحابية كاملة، ومجموعة توفر خدمات كاملة، ومجموعة مواضع لمجموعة مقاييس الجهاز الظاهري (VMSS) بغض النظر عن استخدام منطقة التوفر.
نتيجة لذلك، تحقق من الحقل Resources في الحدث لتحديد الأجهزة الظاهرية المتأثرة.
اكتشاف نقطة النهاية
بالنسبة للأجهزة الظاهرية التي تدعم الشبكة الظاهرية، تتوفر «خدمة بيانات التعريف» من عنوان IP ثابت غير قابل للتوجيه، 169.254.169.254. نقطة النهاية الكاملة لأحدث إصدار من الأحداث المجدولة هي:
http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
إذا لم يتم إنشاء الجهاز الظاهري داخل شبكة ظاهرية، وهي الحالات الافتراضية للخدمات السحابية والأجهزة الظاهرية الكلاسيكية، يجب وجود منطق إضافي لاكتشاف عنوان IP المراد استخدامه. لمعرفة كيفية اكتشاف نقطة نهاية المضيف، راجع هذا النموذج.
توفر الإصدار والمنطقة
يتم إصدار خدمة الأحداث المجدولة. الإصدارات إلزامية. الإصدار الحالي هو 2020-07-01.
| إصدار | نوع الإصدار | المناطق | ملاحظات الإصدار |
|---|---|---|---|
| 2020-07-01 | التوفر العام | الكل | |
| 2019-08-01 | التوفر العام | الكل | |
| 2019-04-01 | التوفر العام | الكل | |
| 2019-01-01 | التوفر العام | الكل | |
| 2017-11-01 | التوفر العام | الكل | |
| 2017-08-01 | التوفر العام | الكل | |
| 2017-03-01 | معاينة | الكل |
ملاحظة
تم دعم الإصدارات الأولية السابقة للأحداث المجدولة {latest} كإصدار واجهة برمجة التطبيقات. لم يعد هذا التنسيق مدعومًا، وسيتم إهماله في المستقبل.
تمكين الأحداث المجدولة وتعطيلها
يتم تمكين الأحداث المجدولة لخدمتك في المرة الأولى التي تقدم فيها طلبًا للأحداث. يجب أن تتوقع استجابة متأخرة في استدعائك الأول لمدة تصل إلى دقيقتين.
يتم تعطيل الأحداث المجدولة لخدمتك إذا لم تقدم طلبًا لمدة 24 ساعة.
الصيانة التي يبدأها المستخدم
تؤدي صيانة الأجهزة الظاهرية التي يبدأها المستخدم عبر مدخل Azure، أو واجهة برمجة التطبيقات، أو CLI، أو PowerShell إلى حدث مجدول. يمكنك بعد ذلك اختبار منطق إعداد الصيانة في تطبيقك، ويمكن للتطبيق الخاص بك الاستعداد للصيانة التي يبدأها المستخدم.
إذا قمت بإعادة تشغيل جهاز ظاهري، فستتم جدولة حدث بهذا النوع Reboot. إذا قمت بإعادة توزيع جهاز ظاهري، فستتم جدولة حدث بهذا النوع Redeploy. عادة ما يمكن الموافقة على الأحداث ذات مصدر حدث المستخدم على الفور لتجنب تأخير الإجراءات التي بدأها المستخدم.
استخدام API
الرؤوس
عند الاستعلام عن خدمة بيانات التعريف، يجب عليك توفير العنوان Metadata:true للتأكد من عدم إعادة توجيه الطلب عن غير قصد. العنوان Metadata:true مطلوب لجميع طلبات الأحداث المجدولة. يؤدي عدم تضمين العنوان في الطلب إلى استجابة "طلب غير صحيح" من خدمة بيانات التعريف.
الاستعلام عن الأحداث
يمكنك الاستعلام عن الأحداث المجدولة عن طريق إجراء الاستدعاء التالي:
عينة Bash
curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
نموذج PowerShell
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01" | ConvertTo-Json -Depth 64
عينة Python
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
تحتوي الاستجابة على صفيف من الأحداث المجدولة. يعني الصفيف الفارغ أنه لا توجد أحداث مجدولة حاليًا. في حالة وجود أحداث مجدولة، تحتوي الاستجابة على صفيف من الأحداث.
{
"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},
}
]
}
خصائص الحدث
| الخاصية | الوصف |
|---|---|
| تجسيد المستند | عدد صحيح يتزايد عند تغيير صفيف الأحداث. تحتوي المستندات ذات نفس التجسد على نفس معلومات الحدث، وستتم زيادة التجسيد عند تغيير حدث. |
| EventId | معرف فريد عمومي لهذا الحدث. مثال:
|
| EventType | التأثير على أسباب هذا الحدث. قيم:
|
| ResourceType | نوع المورد الذي يؤثر عليه هذا الحدث. قيم:
|
| الموارد | قائمة الموارد التي يؤثر عليها هذا الحدث. من المؤكد أن القائمة تحتوي على أجهزة من مجال تحديث واحد على الأكثر، ولكنها قد لا تحتوي على كافة الأجهزة الموجودة في UD. مثال:
|
| EventStatus | حالة هذا الحدث. قيم:
Completed أو حالة مماثلة على الإطلاق. لم يعد يتم إرجاع الحدث عند الانتهاء من الحدث. |
| NotBefore | الوقت الذي يمكن أن يبدأ بعده هذا الحدث. يضمن عدم بدء الحدث قبل هذا الوقت. سيكون فارغًا إذا تم بالفعل بدء الحدث مثال:
|
| الوصف | وصف هذا الحدث. مثال:
|
| EventSource | المنشئ للحدث. مثال:
|
| DurationInSeconds | المدة المتوقعة للانقطاع الناجم عن الحدث. مثال:
|
جدولة الأحداث
تتم جدولة كل حدث بحد أدنى من الوقت في المستقبل بناء على نوع الحدث. تنعكس هذه المرة في خاصية NotBefore للحدث.
| EventType | الحد الأدنى للإشعار |
|---|---|
| تجميد | 15 minutes |
| إعادة التشغيل | 15 minutes |
| إعادة التوزيع | 10 دقائق |
| استباق | 30 seconds |
| إنهاء | قابلية تكوين المستخدم: 5 إلى 15 دقيقة |
ملاحظة
في بعض الحالات، يكون Azure قادرًا على التنبؤ بفشل المضيف بسبب الأجهزة المتدهورة، وسيحاول التخفيف من تعطل الخدمة عن طريق جدولة الترحيل. ستتلقى الأجهزة الظاهرية المتأثرة حدثًا مجدولاً مع NotBefore عادة ما يكون بضعة أيام في المستقبل. يختلف الوقت الفعلي اعتمادًا على تقييم مخاطر الفشل المتوقع. يحاول Azure منح إشعارًا مسبقًا قبل 7 أيام عندما يكون ذلك ممكنا، ولكن الوقت الفعلي يختلف وقد يكون أصغر إذا كان التنبؤ هو أن هناك فرصة كبيرة لفشل الأجهزة قريبًا. لتقليل المخاطر على الخدمة، وفي حالة فشل الجهاز قبل بدء النظام الترحيل، نوصي بإعادة توزيع الجهاز الظاهري في أقرب وقت ممكن.
ملاحظة
في حالة تعرض العقدة المضيفة لفشل في الأجهزة، سيتجاوز Azure الحد الأدنى لفترة الإشعار ويبدأ على الفور عملية الاسترداد للأجهزة الظاهرية المتأثرة. وهذا يقلل من وقت الاسترداد في حالة عدم تمكن الأجهزة الظاهرية المتأثرة من الاستجابة. أثناء عملية الاسترداد، سيتم إنشاء حدث لجميع الأجهزة الظاهرية المتأثرة باستخدام EventType = Reboot وEventStatus = Started.
معدل الاقتراع
يمكنك استقصاء نقطة النهاية للتحديثات بشكل متكرر أو غير متكرر كما تريد. ومع ذلك، كلما طالت الفترة الزمنية بين الطلبات، زاد الوقت الذي قد تخسره للتفاعل مع حدث قادم. تحتوي معظم الأحداث على إشعار مسبق من 5 إلى 15 دقيقة، على الرغم من أنه في بعض الحالات قد يكون الإشعار المسبق أقل من 30 ثانية. للتأكد من أن لديك أكبر قدر ممكن من الوقت لاتخاذ إجراءات تخفيف، نوصيك باستطلاع رأي الخدمة مرة واحدة في الثانية.
بدء حدث
بعد أن تعلم بحدث قادم وتنتهي من منطقك لإيقاف التشغيل السريع، يمكنك الموافقة على الحدث المتميز عن طريق إجراء استدعاء POST إلى خدمة بيانات التعريف باستخدام EventId. يشير هذا الاستدعاء إلى Azure إلى أنه يمكنه تقصير الحد الأدنى من وقت الإعلام (عندما يكون ذلك ممكنًا). قد لا يبدأ الحدث مباشرة عند الموافقة، في بعض الحالات سيطلب Azure موافقة جميع الأجهزة الظاهرية المستضافة على العقدة قبل المتابعة مع الحدث.
من المتوقع أن تكون عينة JSON التالية في نص الطلب POST. يجب أن يحتوي الطلب على قائمة بـ StartRequests. يحتوي كل StartRequest على EventId للحدث الذي تريد تسريعه:
{
"StartRequests" : [
{
"EventId": {EventId}
}
]
}
سترجع الخدمة دائمًا رمز نجاح 200 في حالة توفر معرف حدث صالح، حتى إذا تمت بالفعل الموافقة عليه من قِبل جهاز ظاهري مختلف. يشير رمز الخطأ 400 إلى أن رأس الطلب أو البيانات الأساسية قد تم تكوينها بشكل غير صحيح.
عينة Bash
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
نموذج PowerShell
Invoke-RestMethod -Headers @{"Metadata" = "true"} -Method POST -body '{"StartRequests": [{"EventId": "5DD55B64-45AD-49D3-BBC9-F57D4EA97BD7"}]}' -Uri http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01 | ConvertTo-Json -Depth 64
عينة Python
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
ملاحظة
يسمح الإقرار بحدث ما بالمضي قدمًا في الحدث لجميع Resources في الحدث، وليس فقط الجهاز الظاهري الذي يقر بالحدث. لذلك، يمكنك اختيار انتخاب قائد لتنسيق الإقرار، والذي قد يكون بسيطًا مثل الجهاز الأول في المجال Resources.
أمثلة على الاستجابات
فيما يلي مثال على سلسلة من الأحداث التي شاهدها جهازان ظاهريان تم ترحيلهما مباشرة إلى عقدة أخرى.
يتغير DocumentIncarnation كل مرة توجد فيها معلومات جديدة في Events. ومن شأن الموافقة على الحدث أن يسمح بمتابعة التجميد لكل من WestNO_0 وWestNO_1. يشير DurationInSeconds من -1 إلى أن النظام الأساسي لا يعرف المدة التي ستستغرقها العملية.
{
"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": -1
}
]
}
{
"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": -1
}
]
}
{
"DocumentIncarnation": 4,
"Events": [
]
}
عينة Python
يقوم النموذج التالي بالاستعلام عن خدمة بيانات التعريف للأحداث المجدولة والموافقة على كل حدث قائم:
#!/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 (eg. 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()
الخطوات التالية
- راجع نماذج التعليمات البرمجية للأحداث المجدولة في مستودع GitHub للأحداث المجدولة لبيانات تعريف مثيل Azure.
- راجع نماذج التعليمات البرمجية لأحداث Node.js المجدولة في مستودع Azure Samples GitHub.
- اقرأ المزيد حول واجهات برمجة التطبيقات المتوفرة في خدمة بيانات تعريف المثيل.
- تعرف على الصيانة المخططة لأجهزة Windows الظاهرية في Azure.
- تعرف على كيفية مراقبة الأحداث المجدولة لأجهزتك الظاهرية من خلال Log Analytics.
- تعرف على كيفية تسجيل الأحداث المجدولة باستخدام مركز أحداث Azure في مستودع Azure Samples GitHub.