خدمة بيانات تعريف Azure: الأحداث المجدولة لأجهزة Windows الظاهرية

ينطبق على: ✔️ أجهزة Windows الظاهرية ✔️ مجموعات المقاييس المرنة ✔️ مجموعات المقاييس الموحدة

Scheduled Events هي خدمة بيانات تعريف Azure التي تعطي وقت التطبيق الخاص بك للتحضير لصيانة الجهاز الظاهري (VM). حيث توفر معلومات حول أحداث الصيانة القادمة (على سبيل المثال، إعادة التشغيل) بحيث يمكن للتطبيق الخاص بك الاستعداد لها والحد من التعطيل. وهي متاحة لجميع أنواع الأجهزة الظاهرية Azure، بما في ذلك PaaS وIaaS على كل من Windows وLinux.

للحصول على معلومات حول الأحداث المجدولة على Linux، راجع الأحداث المجدولة لأجهزة Linux الظاهرية.

ملاحظة

تتوفر الأحداث المجدولة بشكل عام في جميع مناطق Azure. راجع الإصدار وتوفر المنطقة للحصول على أحدث معلومات الإصدار.

لماذا تستخدم الأحداث المجدولة؟

يمكن للعديد من التطبيقات الاستفادة من الوقت المخصص للتحضير لصيانة الجهاز الظاهري. يمكن استخدام الوقت لتنفيذ مهام خاصة بالتطبيقات تعمل على تحسين التوفر والموثوقية وإمكانية الخدمة، بما في ذلك:

  • نقطة التحقق والاستعادة.
  • استنزاف الاتصال.
  • تجاوز فشل نسخة متماثلة أساسية.
  • إزالة من مجموعة موازنة تحميل.
  • تسجيل الأحداث.
  • إيقاف تشغيل آمن.

باستخدام الأحداث المجدولة، يمكن للتطبيق اكتشاف وقت حدوث الصيانة وتشغيل المهام للحد من تأثيرها.

توفر الأحداث المجدولة الأحداث في حالات الاستخدام التالية:

الأساسيات

تعرض "خدمة بيانات التعريف" معلومات حول تشغيل الأجهزة الظاهرية باستخدام نقطة نهاية 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 التوفر العام الكل
  • دعم مضاف لـ EventSource
  • 2019-04-01 التوفر العام الكل
  • دعم مضاف لوصف الحدث
  • 2019-01-01 التوفر العام الكل
  • دعم مضاف لمجموعات مقياس الجهاز الظاهري EventType "إنهاء"
  • 2017-11-01 التوفر العام الكل
  • دعم مضاف لإخلاء جهاز Spot الظاهري EventType "استباق"
  • 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 معرف فريد عمومي لهذا الحدث.

    مثال:
    • 602d9444-d2cd-49c7-8624-8643e7171297
    EventType التأثير على أسباب هذا الحدث.

    قيم:
    • Freeze: تتم جدولة توقف الجهاز الظاهري مؤقتًا لبضع ثوانٍ. قد يتم تعليق وحدة المعالجة المركزية واتصال الشبكة، ولكن لا يوجد أي تأثير على الذاكرة أو الملفات المفتوحة.
    • Reboot: تمت جدولة الجهاز الظاهري لإعادة التشغيل (يتم فقدان الذاكرة غير الثابتة).
    • Redeploy: تتم جدولة انتقال الجهاز الظاهري إلى عقدة أخرى (يتم فقدان الأقراص سريعة الزوال).
    • Preempt: يتم حذف الجهاز الظاهري Spot (يتم فقدان الأقراص سريعة الزوال). يتم توفير هذا الحدث على أساس أفضل جهد
    • Terminate: تتم جدولة حذف الجهاز الظاهري.
    ResourceType نوع المورد الذي يؤثر عليه هذا الحدث.

    قيم:
    • VirtualMachine
    الموارد قائمة الموارد التي يؤثر عليها هذا الحدث. من المؤكد أن القائمة تحتوي على أجهزة من مجال تحديث واحد على الأكثر، ولكنها قد لا تحتوي على كافة الأجهزة الموجودة في UD.

    مثال:
    • ["FrontEnd_IN_0", "BackEnd_IN_0"]
    EventStatus حالة هذا الحدث.

    قيم:
    • Scheduled: تتم جدولة بدء هذا الحدث بعد الوقت المحدد في الخاصية NotBefore.
    • Started: بدأ هذا الحدث.
    لا يتم توفير أي Completed أو حالة مماثلة على الإطلاق. لم يعد يتم إرجاع الحدث عند الانتهاء من الحدث.
    NotBefore الوقت الذي يمكن أن يبدأ بعده هذا الحدث. يضمن عدم بدء الحدث قبل هذا الوقت. سيكون فارغًا إذا تم بالفعل بدء الحدث

    مثال:
    • الاثنين، 19 سبتمبر 2016 18:29:47 GMT
    الوصف وصف هذا الحدث.

    مثال:
    • يخضع الخادم المضيف للصيانة.
    EventSource المنشئ للحدث.

    مثال:
    • Platform: يبدأ هذا الحدث بواسطة النظام الأساسي.
    • User: يبدأ هذا الحدث بواسطة النظام الأساسي.
    DurationInSeconds المدة المتوقعة للانقطاع الناجم عن الحدث.

    مثال:
    • 9: سيستمر الانقطاع الناجم عن الحدث لمدة 9 ثوانٍ.
    • -1: القيمة الافتراضية المستخدمة إذا كانت مدة التأثير غير معروفة أو غير قابلة للتطبيق.

    جدولة الأحداث

    تتم جدولة كل حدث بحد أدنى من الوقت في المستقبل بناء على نوع الحدث. تنعكس هذه المرة في خاصية 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()
    

    الخطوات التالية