Sdílet prostřednictvím


Zásady umístění pro služby Service Fabric

Zásady umístění jsou další pravidla, která se dají použít k řízení umístění služby v některých konkrétních méně běžných scénářích. Mezi příklady těchto scénářů patří:

  • Cluster Service Fabric zahrnuje zeměpisné vzdálenosti, například několik místních datacenter nebo napříč oblastmi Azure.
  • Vaše prostředí zahrnuje několik oblastí geopolitického nebo právního řízení nebo v jiném případě, kdy máte hranice zásad, které potřebujete vynutit.
  • Je potřeba vzít v úvahu výkon komunikace nebo latenci kvůli velkým vzdálenostem nebo použití pomalejších nebo méně spolehlivých síťových propojení.
  • Potřebujete zachovat určitou úlohu v souladu s nejlepším úsilím, a to buď s jinými úlohami, nebo v blízkosti zákazníků.
  • Potřebujete více bezstavových instancí oddílu na jednom uzlu.

Většina těchto požadavků odpovídá fyzickému rozložení clusteru, které je reprezentované jako domény selhání clusteru.

Pokročilé zásady umístění, které pomáhají řešit tyto scénáře:

  1. Neplatné domény
  2. Požadované domény
  3. Upřednostňované domény
  4. Zákaz balení replik
  5. Povolit více bezstavových instancí na uzlu

Většinu následujících ovládacích prvků je možné nakonfigurovat prostřednictvím vlastností uzlu a omezení umístění, ale některé jsou složitější. Kvůli zjednodušení poskytuje Resource Manager clusteru Service Fabric tyto další zásady umístění. Zásady umístění se konfigurují na základě jednotlivých pojmenovaných instancí služby. Dají se také dynamicky aktualizovat.

Zadání neplatných domén

Zásada umístění InvalidDomain umožňuje určit, že konkrétní doména selhání je pro konkrétní službu neplatná. Tato zásada zajišťuje, že konkrétní služba nikdy neběží v určité oblasti, například z geopolitických nebo firemních důvodů. Více neplatných domén je možné zadat prostřednictvím samostatných zásad.

Neplatný příklad domény

Kód:

ServicePlacementInvalidDomainPolicyDescription invalidDomain = new ServicePlacementInvalidDomainPolicyDescription();
invalidDomain.DomainName = "fd:/DCEast"; //regulations prohibit this workload here
serviceDescription.PlacementPolicies.Add(invalidDomain);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -PlacementPolicy @("InvalidDomain,fd:/DCEast”)

Určení požadovaných domén

Požadované zásady umístění domény vyžadují, aby služba byla přítomna pouze v zadané doméně. Více požadovaných domén je možné zadat prostřednictvím samostatných zásad.

Příklad požadované domény

Kód:

ServicePlacementRequiredDomainPolicyDescription requiredDomain = new ServicePlacementRequiredDomainPolicyDescription();
requiredDomain.DomainName = "fd:/DC01/RK03/BL2";
serviceDescription.PlacementPolicies.Add(requiredDomain);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -PlacementPolicy @("RequiredDomain,fd:/DC01/RK03/BL2")

Určení upřednostňované domény pro primární repliky stavové služby

Upřednostňovaná primární doména určuje doménu selhání, do které se má primární doména umístit. Primární skončí v této doméně, když je všechno v pořádku. Pokud doména nebo primární replika selže nebo se vypne, primární se přesune do jiného umístění, ideálně ve stejné doméně. Pokud toto nové umístění není v upřednostňované doméně, Resource Manager clusteru ho co nejdříve přesune do upřednostňované domény. Přirozeně toto nastavení dává smysl jenom pro stavové služby. Tato zásada je nejužitečnější v clusterech, které jsou rozložené napříč oblastmi Azure nebo několika datovými centry, ale mají služby, které dávají přednost umístění v určitém umístění. Udržování primaries blízko uživatelům nebo jiným službám pomáhá poskytovat nižší latenci, zejména pro čtení, která jsou ve výchozím nastavení zpracovávána primariemi.

Upřednostňované primární domény a převzetí služeb při selhání

ServicePlacementPreferPrimaryDomainPolicyDescription primaryDomain = new ServicePlacementPreferPrimaryDomainPolicyDescription();
primaryDomain.DomainName = "fd:/EastUS/";
serviceDescription.PlacementPolicies.Add(primaryDomain);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -PlacementPolicy @("PreferredPrimaryDomain,fd:/EastUS")

Vyžadování distribuce repliky a zákaz balení

Repliky se obvykle distribuují napříč doménami selhání a upgrady, když je cluster v pořádku. Existují však případy, kdy může dočasně zabalit do jedné domény více než jednu repliku pro daný oddíl. Řekněme například, že cluster má devět uzlů ve třech doménách selhání, fd:/0, fd:/1 a fd:/2. Řekněme také, že vaše služba má tři repliky. Řekněme, že uzly používané pro tyto repliky v fd:/1 a fd:/2 zmizely. Obvykle by Správce prostředků clusteru preferoval jiné uzly ve stejných doménách selhání. V tomto případě řekněme, že kvůli problémům s kapacitou nebyly platné žádné jiné uzly v těchto doménách. Pokud Správce prostředků clusteru sestaví náhrady za tyto repliky, bude muset zvolit uzly v fd:/0. Tím se ale vytvoří situace, kdy dojde k porušení omezení domény selhání. Balení replik zvyšuje pravděpodobnost, že celá sada replik může dojít ke snížení nebo ztrátě.

Poznámka:

Další informace o omezeních aprioritch

Pokud jste někdy viděli zprávu o stavu, například "The Load Balancer has detected a Constraint Violation for this Replica:fabric:/<some service name> Secondary Partition <some partition ID> is violating the Constraint: FaultDomain", pak jste narazili na tuto podmínku nebo něco podobného. Obvykle se dočasně zabalí jenom jedna nebo dvě repliky. Pokud je v dané doméně méně než kvorum replik, jste v bezpečí. Balení je vzácné, ale může se stát, a obvykle tyto situace jsou přechodné, protože uzly se vrátí. Pokud uzly zůstanou mimo provoz a Resource Manager clusteru potřebuje sestavit náhrady, obvykle jsou v ideálních doménách selhání k dispozici další uzly.

Některé úlohy by vždy preferovaly cílový počet replik, i když jsou zabalené do menšího počtu domén. Tyto úlohy se vsadí na celkové současné trvalé selhání domény a obvykle můžou obnovit místní stav. Jiné úlohy by raději přebíjely výpadek dříve než riziko správnosti nebo ztráty dat. Většina produkčních úloh běží s více než třemi replikami, více než třemi doménami selhání a mnoha platnými uzly na doménu selhání. Z tohoto důvodu výchozí chování umožňuje balení domény ve výchozím nastavení. Výchozí chování umožňuje normální vyrovnávání a převzetí služeb při selhání zpracovávat tyto extrémní případy, i když to znamená dočasné balení domény.

Pokud chcete takové balení pro danou úlohu zakázat, můžete pro danou úlohu zadat RequireDomainDistribution zásady. Pokud je tato zásada nastavená, Správce prostředků clusteru zajistí, že se ve stejné chybě nebo v doméně upgradu nespustí žádné dvě repliky ze stejného oddílu.

Kód:

ServicePlacementRequireDomainDistributionPolicyDescription distributeDomain = new ServicePlacementRequireDomainDistributionPolicyDescription();
serviceDescription.PlacementPolicies.Add(distributeDomain);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -PlacementPolicy @("RequiredDomainDistribution")

Bylo by teď možné použít tyto konfigurace pro služby v clusteru, který nebyl geograficky rozložený? Mohl bys, ale není to moc důvod. Požadované, neplatné a upřednostňované konfigurace domény by se měly vyhnout, pokud je scénáře nevyžadují. Nemá smysl se pokusit vynutit spuštění dané úlohy v jednom racku nebo preferovat nějaký segment místního clusteru před jiným. Různé konfigurace hardwaru by se měly rozložit mezi domény selhání a zpracovávat prostřednictvím normálních omezení umístění a vlastností uzlu.

Umístění několika bezstavových instancí oddílu na jednom uzlu

Zásada umístění AllowMultipleStatelessInstancesOnNode umožňuje umístění více bezstavových instancí oddílu na jednom uzlu. Ve výchozím nastavení nelze na uzel umístit více instancí jednoho oddílu. I u služby -1 není možné škálovat počet instancí nad rámec počtu uzlů v clusteru pro danou pojmenovanou službu. Tato zásada umístění odebere toto omezení a umožňuje zadat InstanceCount vyšší než počet uzlů.

Pokud jste někdy viděli zprávu o stavu, například "The Load Balancer has detected a Constraint Violation for this Replica:fabric:/<some service name> Secondary Partition <some partition ID> is violating the Constraint: ReplicaExclusion", pak jste narazili na tuto podmínku nebo něco podobného.

Pokud se chcete přihlásit k použití této zásady umístění ve vaší službě, povolte následující konfigurace:

<Section Name="Common">
  <Parameter Name="AllowCreateUpdateMultiInstancePerNodeServices" Value="True" />
  <Parameter Name="HostReuseModeForExclusiveStateless" Value="1" />
</Section>

AllowMultipleStatelessInstancesOnNode Zadáním zásad ve službě je možné nastavit InstanceCount nad rámec počtu uzlů v clusteru.

Kód:

ServicePlacementAllowMultipleStatelessInstancesOnNodePolicyDescription allowMultipleInstances = new ServicePlacementAllowMultipleStatelessInstancesOnNodePolicyDescription();
serviceDescription.PlacementPolicies.Add(allowMultipleInstances);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName -Stateless –PartitionSchemeSingleton –PlacementPolicy @(“AllowMultipleStatelessInstancesOnNode”) -InstanceCount 10 -ServicePackageActivationMode ExclusiveProcess 

Poznámka:

V současné době se zásady podporují pouze pro bezstavové služby s režimem aktivace balíčku služby ExclusiveProcess.

Upozorňující

Zásady nejsou podporovány při použití se statickými koncovými body portu. Použití obou ve spojení může vést ke clusteru, který není v pořádku, protože několik instancí na stejném uzlu se pokusí vytvořit vazbu na stejný port a nemůže se zobrazit.

Poznámka:

Použití vysoké hodnoty MinInstanceCount s touto zásadou umístění může vést k zablokování upgradů aplikací. Pokud máte například cluster s pěti uzly a nastavíte InstanceCount=10, budete mít na každém uzlu dvě instance. Pokud nastavíte MinInstanceCount=9, může se pokus o upgrade aplikace zaseknout; s minInstanceCount=8 se tomu můžete vyhnout.

Další kroky