Sdílet prostřednictvím


Náklady na přesun služeb

Faktor, který Správce prostředků clusteru Service Fabric považuje při pokusu o určení změn, které se mají v clusteru provést, jsou náklady na tyto změny. Pojem "náklady" se vymění proti tomu, kolik clusteru je možné vylepšit. Při přesouvání služeb pro vyrovnávání, defragmentaci a další požadavky se zaměřují náklady. Cílem je splnit požadavky nejméně rušivým nebo nákladným způsobem.

Přesun služeb stojí minimálně čas procesoru a šířku pásma sítě. U stavových služeb vyžaduje zkopírování stavu těchto služeb, spotřebovávání další paměti a disku. Minimalizace nákladůnach nástroji Azure Service Fabric pomáhá minimalizovat náklady na řešení, která nabízí Azure Service Fabric Cluster Resource Manager, pomáhá zajistit, aby prostředky clusteru zbytečně nevyčerpaly. Nechcete ale ignorovat řešení, která by výrazně zlepšila přidělování prostředků v clusteru.

Správce prostředků clusteru má dva způsoby výpočetních nákladů a jejich omezení při pokusu o správu clusteru. První mechanismus jednoduše počítá každý krok, který by udělal. Pokud se vygenerují dvě řešení se stejným zůstatkem (skóre), pak Správce prostředků clusteru preferuje řešení s nejnižšími náklady (celkový počet přesunů).

Tato strategie dobře funguje. Stejně jako u výchozího nebo statického zatížení je nepravděpodobné, že by se všechny přesuny ve složitém systému rovnaly. Některé budou pravděpodobně mnohem dražší.

Nastavení nákladů na přesunutí

Při vytváření služby můžete zadat výchozí náklady na přesun:

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

Po vytvoření služby můžete také dynamicky určit nebo aktualizovat moveCost pro službu:

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

Dynamické určení nákladů na přesun na základě repliky

Předchozí fragmenty kódu jsou všechny pro určení MoveCost pro celou službu najednou mimo samotnou službu. Náklady na přesun jsou ale nejužitečnější, když se náklady na přesun konkrétního objektu služby v průběhu jeho životnosti změní. Vzhledem k tomu, že samotné služby pravděpodobně mají nejlepší představu o tom, jak nákladné je přesunout danou dobu, existuje rozhraní API pro služby, které hlásí své vlastní náklady na přesun během běhu.

C#:

this.Partition.ReportMoveCost(MoveCost.Medium);

Poznámka:

Náklady na přesun pro sekundární repliky můžete nastavit pouze prostřednictvím kódu.

Generování sestav nákladů na přesun oddílu

Předchozí část popisuje, jak se repliky služby nebo instance samy oznamují MoveCost. Pro vytváření sestav hodnot MoveCost jsme poskytli rozhraní Service Fabric API jménem jiných oddílů. V některých případech replika služby nebo instance nedokáže určit nejlepší hodnotu MoveCost sama o sobě a musí se spoléhat na jinou logiku služeb. Vytváření sestav MoveCost jménem jiných oddílů spolu s načítáním sestav jménem jiných oddílů umožňuje úplnou správu oddílů zvenčí. Tato rozhraní API eliminují potřeby modelu sajdkáře z pohledu Správce prostředků clusteru.

Aktualizace MoveCost můžete hlásit pro jiný oddíl se stejným voláním rozhraní API. Musíte zadat PartitionMoveCostDescription objekt pro každý oddíl, který chcete aktualizovat pomocí nových hodnot MoveCost. Rozhraní API umožňuje aktualizovat MoveCost několika způsoby:

  • Oddíl stavové služby může aktualizovat primární repliku MoveCost.
  • Bezstavové i stavové služby mohou aktualizovat moveCost všech svých sekundárních replik nebo instancí.
  • Bezstavové i stavové služby můžou aktualizovat moveCost konkrétní repliky nebo instance na uzlu.

Každá aktualizace MoveCost pro oddíl by měla obsahovat aspoň jednu platnou hodnotu, která se změní. Můžete například přeskočit aktualizaci primární repliky s přiřazením hodnoty null k položce primární repliky, další položky se použijí během aktualizace MoveCost a pro primární repliku vynecháme aktualizaci MoveCost. Vzhledem k tomu, že aktualizace moveCost pro více oddílů s jedním voláním rozhraní API je možná, poskytuje rozhraní API seznam návratových kódů pro odpovídající oddíl. Pokud úspěšně přijmeme a zpracujeme požadavek na aktualizaci MoveCost, návratový kód bude Úspěšný. V opačném případě rozhraní API poskytuje kód chyby:

  • PartitionNotFound – Zadané ID oddílu neexistuje.
  • RekonfiguracePending – Oddíl je aktuálně překonfigurován.
  • InvalidForStatelessServices – Došlo k pokusu o změnu moveCost primární repliky pro oddíl patřící do bezstavové služby.
  • ReplicaDoesNotExist – Sekundární replika nebo instance na zadaném uzlu neexistuje.
  • InvalidOperation – Aktualizace moveCost pro oddíl, který patří do systémové aplikace.

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

V tomto příkladu provedete aktualizaci nákladů na poslední nahlášené přesunutí oddílu 53df3d7f-5471-403b-b736-bde6ad584f42. Náklady na přesun primární repliky budou Velmi vysoké. Náklady na přesun všech sekundárních replik budou nulové, s výjimkou nákladů na přesunutí konkrétní sekundární repliky umístěné v node NodeName0. Náklady na přesun pro konkrétní repliku budou střední. Pokud chcete přeskočit náklady na přesun aktualizací primární repliky nebo všech sekundárních replik, můžete ponechat odpovídající položku jako null.

Dopad nákladů na přesun

MoveCost má pět úrovní: Nula, Nízká, Střední, Vysoká a Velmihigh. Platí následující pravidla:

  • MoveCosts jsou vzájemně relativní, s výjimkou Zero a VeryHigh.
  • Nulové náklady na přesun znamená, že pohyb je volný a neměl by se počítat se skóre řešení.
  • Nastavení nákladů na přesunutí na vysoké nebo Velmihigh neposkytuje záruku, že replika se nikdy nepřesune.
  • Repliky s náklady na přesun VeryHigh budou přesunuty pouze v případě, že dojde k narušení omezení v clusteru, které nelze žádným jiným způsobem opravit (i když k opravě porušení vyžaduje přesunutí mnoha dalších replik).

Přesunutí nákladů jako faktoru při výběru replik pro přesun

MoveCost vám pomůže najít řešení, která způsobují nejmenší celkové přerušení a jsou nejsnadnější, když stále přicházejí na ekvivalentní zůstatek. Pojem nákladů služby může být relativní vzhledem k mnoha věcem. Nejběžnějšími faktory při výpočtu nákladů na přesun jsou:

  • Množství stavu nebo dat, které musí služba přesunout.
  • Náklady na odpojení klientů Přesunutí primární repliky je obvykle nákladnější než náklady na přesun sekundární repliky.
  • Náklady na přerušení provozu v letu. Některé operace na úrovni úložiště dat nebo operací provedených v reakci na volání klienta jsou nákladné. Po určitém okamžiku je nechcete zastavit, pokud je nepotřebujete. Během operace tedy zvýšíte náklady na přesun tohoto objektu služby, abyste snížili pravděpodobnost, že se přesune. Po dokončení operace nastavíte náklady zpět na normální.

Důležité

Použití nákladů na přesun VeryHigh by se mělo pečlivě zvážit, protože výrazně omezuje schopnost Správce prostředků clusteru najít v clusteru globálně optimální řešení pro umístění. Repliky s náklady na přesun VeryHigh budou přesunuty pouze v případě, že dojde k narušení omezení v clusteru, které nelze žádným jiným způsobem opravit (i když k opravě porušení vyžaduje přesunutí mnoha dalších replik).

Povolení nákladů na přesun v clusteru

Aby bylo možné vzít v úvahu podrobnější moveCosty, musí být v clusteru povolená funkce MoveCost. Bez tohoto nastavení se výchozí režim počítání přesunů používá pro výpočet moveCost a sestavy MoveCost se ignorují.

ClusterManifest.xml:

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

prostřednictvím ClusterConfig.json pro samostatná nasazení nebo Template.json pro clustery hostované v Azure:

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

Další kroky