Aracılığıyla paylaş


Hizmet taşıma maliyeti

Service Fabric Kümesi Kaynak Yöneticisi'nin bir kümede hangi değişiklikleri yapacağına karar vermeye çalışırken dikkate alan bir faktör, bu değişikliklerin maliyetidir. "Maliyet" ifadesi, kümenin ne kadar iyileştirilebileceğine karşı dengelenmiş durumdadır. Dengeleme, birleştirme ve diğer gereksinimlere yönelik hizmetler taşınırken maliyet katzdir. Amaç, gereksinimleri en az kesintiye neden olan veya pahalı bir şekilde karşılamaktır.

Hizmetlerin taşınması, CPU süresi ve ağ bant genişliği maliyetlerini en düşük düzeyde tutar. Durum bilgisi olan hizmetler için bu hizmetlerin durumunun kopyalanması, ek bellek ve disk tüketilmesi gerekir. Azure Service Fabric Kümesi Kaynak Yöneticisi'nin sağladığı çözümlerin maliyetini en aza indirmek, küme kaynaklarının gereksiz yere harcanmamasını sağlamaya yardımcı olur. Ancak, kümedeki kaynakların ayrılmasını önemli ölçüde geliştirecek çözümleri de yoksaymak istemezsiniz.

Küme Resource Manager'ın, kümeyi yönetmeye çalışırken maliyetleri hesaplamanın ve sınırlamanın iki yolu vardır. İlk mekanizma, yapacağı her hareketi saymaktır. Yaklaşık aynı bakiye (puan) ile iki çözüm oluşturulursa, Küme Kaynak Yöneticisi en düşük maliyeti (toplam taşıma sayısı) tercih eder.

Bu strateji iyi çalışır. Ancak varsayılan veya statik yüklerde olduğu gibi, tüm taşımaların eşit olduğu herhangi bir karmaşık sistemde pek olası değildir. Bazıları çok daha pahalı olabilir.

Taşıma Maliyetlerini Ayarlama

Bir hizmet oluşturulduğunda varsayılan taşıma maliyetini belirtebilirsiniz:

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -DefaultMoveCost Medium

C#:

FabricClient fabricClient = new FabricClient();
StatefulServiceDescription serviceDescription = new StatefulServiceDescription();
//set up the rest of the ServiceDescription
serviceDescription.DefaultMoveCost = MoveCost.Medium;
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Ayrıca, hizmet oluşturulduktan sonra bir hizmet için MoveCost'ı dinamik olarak belirtebilir veya güncelleştirebilirsiniz:

PowerShell:

Update-ServiceFabricService -Stateful -ServiceName "fabric:/AppName/ServiceName" -DefaultMoveCost High

C#:

StatefulServiceUpdateDescription updateDescription = new StatefulServiceUpdateDescription();
updateDescription.DefaultMoveCost = MoveCost.High;
await fabricClient.ServiceManager.UpdateServiceAsync(new Uri("fabric:/AppName/ServiceName"), updateDescription);

Çoğaltma başına taşıma maliyetini dinamik olarak belirtme

Yukarıdaki kod parçacıklarının tümü, hizmetin dışından bir kerede tüm hizmet için MoveCost belirtmeye yöneliktir. Ancak, taşıma maliyeti en çok belirli bir hizmet nesnesinin taşıma maliyeti kullanım ömrü boyunca değiştiğinde yararlıdır. Hizmetlerin büyük olasılıkla belirli bir zamanı taşımanın ne kadar maliyetli olduğu konusunda en iyi fikirleri olduğundan, hizmetlerin çalışma zamanı sırasında kendi bireysel taşıma maliyetlerini raporlaması için bir API vardır.

C#:

this.Partition.ReportMoveCost(MoveCost.Medium);

Not

İkincil çoğaltmaların taşıma maliyetini yalnızca kod aracılığıyla ayarlayabilirsiniz.

Bölüm için taşıma maliyetini raporlama

Önceki bölümde hizmet çoğaltmalarının veya örneklerinin MoveCost'un kendilerini nasıl raporlediği açıklanmaktadır. Diğer bölümler adına MoveCost değerlerini raporlamak için Service Fabric API'sini sağladık. Bazen hizmet çoğaltması veya örneği en iyi MoveCost değerini tek başına belirleyemez ve diğer hizmet mantığına güvenmesi gerekir. Diğer bölümler adına Raporlama MoveCost, diğer bölümler adına raporlama yükünün yanı sıra bölümleri dışarıdan tamamen yönetmenizi sağlar. Bu API'ler, Küme Kaynak Yöneticisi açısından Sepet düzeni gereksinimlerini ortadan kaldırır.

Aynı API çağrısıyla farklı bir bölüm için MoveCost güncelleştirmelerini bildirebilirsiniz. Yeni MoveCost değerleriyle güncelleştirmek istediğiniz her bölüm için PartitionMoveCostDescription nesnesi belirtmeniz gerekir. API, MoveCost'un güncelleştirilmesinin birden çok yolunu sağlar:

  • Durum bilgisi olan bir hizmet bölümü birincil çoğaltması MoveCost'unu güncelleştirebilir.
  • Hem durum bilgisi olmayan hem de durum bilgisi olan hizmetler, tüm ikincil çoğaltmalarının veya örneklerinin MoveCost'unu güncelleştirebilir.
  • Hem durum bilgisi olmayan hem de durum bilgisi olan hizmetler, düğümdeki belirli bir çoğaltmanın veya örneğin MoveCost'unu güncelleştirebilir.

Bölüm için her MoveCost güncelleştirmesi, değiştirilecek en az bir geçerli değer içermelidir. Örneğin, birincil çoğaltma girdisine null atayarak birincil çoğaltma güncelleştirmesini atlayabilirsiniz; MoveCost güncelleştirmesi sırasında diğer girdiler kullanılır ve birincil çoğaltma için MoveCost güncelleştirmesini atlarız. Tek API çağrısıyla birden çok bölüm için MoveCost'un güncelleştirilmesi mümkün olduğundan, API ilgili bölüm için dönüş kodlarının listesini sağlar. MoveCost güncelleştirmesi için bir isteği başarıyla kabul eder ve işlersek dönüş kodu Başarılı olur. Aksi takdirde API hata kodu sağlar:

  • PartitionNotFound - Belirtilen bölüm kimliği yok.
  • ReconfigurationPending - Bölüm şu anda yeniden yapılandırılıyor.
  • InvalidForStatelessServices - Durum bilgisi olmayan bir hizmete ait bir bölüm için birincil çoğaltmanın MoveCost değerini değiştirme girişiminde bulunuldu.
  • ReplicaDoesNotExist - belirtilen düğümde ikincil çoğaltma veya örnek yok.
  • InvalidOperation - Sistem uygulamasına ait bir bölüm için MoveCost güncelleştiriliyor.

C#:

Guid partitionId = Guid.Parse("53df3d7f-5471-403b-b736-bde6ad584f42");
string nodeName0 = "NodeName0";

OperationResult<UpdatePartitionMoveCostResultList> updatePartitionMoveCostResults =
    await this.FabricClient.UpdatePartitionMoveCostAsync(
        new UpdatePartitionMoveCostQueryDescription
        {
            new List<PartitionMoveCostDescription>()
            {
                new PartitionMoveCostDescription(
                    partitionId,
                    MoveCost.VeryHigh,
                    MoveCost.Zero,
                    new List<ReplicaMoveCostDescription>()
                    {
                        new ReplicaMoveCostDescription(nodeName0, MoveCost.Medium)
                    })
            }
        },
        this.Timeout,
        cancellationToken);

Bu örnekle, 53df3d7f-5471-403b-b736-bde6ad584f42 bölümü için bildirilen son taşıma maliyetinin güncelleştirmesini gerçekleştirebilirsiniz. Birincil çoğaltma taşıma maliyeti VeryHigh olacaktır. NodeName0 düğümünde bulunan belirli bir ikincil çoğaltmanın taşıma maliyeti dışında tüm ikincil çoğaltma taşıma maliyeti Sıfır olur. Belirli bir çoğaltmanın taşıma maliyeti Orta olacaktır. Birincil çoğaltma veya tüm ikincil çoğaltmalar için taşıma maliyetini güncelleştirmeyi atlamak istiyorsanız, ilgili girdiyi null olarak bırakabilirsiniz.

Taşıma maliyetinin etkisi

MoveCost'un beş düzeyi vardır: Sıfır, Düşük, Orta, Yüksek ve ÇokHigh. Geçerli olan kurallar şunlardır:

  • MoveCosts, Zero ve VeryHigh dışında birbirine göredir.
  • Sıfır taşıma maliyeti, hareketin serbest olduğu ve çözümün puanına göre sayılmaması gerektiği anlamına gelir.
  • Taşıma maliyetinizi Yüksek veya VeryHigh olarak ayarlamak, çoğaltmanın hiçbir zaman taşınmayacağını garanti etmez.
  • VeryHigh taşıma maliyetine sahip çoğaltmalar, yalnızca kümede başka bir yolla düzeltilemeyen bir kısıtlama ihlali varsa taşınır (ihlali düzeltmek için başka birçok çoğaltmanın taşınması gerekse bile)

Taşıma için çoğaltmaları seçmede bir faktör olarak maliyeti taşıma

MoveCost, genel olarak en az kesintiye neden olan ve eşdeğer dengeye ulaşırken en kolay ulaşılması gereken çözümleri bulmanıza yardımcı olur. Bir hizmetin maliyetle ilgili bir durumu birçok şeye göre olabilir. Taşıma maliyetinizi hesaplamada en yaygın faktörler şunlardır:

  • Hizmetin taşıması gereken durum veya veri miktarı.
  • İstemcilerin bağlantısının kesilmesinin maliyeti. Birincil çoğaltmayı taşımak genellikle ikincil çoğaltmayı taşıma maliyetinden daha maliyetlidir.
  • Uçuş içi bir işlemi kesintiye uğratmanın maliyeti. Veri deposu düzeyindeki bazı işlemler veya bir istemci çağrısına yanıt olarak gerçekleştirilen işlemler maliyetlidir. Belirli bir noktadan sonra, zorunda değilseniz onları durdurmak istemezsiniz. Bu nedenle işlem devam ederken, taşıma olasılığını azaltmak için bu hizmet nesnesinin taşıma maliyetini artırırsınız. İşlem tamamlandığında maliyeti normale geri ayarlarsınız.

Önemli

Küme Resource Manager'ın kümede genel olarak en uygun yerleştirme çözümünü bulma becerisini önemli ölçüde kısıtladiğinden VeryHigh taşıma maliyetinin kullanılması dikkatli bir şekilde değerlendirilmelidir. VeryHigh taşıma maliyetine sahip çoğaltmalar, yalnızca kümede başka bir yolla düzeltilemeyen bir kısıtlama ihlali varsa taşınır (ihlali düzeltmek için başka birçok çoğaltmanın taşınması gerekse bile)

Kümenizde taşıma maliyetini etkinleştirme

Daha ayrıntılı MoveCost'ların dikkate alınması için MoveCost'un kümenizde etkinleştirilmesi gerekir. Bu ayar olmadan, MoveCost'un hesaplanması için varsayılan sayım taşıma modu kullanılır ve MoveCost raporları yoksayılır.

ClusterManifest.xml:

        <Section Name="PlacementAndLoadBalancing">
            <Parameter Name="UseMoveCostReports" Value="true" />
        </Section>

Tek başına dağıtımlar için ClusterConfig.json veya Azure tarafından barındırılan kümeler için Template.json aracılığıyla:

"fabricSettings": [
  {
    "name": "PlacementAndLoadBalancing",
    "parameters": [
      {
          "name": "UseMoveCostReports",
          "value": "true"
      }
    ]
  }
]

Sonraki adımlar

  • Service Fabric Kümesi Kaynak Yöneticisi, kümedeki tüketimi ve kapasiteyi yönetmek için ölçümleri kullanır. Ölçümler ve bunların nasıl yapılandırılması hakkında daha fazla bilgi edinmek için Bkz . Ölçümlerle Service Fabric'te kaynak tüketimini ve yüklemesini yönetme.
  • Küme Resource Manager'ın kümedeki yükü yönetme ve dengeleme hakkında bilgi edinmek için Service Fabric kümenizi dengeleme bölümüne bakın.