Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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. Náklady jsou zohledněny při přesouvání služeb pro vyrovnávání, defragmentaci a další požadavky. Cílem je splnit požadavky nejméně rušivým nebo nákladným způsobem.
Přenášení služeb vyžaduje minimálně výpočetní čas 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ů na řešení, která navrhuje Azure Service Fabric Cluster Resource Manager, pomáhá zajistit, že prostředky clusteru nejsou zbytečně vyčerpány. 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 pro jednotlivé 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 jejich přesunutí v daný okamžik, existuje rozhraní API pro služby, které hlásí své individuální náklady na přesun během běhu programu.
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.
Zpráva o nákladech na přesun oddílu
Předchozí část popisuje, jak repliky služby nebo instance samy hlásí MoveCost. K vykazování hodnot MoveCost jsme poskytli rozhraní Service Fabric API na jiné části. 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. Hlášení MoveCost jménem jiných oddílů spolu s hlášením zatížení jménem jiných oddílů umožňuje úplnou správu oddílů zvenčí. Tato rozhraní API eliminují potřebu modelu Sidecar z pohledu správce prostředků tohoto 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 hodnotu MoveCost všech svých sekundárních replik nebo instancí.
- Bezstavové i stavové služby mohou na uzlu aktualizovat MoveCost konkrétní repliky nebo instance.
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.
- Rekonfigurace čeká – Oddíl je momentálně v procesu překonfigurace.
- 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 aktualizaci nákladů na přesun pro primární repliku nebo všechny sekundární repliky, 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 pohyb znamenají, že pohyb je bezplatný a neměly by se započítávat do skóre řešení.
- Nastavení nákladů na přesun na vysoké nebo velmi vysoké neposkytuje záruku, že se replika nikdy nepřesune.
- Repliky s náklady na přesun VeryHigh budou přesunuty pouze tehdy, pokud dojde k porušení omezení v clusteru, které nelze opravit jiným způsobem (i kdyby to vyžadovalo přesun mnoha dalších replik k nápravě porušení).
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 velmi vysokými náklady na přesun budou přesunuty pouze v případě porušení omezení v clusteru, které nelze žádným jiným způsobem opravit (i kdyby k tomu bylo nutné přesunout mnoho dalších replik).
Povolení nákladů na přesun v rámci 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
- Správce prostředků clusteru Service Fabric používá metriky ke správě spotřeby a kapacity v clusteru. Další informace o metrikách a jejich konfiguraci najdete v tématu Správa spotřeby prostředků a načítání v Service Fabric s využitím metrik.
- Informace o správě a vyrovnávání zatížení v clusteru najdete v tématu Vyrovnávání clusteru Service Fabric.