Aracılığıyla paylaş


Hizmet taşıma maliyeti

Service Fabric Kümesi Resource Manager bir kümede hangi değişikliklerin yapileceğini belirlemeye çalışırken dikkate alan bir faktör, bu değişikliklerin maliyetidir. "Maliyet" ifadesi, kümenin ne kadar iyileştirilebileceğine göre dengelenmiş olur. Dengeleme, birleştirme ve diğer gereksinimler için hizmetler taşınırken maliyet katsayısı dikkate alınır. Amaç, gereksinimleri en az kesintiye uğrayan veya pahalı bir şekilde karşılamaktır.

Hizmetlerin taşınması, CPU süresine ve ağ bant genişliğine en düşük düzeyde mal olur. Durum bilgisi olan hizmetler için bu hizmetlerin durumunun kopyalanması, ek bellek ve diskin tüketilmesi gerekir. Azure Service Fabric Kümesi'nin Resource Manager çö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, maliyetleri hesaplamanın ve kümeyi yönetmeye çalışırken sınırlamanın iki yolu vardır. İlk mekanizma, yapacağı her hareketi saymaktır. Yaklaşık olarak aynı bakiyeye (puan) sahip iki çözüm oluşturulursa, Küme Resource Manager maliyeti en düşük olanı (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 olması karmaşık sistemlerde pek olası değildir. Bazıları büyük olasılıkla çok daha pahalıdır.

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

Taşıma maliyetini çoğaltma başına 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 kendileri belirli bir süreyi taşımanın ne kadar maliyetli olduğu konusunda büyük olasılıkla en iyi fikir sahibi olduğundan, hizmetlerin çalışma zamanı sırasında kendi 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 örneklerin 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ığını kullanmalıdır. MoveCost'u diğer bölümler adına raporlama, diğer bölümler adına raporlama yükünün yanı sıra bölümleri dışarıdan tamamen yönetmenize olanak tanır. Bu API'ler, Küme Resource Manager 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'u güncelleştirebilir.
  • Durum bilgisi olmayan ve 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 edip işlersek dönüş kodu Başarılı olur. Aksi takdirde API şu hata kodunu 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 bölüm için birincil çoğaltmanın MoveCost değerini değiştirmeye çalışıldı.
  • ReplicaDoesNotExist - İkincil çoğaltma veya örnek belirtilen bir düğümde 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 son bildirilen taşıma maliyeti 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 Çok Yüksek. Aşağıdaki kurallar geçerlidir:

  • 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ını gerektirse bile)

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

MoveCost, genel olarak en az kesintiye neden olan ve eşdeğer bir dengeye ulaşırken en kolay şekilde ulaşılması gereken çözümleri bulmanıza yardımcı olur. Bir hizmetin maliyet 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 yeniden normale ayarlarsınız.

Önemli

Küme Resource Manager 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ı dikkatle 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ını gerektirse bile)

Kümenizde taşıma maliyetini etkinleştirme

Daha ayrıntılı MoveCost'ların dikkate alınması için, kümenizde MoveCost'un etkinleştirilmesi gerekir. Bu ayar olmadan, MoveCost'u hesaplamak 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