مقدمة في التحجيم التلقائي

التحجيم التلقائي هو قدرة أخرى من Service Fabric لتوسيع نطاق خدماتك ديناميكيا استنادا إلى الحمل الذي تقوم الخدمات بالإبلاغ عنه، أو استنادا إلى استخدامها للموارد. يوفر التحجيم التلقائي مرونة كبيرة ويتيح توفير مثيلات إضافية أو أقسام للخدمة عند الطلب. عملية التحجيم التلقائي بأكملها تلقائية وشفافة، وبمجرد إعداد النهج الخاصة بك على خدمة ما، لن تكون هناك حاجة لعمليات التحجيم اليدوي على مستوى الخدمة. يمكن تشغيل التحجيم التلقائي إما في وقت إنشاء الخدمة، أو في أي وقت عن طريق تحديث الخدمة.

السيناريو الشائع حيث يكون التحجيم التلقائي مفيدا هو عندما يختلف التحميل على خدمة معينة بمرور الوقت. على سبيل المثال، يمكن لخدمة مثل البوابة أن تتوسع بناءً على كمية الموارد اللازمة للتعامل مع الطلبات الواردة. دعنا نلقِ نظرة على مثال لما يمكن أن تبدو عليه هذه القواعد للتحجيم:

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

التحجيم التلقائي مدعوم لكل من الحاويات وخدمات Service Fabric العادية. من أجل استخدام التحجيم التلقائي، يجب أن تعمل على الإصدار 6.2 أو أعلى من وقت تشغيل Service Fabric.

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

وصف التحجيم التلقائي

يمكن تحديد سياسات التحجيم التلقائي لكل خدمة في نظام مجموعة Service Fabric. تتكون كل سياسة تحجيم من جزأين:

  • يصف مشغل التحجيم عند تنفيذ تحجيم الخدمة. يتم فحص الشروط التي تم تحديدها في المشغل بشكل دوري لتحديد ما إذا كان ينبغي تحجيم الخدمة أم لا.

  • تصف آلية التحجيم كيفية تنفيذ التحجيم عند تشغيله. يتم تطبيق الآلية فقط عند استيفاء شروط المشغل.

تعمل جميع المشغلات المدعومة حالياً إما مع مقاييس الحمل المنطقي، أو مع المقاييس المادية مثل استخدام CPU أو الذاكرة. وفي كلتا الحالتين، يراقب Service Fabric الحمل المبلغ عنه للمقياس، ويقيم المشغل بشكل دوري لتحديد ما إذا كانت هناك حاجة إلى التحجيم.

هناك آليتان مدعومتان حالياً للتحجيم التلقائي. الأول مخصص للخدمات عديمة الحالة أو للحاويات حيث يتم إجراء التحجيم التلقائي عن طريق إضافة أو إزالة مثيلات. لكل من الخدمات ذات الحالة وعديمة الحالة، يمكن أيضاً إجراء التحجيم التلقائي عن طريق إضافة أو إزالة أقسام مسماة من الخدمة.

إشعار

يوجد حالياً دعم لنهج تحجيم واحدة فقط لكل خدمة، ومشغل تحجيم واحد فقط لكل سياسة تحجيم.

مشغل متوسط​تحميل القسم مع التحجيم المستند إلى المثيل

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

  • حد التحميل الأدنى هو قيمة تحدد وقت تحجيم الخدمة. إذا كان متوسط تحميل جميع مثيلات الأقسام أقل من هذه القيمة، فسيتم تحجيم الخدمة.
  • حد التحميل العلوي هو قيمة تحدد وقت توسيع الخدمة. إذا كان متوسط تحميل جميع مثيلات القسم أعلى من هذه القيمة، فسيتم توسيع نطاق الخدمة.
  • يحدد الفاصل الزمني للتحجيم عدد المرات التي يتم فيها التحقق من المشغل. بمجرد التحقق من المشغل، إذا كانت هناك حاجة إلى التحجيم، يتم تطبيق الآلية. إذا لم تكن هناك حاجة إلى التحجيم، فلن يتم اتخاذ أي إجراء. في كلتا الحالتين، لا يتم التحقق من المشغل مرة أخرى قبل انتهاء صلاحية الفاصل الزمني للتحجيم مرة أخرى.

يمكن استخدام هذا المشغل فقط مع الخدمات عديمة الحالة (إما حاويات عديمة الحالة أو خدمات Service Fabric). في حالة وجود أقسام متعددة للخدمة، يتم تقييم المشغل لكل قسم على حدة، ويكون لكل قسم الآلية المحددة المطبقة عليه بشكل مستقل. ومن ثم، يمكن أن تختلف سلوكيات التحجيم لأقسام الخدمة بناء على تحميلها. من الممكن أن يتم توسيع بعض أقسام الخدمة، بينما يتم توسيع بعض الأقسام الأخرى. قد لا يتم تحجيم بعض الأقسام على الإطلاق في نفس الوقت.

الآلية الوحيدة التي يمكن استخدامها مع هذا المشغل هي PartitionInstanceCountScaleMechanism. هناك ثلاثة عوامل تحدد كيفية تطبيق هذه الآلية:

  • تحدد زيادة المقياس عدد المثيلات التي تتم إضافتها أو إزالتها عند تشغيل الآلية.
  • يحددMaximum Instance Count الحد الأعلى للتحجيم. إذا وصل عدد مثيلات القسم إلى هذا الحد، فسيتم توسيع الخدمة، بغض النظر عن الحمل. من الممكن حذف هذا الحد عن طريق تحديد قيمة -1، وفي هذه الحالة يتم توسيع الخدمة قدر الإمكان (الحد هو عدد العقد المتوفرة في نظام المجموعة).
  • يحدد Minimum Instance Count الحد الأدنى للتحجيم. إذا وصل عدد مثيلات القسم إلى هذا الحد، فلن يتم قياس الخدمة بغض النظر عن الحمل.

تعيين نهج التحجيم التلقائي للتحجيم المستند إلى المثيل

استخدام بيان التطبيق

<LoadMetrics>
<LoadMetric Name="MetricB" Weight="High"/>
</LoadMetrics>
<ServiceScalingPolicies>
<ScalingPolicy>
    <AveragePartitionLoadScalingTrigger MetricName="MetricB" LowerLoadThreshold="1" UpperLoadThreshold="2" ScaleIntervalInSeconds="100"/>
    <InstanceCountScalingMechanism MinInstanceCount="3" MaxInstanceCount="4" ScaleIncrement="1"/>
</ScalingPolicy>
</ServiceScalingPolicies>

استخدام C# API

FabricClient fabricClient = new FabricClient();
StatelessServiceDescription serviceDescription = new StatelessServiceDescription();
//set up the rest of the ServiceDescription
AveragePartitionLoadScalingTrigger trigger = new AveragePartitionLoadScalingTrigger();
PartitionInstanceCountScaleMechanism mechanism = new PartitionInstanceCountScaleMechanism();
mechanism.MaxInstanceCount = 3;
mechanism.MinInstanceCount = 1;
mechanism.ScaleIncrement = 1;
trigger.MetricName = "servicefabric:/_CpuCores";
trigger.ScaleInterval = TimeSpan.FromMinutes(20);
trigger.LowerLoadThreshold = 1.0;
trigger.UpperLoadThreshold = 2.0;
ScalingPolicyDescription policy = new ScalingPolicyDescription(mechanism, trigger);
serviceDescription.ScalingPolicies.Add(policy);
//as we are using scaling on a resource this must be exclusive service
//also resource monitor service needs to be enabled
serviceDescription.ServicePackageActivationMode = ServicePackageActivationMode.ExclusiveProcess
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

استخدام PowerShell

$mechanism = New-Object -TypeName System.Fabric.Description.PartitionInstanceCountScaleMechanism
$mechanism.MinInstanceCount = 1
$mechanism.MaxInstanceCount = 6
$mechanism.ScaleIncrement = 2
$trigger = New-Object -TypeName System.Fabric.Description.AveragePartitionLoadScalingTrigger
$trigger.MetricName = "servicefabric:/_CpuCores"
$trigger.LowerLoadThreshold = 0.3
$trigger.UpperLoadThreshold = 0.8
$trigger.ScaleInterval = New-TimeSpan -Minutes 10
$scalingpolicy = New-Object -TypeName System.Fabric.Description.ScalingPolicyDescription
$scalingpolicy.ScalingMechanism = $mechanism
$scalingpolicy.ScalingTrigger = $trigger
$scalingpolicies = New-Object 'System.Collections.Generic.List[System.Fabric.Description.ScalingPolicyDescription]'
$scalingpolicies.Add($scalingpolicy)
#as we are using scaling on a resource this must be exclusive service
#also resource monitor service needs to be enabled
Update-ServiceFabricService -Stateless -ServiceName "fabric:/AppName/ServiceName" -ScalingPolicies $scalingpolicies

مشغل متوسط​تحميل الخدمة مع تحجيم قائم على القسم

يعتمد المشغل الثاني على حمل جميع أقسام خدمة واحدة. يتم تسوية الأحمال المترية أولاً للحصول على الحمل لكل نسخة مماثلة أو مثيل للقسم. بالنسبة للخدمات ذات الحالة الخاصة، يعتبر تحميل القسم هو تحميل النسخة المماثلة الأساسية، بينما بالنسبة للخدمات عديمة الحالة، يكون تحميل القسم هو متوسط​تحميل جميع مثيلات القسم. يتم حساب متوسط​هذه القيم عبر جميع أقسام الخدمة، ويتم استخدام هذه القيمة لتشغيل التحجيم التلقائي. كما هو الحال في الآلية السابقة، هناك ثلاثة عوامل تحدد متى يتم تحجيم الخدمة:

  • حد التحميل الأدنى هو قيمة تحدد وقت تحجيم الخدمة. إذا كان متوسط تحميل جميع أقسام الخدمة أقل من هذه القيمة، فسيتم تحجيم الخدمة.
  • حد التحميل العلوي هو قيمة تحدد وقت توسيع الخدمة. إذا كان متوسط تحميل جميع أقسام الخدمة أعلى من هذه القيمة، فسيتم توسيع نطاق الخدمة.
  • يحدد الفاصل الزمني للتحجيم عدد المرات التي يتم فيها التحقق من المشغل. بمجرد التحقق من المشغل، إذا كانت هناك حاجة إلى التحجيم، يتم تطبيق الآلية. إذا لم تكن هناك حاجة إلى التحجيم، فلن يتم اتخاذ أي إجراء. في كلتا الحالتين، يتم التحقق من المشغل مرة أخرى قبل انتهاء صلاحية الفاصل الزمني للتحجيم مرة أخرى.

يمكن استخدام هذا المشغل مع كل من الخدمات ذات الحالة وعديمة الحالة. الآلية الوحيدة التي يمكن استخدامها مع هذا المشغل هي AddRemoveIncrementalNamedPartitionScalingMechanism. عندما يتم توسيع نطاق الخدمة، تتم إضافة قسم جديد، وعندما يتم تقليص نطاق الخدمة في أحد الأقسام الموجودة، تتم إزالته. هناك قيود يتم التحقق منها عند إنشاء الخدمة أو تحديثها وفشل إنشاء/تحديث الخدمة إذا لم يتم استيفاء هذه الشروط:

  • يجب استخدام نظام التقسيم المحدد للخدمة.
  • يجب أن تكون أسماء الأقسام أرقاما صحيحة متتالية، مثل "0"، "1"...
  • يجب أن يكون اسم القسم الأول "0".

على سبيل المثال، إذا تم إنشاء خدمة مبدئياً بثلاثة أقسام، فإن الاحتمال الصالح الوحيد لأسماء الأقسام هو "0" و"1" و"2".

تحترم عملية التحجيم التلقائي الفعلية التي يتم تنفيذها نظام التسمية هذا أيضا:

  • إذا كانت الأقسام الحالية للخدمة تسمى "0" و"1" و"2"، فإن القسم المضاف للتحجيم يسمى "3".
  • إذا كانت الأقسام الحالية للخدمة تسمى "0" و"1" و"2"، فإن القسم الذي تمت إزالته للتحجيم هو القسم الذي يحمل الاسم "2".

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

  • تحدد زيادة المقياس عدد الأقسام التي تمت إضافتها أو إزالتها عند تشغيل الآلية.
  • يحدد Maximum Partition Count الحد الأعلى للتحجيم. إذا وصل عدد أقسام الخدمة إلى هذا الحد، فلن يتم توسيع نطاق الخدمة، بغض النظر عن الحمل. من الممكن حذف هذا الحد عن طريق تحديد قيمة -1، وفي هذه الحالة يتم توسيع الخدمة قدر الإمكان (الحد هو السعة الفعلية للمجموعة).
  • يحدد الحد الأدنى لعدد الأقسام الحد الأدنى للتحجيم. إذا وصل عدد أقسام الخدمة إلى هذا الحد، فلن يتم تحجيم الخدمة بغض النظر عن الحمل.

تحذير

عند استخدام AddRemoveIncrementalNamedPartitionScalingMechanism مع الخدمات ذات الحالة، فإن Service Fabric ستضيف أو تزيل الأقسام دون إصدار إخطار أو تحذير. لن يتم إجراء إعادة تقسيم البيانات عند تشغيل آلية التحجيم. في حالة عملية توسيع النطاق، ستكون الأقسام الجديدة فارغة، وفي حالة عملية تقليص النطاق، سيتم حذف القسم مع جميع البيانات التي يحتوي عليها.

وضع سياسة التحجيم التلقائي للقسم القائم على التحجيم

استخدام بيان التطبيق

<NamedPartition>
    <Partition Name="0" />
</NamedPartition>
<ServiceScalingPolicies>
    <ScalingPolicy>
        <AverageServiceLoadScalingTrigger MetricName="servicefabric:/_MemoryInMB" LowerLoadThreshold="300" UpperLoadThreshold="500" ScaleIntervalInSeconds="600"/>
        <AddRemoveIncrementalNamedPartitionScalingMechanism MinPartitionCount="1" MaxPartitionCount="3" ScaleIncrement="1"/>
    </ScalingPolicy>
</ServiceScalingPolicies>

استخدام C# API

FabricClient fabricClient = new FabricClient();
StatefulServiceUpdateDescription serviceUpdate = new StatefulServiceUpdateDescription();
AveragePartitionLoadScalingTrigger trigger = new AverageServiceLoadScalingTrigger();
PartitionInstanceCountScaleMechanism mechanism = new AddRemoveIncrementalNamedPartitionScalingMechanism();
mechanism.MaxPartitionCount = 4;
mechanism.MinPartitionCount = 1;
mechanism.ScaleIncrement = 1;
//expecting that the service already has metric NumberOfConnections
trigger.MetricName = "NumberOfConnections";
trigger.ScaleInterval = TimeSpan.FromMinutes(15);
trigger.LowerLoadThreshold = 10000;
trigger.UpperLoadThreshold = 20000;
ScalingPolicyDescription policy = new ScalingPolicyDescription(mechanism, trigger);
serviceUpdate.ScalingPolicies = new List<ScalingPolicyDescription>;
serviceUpdate.ScalingPolicies.Add(policy);
await fabricClient.ServiceManager.UpdateServiceAsync(new Uri("fabric:/AppName/ServiceName"), serviceUpdate);

استخدام PowerShell

$mechanism = New-Object -TypeName System.Fabric.Description.AddRemoveIncrementalNamedPartitionScalingMechanism
$mechanism.MinPartitionCount = 1
$mechanism.MaxPartitionCount = 3
$mechanism.ScaleIncrement = 2
$trigger = New-Object -TypeName System.Fabric.Description.AverageServiceLoadScalingTrigger
$trigger.MetricName = "servicefabric:/_MemoryInMB"
$trigger.LowerLoadThreshold = 5000
$trigger.UpperLoadThreshold = 10000
$trigger.ScaleInterval = New-TimeSpan -Minutes 25
$scalingpolicy = New-Object -TypeName System.Fabric.Description.ScalingPolicyDescription
$scalingpolicy.ScalingMechanism = $mechanism
$scalingpolicy.ScalingTrigger = $trigger
$scalingpolicies = New-Object 'System.Collections.Generic.List[System.Fabric.Description.ScalingPolicyDescription]'
$scalingpolicies.Add($scalingpolicy)
#as we are using scaling on a resource this must be exclusive service
#also resource monitor service needs to be enabled
New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -TargetReplicaSetSize 3 -MinReplicaSetSize 2 -HasPersistedState true -PartitionNames @("0","1") -ServicePackageActivationMode ExclusiveProcess -ScalingPolicies $scalingpolicies

التحجيم التلقائي استنادا إلى الموارد

لتمكين خدمة مراقبة الموارد من التحجيم استنادا إلى الموارد الفعلية، يمكنك إضافة الميزة ResourceMonitorService على النحو التالي:

"fabricSettings": [
...   
],
"addonFeatures": [
    "ResourceMonitorService"
],

يدعم Service Fabric وحدة المعالجة المركزية وإدارة الذاكرة باستخدام مقياسين مضمنين: servicefabric:/_CpuCores لوحدة المعالجة المركزية والذاكرة servicefabric:/_MemoryInMB . خدمة مراقبة الموارد مسؤولة عن تتبع استخدام وحدة المعالجة المركزية والذاكرة وتحديث إدارة موارد نظام المجموعة باستخدام المورد الحالي. تطبق هذه الخدمة متوسط نقل مرجح لحساب الارتفاعات المحتملة قصيرة الأجل. يتم دعم مراقبة الموارد لكل من التطبيقات المعبأة في حاويات وغير المكتوين على Windows والتطبيقات المعبأة في حاويات على Linux.

إشعار

لا يؤثر استهلاك وحدة المعالجة المركزية والذاكرة التي تتم مراقبتها في خدمة مراقبة الموارد والمحدثة إلى Cluster Resource Manager على أي عملية صنع قرار خارج التحجيم التلقائي. إذا كانت هناك حاجة إلى إدارة الموارد، يمكن تكوينها دون التداخل مع وظائف التحجيم التلقائي، والعكس صحيح.

هام

يتم دعم التحجيم التلقائي المستند إلى الموارد فقط للخدمات التي تم تنشيطها في نموذج العملية الحصري.

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

تعرف على المزيد عن قابلية التحجيم التطبيق.