Otomatik Ölçeklendirmeye Giriş

Otomatik ölçeklendirme, Service Fabric'in hizmetlerinizi raporlamakta olduğu yüke veya kaynak kullanımına göre dinamik olarak ölçeklendirmeye yönelik başka bir özelliğidir. Otomatik ölçeklendirme büyük esneklik sağlar ve isteğe bağlı olarak hizmetinizin ek örneklerinin veya bölümlerinin sağlanmasını sağlar. Otomatik ölçeklendirme işleminin tamamı otomatik ve saydamdır ve bir hizmette ilkelerinizi ayarladıktan sonra hizmet düzeyinde el ile ölçeklendirme işlemlerine gerek kalmaz. Otomatik ölçeklendirme, hizmet oluşturma zamanında veya hizmeti güncelleştirerek herhangi bir zamanda açılabilir.

Otomatik ölçeklendirmenin yararlı olduğu yaygın bir senaryo, belirli bir hizmet üzerindeki yükün zaman içinde değişmesidir. Örneğin, ağ geçidi gibi bir hizmet, gelen istekleri işlemek için gereken kaynak miktarına göre ölçeklendirilebilir. Şimdi bu ölçeklendirme kurallarının nasıl görünebileceğine ilişkin bir örneğe göz atalım:

  • Ağ geçidimin tüm örnekleri ortalama olarak ikiden fazla çekirdek kullanıyorsa, bir örnek daha ekleyerek ağ geçidi hizmetinin ölçeğini genişletin. Bu toplamayı saatte bir yapın, ancak toplamda yediden fazla örneğiniz olmaz.
  • Ağ geçidimin tüm örnekleri ortalama olarak 0,5'ten az çekirdek kullanıyorsa, bir örneği kaldırarak hizmetin ölçeğini daraltın. Bu kaldırma işlemini saatte bir yapın, ancak toplamda üçten az örneğiniz olmaz.

Otomatik ölçeklendirme hem kapsayıcılar hem de normal Service Fabric hizmetleri için desteklenir. Otomatik ölçeklendirmeyi kullanmak için Service Fabric çalışma zamanının 6.2 veya sonraki bir sürümünde çalışıyor olmanız gerekir.

Bu makalenin geri kalanında ölçeklendirme ilkeleri, otomatik ölçeklendirmeyi etkinleştirme veya devre dışı bırakma yolları açıklanır ve bu özelliğin nasıl kullanılacağına ilişkin örnekler verilmektedir.

Otomatik ölçeklendirmeyi açıklama

Service Fabric kümesindeki her hizmet için otomatik ölçeklendirme ilkeleri tanımlanabilir. Her ölçeklendirme ilkesi iki bölümden oluşur:

  • Ölçeklendirme tetikleyicisi , hizmetin ne zaman ölçeklendirildiğini açıklar. Tetikleyicide tanımlanan koşullar, bir hizmetin ölçeklendirilip ölçeklendirilmemesi gerektiğini belirlemek için düzenli aralıklarla denetlenmektedir.

  • Ölçeklendirme mekanizması , tetiklendiğinde ölçeklendirmenin nasıl gerçekleştirildiğini açıklar. Mekanizma yalnızca tetikleyicideki koşullar karşılandığında uygulanır.

Şu anda desteklenen tüm tetikleyiciler mantıksal yük ölçümleriyle veya CPU veya bellek kullanımı gibi fiziksel ölçümlerle çalışır. Her iki durumda da Service Fabric ölçüm için bildirilen yükü izler ve ölçeklendirme gerekip gerekmediğini belirlemek için tetikleyiciyi düzenli aralıklarla değerlendirir.

Şu anda otomatik ölçeklendirme için desteklenen iki mekanizma vardır. İlki durum bilgisi olmayan hizmetler veya örnekleri ekleyerek veya kaldırarak otomatik ölçeklendirmenin gerçekleştirildiği kapsayıcılar içindir. Hem durum bilgisi olan hem de durum bilgisi olmayan hizmetler için hizmetin adlandırılmış bölümleri eklenerek veya kaldırılarak otomatik ölçeklendirme de gerçekleştirilebilir.

Not

Şu anda hizmet başına yalnızca bir ölçeklendirme ilkesi ve ölçeklendirme ilkesi başına yalnızca bir ölçeklendirme tetikleyicisi desteği vardır.

Örnek tabanlı ölçeklendirme ile ortalama bölüm yükü tetikleyicisi

İlk tetikleyici türü, durum bilgisi olmayan bir hizmet bölümündeki örneklerin yükünü temel alır. Ölçüm yükleri önce bir bölümün her örneğinin yükünü almak için düzeltilir ve ardından bu değerler bölümün tüm örnekleri arasında ortalaması alınır. Hizmetin ne zaman ölçeklendirileceğini belirleyen üç faktör vardır:

  • Düşük yük eşiği, hizmetin ne zaman ölçeklendirileceğini belirleyen bir değerdir. Bölümlerin tüm örneklerinin ortalama yükü bu değerden düşükse hizmet ölçeği daraltılır.
  • Üst yük eşiği, hizmetin ölçeğinin ne zaman genişletileceğini belirleyen bir değerdir. Bölümün tüm örneklerinin ortalama yükü bu değerden yüksekse hizmetin ölçeği genişletilir.
  • Ölçeklendirme aralığı tetikleyicinin ne sıklıkta denetlendiğini belirler. Tetikleyici denetlendikten sonra ölçeklendirme gerekiyorsa mekanizma uygulanır. Ölçeklendirme gerekli değilse hiçbir işlem yapılmaz. Her iki durumda da ölçeklendirme aralığının süresi yeniden dolmadan tetikleyici yeniden denetlenmiyor.

Bu tetikleyici yalnızca durum bilgisi olmayan hizmetlerle (durum bilgisi olmayan kapsayıcılar veya Service Fabric hizmetleri) kullanılabilir. Bir hizmetin birden çok bölümü olduğunda tetikleyici her bölüm için ayrı olarak değerlendirilir ve her bölüme bağımsız olarak belirtilen mekanizma uygulanır. Bu nedenle, hizmet bölümlerinin ölçeklendirme davranışları yüklerine göre farklılık gösterebilir. Hizmetin bazı bölümlerinin ölçeği genişletilirken bazılarının ölçeği daraltılmış olabilir. Bazı bölümler aynı anda ölçeklendirilmeyebilir.

Bu tetikleyiciyle kullanılabilecek tek mekanizma PartitionInstanceCountScaleMechanism'dir. Bu mekanizmanın nasıl uygulandığını belirleyen üç faktör vardır:

  • Ölçek Artışı , mekanizma tetiklendiğinde kaç örneğin ekleneceğini veya kaldırıldığını belirler.
  • En Fazla Örnek Sayısı , ölçeklendirme için üst sınırı tanımlar. Bölümün örnek sayısı bu sınıra ulaşırsa, yük ne olursa olsun hizmetin ölçeği genişletilir. -1 değerini belirterek bu sınırı atlayabilirsiniz ve bu durumda hizmetin ölçeği mümkün olduğunca genişletilir (sınır, kümede kullanılabilen düğüm sayısıdır).
  • Minimum Örnek Sayısı , ölçeklendirme için alt sınırı tanımlar. Bölümün örnek sayısı bu sınıra ulaşırsa hizmet, yük ne olursa olsun ölçeği daraltılamaz.

Örnek tabanlı ölçeklendirme için otomatik ölçeklendirme ilkesini ayarlama

Uygulama bildirimini kullanma

<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'lerini kullanma

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’i kullanma

$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

Bölüm tabanlı ölçeklendirme ile ortalama hizmet yükü tetikleyicisi

İkinci tetikleyici, bir hizmetin tüm bölümlerinin yükünü temel alır. Ölçüm yükleri ilk olarak bir bölümün her çoğaltması veya örneği için yükü almak üzere düzeltilir. Durum bilgisi olan hizmetler için, bölümün yükü birincil çoğaltmanın yükü olarak kabul edilirken, durum bilgisi olmayan hizmetler için bölümün yükü bölümün tüm örneklerinin ortalama yüküdür. Bu değerler, hizmetin tüm bölümlerinde ortalama olarak alınır ve bu değer otomatik ölçeklendirmeyi tetiklemede kullanılır. Önceki mekanizmada olduğu gibi, hizmetin ne zaman ölçeklendirildiğini belirleyen üç faktör vardır:

  • Düşük yük eşiği, hizmetin ne zaman ölçeklendirileceğini belirleyen bir değerdir. Hizmetin tüm bölümlerinin ortalama yükü bu değerden düşükse, hizmetin ölçeği daraltılır.
  • Üst yük eşiği, hizmetin ölçeğinin ne zaman genişletileceğini belirleyen bir değerdir. Hizmetin tüm bölümlerinin ortalama yükü bu değerden yüksekse hizmetin ölçeği genişletilir.
  • Ölçeklendirme aralığı tetikleyicinin ne sıklıkta denetlendiğini belirler. Tetikleyici denetlendikten sonra ölçeklendirme gerekiyorsa mekanizma uygulanır. Ölçeklendirme gerekli değilse hiçbir işlem yapılmaz. Her iki durumda da ölçeklendirme aralığının süresi yeniden dolmadan önce tetikleyici yeniden denetlenir.

Bu tetikleyici hem durum bilgisi olan hem de durum bilgisi olmayan hizmetlerle kullanılabilir. Bu tetikleyiciyle kullanılabilecek tek mekanizma AddRemoveIncrementalNamedPartitionScalingMechanism'dir. Hizmetin ölçeği genişletildiğinde yeni bir bölüm eklenir ve hizmet mevcut bölümlerden birinde ölçeklendirildiğinde kaldırılır. Hizmet oluşturulduğunda veya güncelleştirildiğinde denetlenen ve bu koşullar karşılanmadığında hizmet oluşturma/güncelleştirme başarısız olduğunda denetlenen kısıtlamalar vardır:

  • Adlandırılmış bölüm düzeni hizmet için kullanılmalıdır.
  • Bölüm adları ardışık tamsayılar olmalıdır, örneğin "0," "1," ...
  • İlk bölüm adı "0" olmalıdır.

Örneğin, bir hizmet başlangıçta üç bölümle oluşturulduysa, bölüm adları için tek geçerli olasılık "0", "1" ve "2"dir.

Gerçekleştirilen gerçek otomatik ölçeklendirme işlemi de bu adlandırma düzenine göre yapılır:

  • Hizmetin geçerli bölümleri "0", "1" ve "2" olarak adlandırılırsa, ölçeği genişletme için eklenen bölüm "3" olarak adlandırılır.
  • Hizmetin geçerli bölümleri "0", "1" ve "2" olarak adlandırılıyorsa, içinde ölçeklendirme için kaldırılan bölüm "2" adlı bölümdür.

Örnekleri ekleyerek veya kaldırarak ölçeklendirme kullanan mekanizmayla aynı şekilde, bu mekanizmanın nasıl uygulandığını belirleyen üç parametre vardır:

  • Ölçek Artışı , mekanizma tetiklendiğinde kaç bölümün eklendiğini veya kaldırıldığını belirler.
  • En Fazla Bölüm Sayısı , ölçeklendirme için üst sınırı tanımlar. Hizmetin bölüm sayısı bu sınıra ulaşırsa, yük ne olursa olsun hizmetin ölçeği genişletemez. -1 değerini belirterek bu sınırı atlayabilirsiniz ve bu durumda hizmetin ölçeği mümkün olduğunca genişletilir (sınır, kümenin gerçek kapasitesidir).
  • En Düşük Bölüm Sayısı , ölçeklendirme için alt sınırı tanımlar. Hizmetin bölüm sayısı bu sınıra ulaşırsa, yük ne olursa olsun hizmet ölçeği daraltılamaz.

Uyarı

Durum bilgisi olan hizmetlerle AddRemoveIncrementalNamedPartitionScalingMechanism kullanıldığında, Service Fabric bildirim veya uyarı olmadan bölümleri ekler veya kaldırır. Ölçeklendirme mekanizması tetiklendiğinde verilerin yeniden bölümlenmesi gerçekleştirilmeyecek. Ölçeği genişletme işlemi durumunda yeni bölümler boş olur ve ölçeğin çalışması durumunda bölüm, içerdiği tüm verilerle birlikte silinir.

Bölüm tabanlı ölçeklendirme için otomatik ölçeklendirme ilkesini ayarlama

Uygulama bildirimini kullanma

<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'lerini kullanma

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’i kullanma

$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

Kaynaklara Göre Otomatik Ölçeklendirme

Kaynak izleme hizmetinin gerçek kaynaklara göre ölçeklendirilmesini sağlamak için, özelliği aşağıdaki gibi ekleyebilirsiniz ResourceMonitorService :

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

Service Fabric, iki yerleşik ölçüm kullanarak CPU ve bellek idaresini destekler: servicefabric:/_CpuCores CPU ve servicefabric:/_MemoryInMB bellek için. Kaynak İzleyicisi Hizmeti, CPU ve bellek kullanımını izlemek ve Küme Resource Manager'ı geçerli kaynak kullanımıyla güncelleştirmekle sorumludur. Bu hizmet, olası kısa süreli ani artışları hesaba katmak için ağırlıklı hareketli ortalama uygular. Kaynak izleme, Hem Windows'ta kapsayıcılı hem de kapsayıcılı olmayan uygulamalar ve Linux'ta kapsayıcılı uygulamalar için desteklenir.

Not

Kaynak İzleyicisi Hizmeti'nde izlenen ve Küme Resource Manager'a güncelleştirilen CPU ve bellek tüketimi, otomatik ölçeklendirme dışında herhangi bir karar alma işlemini etkilemez. Kaynak idaresi gerekiyorsa, otomatik ölçeklendirme işlevlerine müdahale etmeden yapılandırılabilir ve tam tersi de yapılabilir.

Önemli

Kaynak tabanlı otomatik ölçeklendirme yalnızca özel işlem modelinde etkinleştirilen hizmetler için desteklenir.

Sonraki adımlar

Uygulama ölçeklenebilirliği hakkında daha fazla bilgi edinin.