Pengenalan Penskalaan Otomatis

Penskalaan otomatis adalah kemampuan lain dari Service Fabric untuk menskalakan layanan Anda secara dinamis berdasarkan beban yang dilaporkan layanan, atau berdasarkan penggunaan sumber daya mereka. Penskalaan otomatis memberikan elastisitas yang besar dan memungkinkan provisi instans tambahan atau partisi layanan Anda sesuai permintaan. Seluruh proses penskalaan otomatis otomatis dan transparan, dan setelah Anda menyiapkan kebijakan Anda pada layanan, tidak perlu operasi penskalaan manual di tingkat layanan. Penskalaan otomatis dapat diaktifkan pada waktu pembuatan layanan, atau kapan saja dengan memperbarui layanan.

Skenario umum di mana penskalakan otomatis berguna adalah ketika beban pada layanan tertentu bervariasi dari waktu ke waktu. Misalnya, layanan seperti gateway dapat menskalakan berdasarkan jumlah sumber daya yang diperlukan untuk menangani permintaan masuk. Mari kita bahas contoh seperti apa aturan penskalaan itu:

  • Jika semua instans gateway saya rata-rata menggunakan lebih dari dua inti, maka perluas skala layanan gateway dengan menambahkan satu instans lagi. Lakukan penambahan ini setiap jam, tetapi tidak pernah memiliki lebih dari tujuh instans secara total.
  • Jika semua instans gateway saya rata-rata menggunakan kurang dari 0,5 core, skalakan layanan dengan menghapus satu instans. Lakukan penghapusan ini setiap jam, tetapi tidak pernah memiliki kurang dari tiga instans secara total.

Penskalaan otomatis didukung untuk kontainer dan layanan Service Fabric reguler. Untuk menggunakan penskalaan otomatis, Anda harus menjalankan versi 6.2 atau yang lebih baru dari runtime Service Fabric.

Artikel ini selanjutnya akan menjelaskan kebijakan penskalaan, cara mengaktifkan atau menonaktifkan penskalaan otomatis, dan memberikan contoh tentang cara menggunakan fitur ini.

Menjelaskan penskalaan otomatis

Kebijakan penskalaan otomatis dapat ditentukan untuk setiap layanan dalam kluster Service Fabric. Setiap kebijakan penskalaan terdiri dari dua bagian:

  • Pemicu penskalaan menjelaskan kapan penskalaan layanan dilakukan. Kondisi yang ditentukan dalam pemicu diperiksa secara berkala untuk menentukan apakah layanan harus diskalakan atau tidak.

  • Mekanisme penskalakan menjelaskan bagaimana penskalakan dilakukan saat dipicu. Mekanisme hanya diterapkan ketika kondisi dari pemicu terpenuhi.

Semua pemicu yang saat ini didukung berfungsi baik dengan metrik beban logis, atau dengan metrik fisik seperti CPU atau penggunaan memori. Bagaimanapun, Service Fabric memantau beban yang dilaporkan untuk metrik, dan mengevaluasi pemicu secara berkala untuk menentukan apakah penskalaan diperlukan.

Ada dua mekanisme yang saat ini didukung untuk penskalaan otomatis. Mekanisme yang pertama dimaksudkan untuk layanan tanpa status atau untuk kontainer di mana penskalaan otomatis dilakukan dengan menambahkan atau menghapus instans. Untuk layanan berstatus dan tanpa status, penskalaan otomatis juga dapat dilakukan dengan menambahkan atau menghapus partisi layanan yang diberi nama.

Catatan

Saat ini hanya ada dukungan untuk satu kebijakan penskalaan per layanan, dan hanya satu pemicu penskalaan per kebijakan penskalaan.

Pemicu beban partisi rata-rata dengan penskalaan berbasis instans

Jenis pemicu pertama didasarkan pada beban instans dalam partisi layanan tanpa status. Beban metrik pertama kali diproses untuk mendapatkan beban untuk setiap instans partisi, lalu nilai-nilai ini dirata-ratakan di semua instans partisi. Ada tiga faktor yang menentukan kapan layanan diskalakan:

  • Ambang beban yang lebih rendah adalah nilai yang menentukan kapan layanan diskalakan. Jika beban rata-rata semua instans partisi lebih rendah dari nilai ini, maka layanan diskalakan masuk.
  • Ambang beban atas adalah nilai yang menentukan kapan layanan diskalakan. Jika beban rata-rata semua instans partisi lebih tinggi dari nilai ini, maka layanan diskalakan.
  • Interval penskalakan menentukan seberapa sering pemicu diperiksa. Setelah pemicu diperiksa, jika penskalakan diperlukan, mekanisme diterapkan. Jika penskalakan tidak diperlukan, maka tidak ada tindakan yang diambil. Dalam kedua kasus, pemicu tidak diperiksa lagi sebelum interval penskalakan kedaluwarsa lagi.

Pemicu ini hanya dapat digunakan dengan layanan tanpa status (baik kontainer tanpa status atau layanan Service Fabric). Jika layanan memiliki beberapa partisi, pemicu dievaluasi untuk setiap partisi secara terpisah, dan setiap partisi memiliki mekanisme yang ditentukan yang diterapkan secara independen. Oleh karena itu, perilaku penskalaan partisi layanan dapat bervariasi berdasarkan bebannya. Ada kemungkinan bahwa beberapa partisi layanan diluaskan skalanya, sementara beberapa lainnya diskalakan. Beberapa partisi mungkin tidak diskalakan sama sekali secara bersamaan.

Satu-satunya mekanisme yang dapat digunakan dengan pemicu ini adalah PartitionInstanceCountScaleMechanism. Ada tiga faktor yang menentukan bagaimana mekanisme ini diterapkan:

  • Kenaikan Skala menentukan berapa banyak instans yang ditambahkan atau dihapus saat mekanisme dipicu.
  • Jumlah Instans Maksimum menentukan batas atas untuk penskalaan. Jika jumlah instans partisi mencapai batas ini, maka layanan diskalakan, terlepas dari bebannya. Dimungkinkan untuk menghilangkan batas ini dengan menentukan nilai -1, dan dalam hal ini layanan diskalakan sebanyak mungkin (batasnya adalah jumlah simpul yang tersedia dalam kluster).
  • Jumlah Instans Minimum menentukan batas bawah untuk penskalaan. Jika jumlah instans partisi mencapai batas ini, maka layanan tidak diskalakan terlepas dari bebannya.

Mengatur kebijakan penskalaan otomatis untuk penskalaan berbasis instans

Menggunakan manifes aplikasi

<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>

Menggunakan 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);

Menggunakan 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

Pemicu beban layanan rata-rata dengan penskalaan berbasis partisi

Pemicu kedua didasarkan pada beban semua partisi dari satu layanan. Beban metrik pertama kali diproses untuk mendapatkan beban untuk setiap replika atau instans partisi. Untuk layanan berstatus, beban partisi dianggap sebagai beban replika utama, sementara untuk layanan tanpa status beban partisi adalah beban rata-rata dari semua instans partisi. Nilai-nilai ini rata-rata di semua partisi layanan, dan nilai ini digunakan untuk memicu penskalaan otomatis. Sama seperti mekanisme sebelumnya, ada tiga faktor yang menentukan kapan layanan diskalakan:

  • Ambang beban yang lebih rendah adalah nilai yang menentukan kapan layanan diskalakan. Jika beban rata-rata semua partisi layanan lebih rendah dari nilai ini, maka layanan diskalakan masuk.
  • Ambang beban atas adalah nilai yang menentukan kapan layanan diskalakan. Jika beban rata-rata semua partisi layanan lebih tinggi dari nilai ini, maka layanan diskalakan.
  • Interval penskalakan menentukan seberapa sering pemicu diperiksa. Setelah pemicu diperiksa, jika penskalakan diperlukan, mekanisme diterapkan. Jika penskalakan tidak diperlukan, maka tidak ada tindakan yang diambil. Dalam kedua kasus, pemicu diperiksa lagi sebelum interval penskalakan kedaluwarsa lagi.

Pemicu ini dapat digunakan baik dengan layanan berstatus maupun tanpa status. Satu-satunya mekanisme yang dapat digunakan dengan pemicu ini adalah AddRemoveIncrementalNamedPartitionScalingMechanism. Ketika layanan diluaskan skalanya maka partisi baru ditambahkan, dan ketika layanan disempitkan skalanya di salah satu partisi yang ada dihapus. Ada batasan yang diperiksa saat layanan dibuat atau diperbarui dan pembuatan/pembaruan layanan gagal jika kondisi ini tidak terpenuhi:

  • Skema partisi bernama harus digunakan untuk layanan.
  • Nama partisi harus berupa angka bilangan bulat berturut-turut, seperti "0," "1," ...
  • Nama partisi pertama harus "0."

Misalnya, jika layanan awalnya dibuat dengan tiga partisi, satu-satunya kemungkinan yang valid untuk nama partisi adalah "0", "1", dan "2".

Operasi penskalakan otomatis aktual yang dilakukan menghormati skema penamaan ini juga:

  • Jika partisi layanan saat ini diberi nama "0," "1" dan "2," maka partisi yang ditambahkan untuk penskalaan keluar diberi nama "3."
  • Jika partisi layanan saat ini diberi nama "0," "1" dan "2," maka partisi yang dihapus untuk penskalaan adalah partisi dengan nama "2."

Sama seperti mekanisme yang menggunakan penskalaan dengan menambahkan atau menghapus instans, ada tiga parameter yang menentukan bagaimana mekanisme ini diterapkan:

  • Kenaikan Skala menentukan berapa banyak partisi yang ditambahkan atau dihapus saat mekanisme dipicu.
  • Jumlah Partisi Maksimum menentukan batas atas untuk penskalaan. Jika jumlah partisi layanan mencapai batas ini, maka layanan tidak diskalakan, terlepas dari bebannya. Dimungkinkan untuk menghilangkan batas ini dengan menentukan nilai -1, dan dalam hal ini layanan diskalakan sebanyak mungkin (batasnya adalah kapasitas aktual kluster).
  • Jumlah Partisi Minimum menentukan batas bawah untuk penskalaan. Jika jumlah partisi layanan mencapai batas ini, maka layanan tidak diskalakan terlepas dari bebannya.

Peringatan

Ketika AddRemoveIncrementalNamedPartitionScalingMechanism digunakan dengan layanan berstatus, Service Fabric akan menambahkan atau menghapus partisi tanpa pemberitahuan atau peringatan. Pembuatan ulang data tidak akan dilakukan saat mekanisme penskalaan dipicu. Dalam hal operasi peluasan skala, partisi baru akan kosong, dan dalam hal skala dalam operasi, partisi akan dihapus bersama dengan semua data yang ada di dalamnya.

Mengatur kebijakan penskalaan otomatis untuk penskalaan berbasis partisi

Menggunakan manifes aplikasi

<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>

Menggunakan 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);

Menggunakan 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

Penskalakan Otomatis Berdasarkan Sumber Daya

Untuk mengaktifkan layanan monitor sumber daya untuk menskalakan berdasarkan sumber daya aktual, Anda dapat menambahkan ResourceMonitorService fitur sebagai berikut:

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

Service Fabric mendukung tata kelola CPU dan memori menggunakan dua metrik bawaan: servicefabric:/_CpuCores untuk CPU dan servicefabric:/_MemoryInMB untuk memori. Resource Monitor Service bertanggung jawab untuk melacak penggunaan CPU dan memori dan memperbarui Cluster Resource Manager dengan penggunaan sumber daya saat ini. Layanan ini menerapkan rata-rata bergerak tertimbang untuk memperhitungkan potensi lonjakan berumur pendek. Pemantauan sumber daya didukung untuk aplikasi kontainer dan nonkontainer di Windows dan untuk aplikasi kontainer di Linux.

Catatan

Konsumsi CPU dan memori yang dipantau di Resource Monitor Service dan diperbarui ke Cluster Resource Manager tidak memengaruhi proses pengambilan keputusan apa pun di luar penskalaan otomatis. Jika tata kelola sumber daya diperlukan, tata kelola tersebut dapat dikonfigurasi tanpa mengganggu fungsionalitas penskalaan otomatis, dan sebaliknya.

Penting

Penskalaan otomatis berbasis sumber daya hanya didukung untuk layanan yang diaktifkan dalam model proses eksklusif.

Langkah berikutnya

Pelajari selengkapnya tentang skalabilitas aplikasi.