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žeb v některých konkrétních, méně běžných scénářích. Příklady těchto scénářů:

  • Váš cluster Service Fabric pokrývá geografické vzdálenosti, jako je několik místních datacenter nebo napříč oblastmi Azure.
  • Vaše prostředí zahrnuje několik oblastí geopolitické nebo právní kontroly nebo jiný případ, kdy máte hranice zásad, které potřebujete vynutit.
  • Kvůli velkým vzdálenostem nebo použití pomalejších nebo méně spolehlivých síťových připojení je potřeba vzít v úvahu výkon nebo latenci komunikace.
  • Potřebujete zajistit, aby se určité úlohy co nejlépe komociovaly, a to buď s jinými úlohami, nebo v blízkosti zákazníků.
  • Potřebujete několik bezstavových instancí oddílu na jednom uzlu.

Většina těchto požadavků je v souladu s fyzickým rozložením clusteru, které je reprezentováno 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. Zakázání 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ší. Aby to bylo jednodušší, Resource Manager clusteru Service Fabric poskytuje tyto další zásady umístění. Zásady umístění se konfigurují na základě jednotlivých pojmenovaných instancí služby. Můžete je také aktualizovat dynamicky.

Určení neplatných domén

Zásady umístění InvalidDomain umožňují 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.

Příklad neplatné 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 k dispozici pouze v zadané doméně. Několik 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í doména skončí v této doméně, když je vše v pořádku. Pokud doména nebo primární replika selže nebo se vypne, primární replika 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ě, cluster Resource Manager ho co nejdříve přesune zpět do upřednostňované domény. Toto nastavení samozřejmě 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é upřednostňují umístění v určitém umístění. Udržování primárek v blízkosti jejich uživatelů nebo jiných služeb pomáhá zajistit nižší latenci, zejména u čtení, která jsou ve výchozím nastavení zpracovávána v primárkách.

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 zakázání balení

Repliky se obvykle distribuují napříč doménami selhání a upgradů, když je cluster v pořádku. Existují však případy, kdy může dočasně zabalit do jedné domény více než jedna replika 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 ve fd:/1 a fd:/2 byly mimo provoz. Za normálních okolností Resource Manager clusteru dává přednost jiným uzlům ve stejných doménách selhání. V tomto případě řekněme, že kvůli problémům s kapacitou nebyl platný žádný z ostatních uzlů v těchto doménách. Pokud clusterová Resource Manager sestaví náhradu za tyto repliky, bude muset zvolit uzly v fd:/0. Tím ale dojde k situaci, kdy dojde k porušení omezení domény selhání. Balení replik zvyšuje pravděpodobnost, že celá sada replik může dojít k výpadku nebo ztrátě.

Poznámka

Další informace o omezeních a prioritách omezení obecně najdete v tomto tématu.

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 tento stav nebo něco podobného. Obvykle se dočasně sbalí 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 k němu dojít a obvykle jsou tyto situace přechodné, protože se uzly vrátí. Pokud uzly zůstanou mimo provoz a clusterová Resource Manager potřebuje vytvořit náhradu, obvykle jsou v ideálních doménách selhání k dispozici další uzly.

Některé úlohy preferují vždy cílový počet replik, i když jsou zabalené do menšího počtu domén. Tyto úlohy sázejí na celkový počet souběžných trvalých selhání domény a obvykle můžou obnovit místní stav. Jiné úlohy by raději vzaly výpadek dříve, než aby riskovaly správnost nebo ztrátu 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 ve výchozím nastavení balení domény. Výchozí chování umožňuje normální vyrovnávání a převzetí služeb při selhání, aby se tyto extrémní případy zvládly, i když to znamená dočasné balení domény.

Pokud chcete takové balení pro danou úlohu zakázat, můžete zadat zásadu RequireDomainDistribution pro službu. Když je tato zásada nastavená, clusterová Resource Manager zajistí, aby se ve stejné doméně selhání nebo upgradu nespustí 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ý? Můžeš, ale nemáš k tomu taky velký důvod. Požadovaná, neplatná a upřednostňovaná konfigurace domény by se měla vyhnout, pokud je scénáře nevyžadují. Nemá smysl snažit se vynutit, aby daná úloha běžela v jednom racku, nebo upřednostňovat některý segment místního clusteru před jiným. Různé konfigurace hardwaru by měly být rozložené mezi domény selhání a měly by se 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 jeden uzel. Ve výchozím nastavení nelze na uzel umístit více instancí jednoho oddílu. Ani se službou -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í toto omezení odebere 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 tento stav 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ásady 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í jenom pro bezstavové služby s režimem aktivace balíčku služby ExclusiveProcess.

Upozornění

Zásady se nepodporují při použití s koncovými body statických portů. Použití obou ve spojení může vést k tomu, že cluster není v pořádku, protože se několik instancí na stejném uzlu pokusí vytvořit vazbu ke stejnému portu a nemůže se vytvořit.

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 hodnotou MinInstanceCount=8 se tomu dá vyhnout.

Další kroky