Megosztás a következőn keresztül:


Szolgáltatásáthelyezési költség

Az a tényező, amelyet a Service Fabric-fürt Resource Manager figyelembe venni a fürtön végrehajtott módosítások meghatározásakor, a módosítások költsége. A "költség" fogalma a fürt továbbfejleszthető értékével van elcserélve. A költségek a szolgáltatások kiegyensúlyozásra, töredezettségmentesítésre és egyéb követelményekre való áthelyezésekor vannak figyelembeve. A cél az, hogy a követelményeknek a legkevésbé zavaró vagy költséges módon feleljenek meg.

A szolgáltatások áthelyezése minimálisan a processzoridőbe és a hálózati sávszélességbe kerül. Állapotalapú szolgáltatások esetén a szolgáltatások állapotának másolására van szükség, további memóriát és lemezt használva. Az Azure Service Fabric-fürt által Resource Manager megoldások költségeinek minimalizálása segít biztosítani, hogy a fürt erőforrásai ne legyenek feleslegesen elköltve. Ugyanakkor nem szeretné figyelmen kívül hagyni azokat a megoldásokat sem, amelyek jelentősen javítanák a fürt erőforrásainak lefoglalását.

A fürt Resource Manager kétféleképpen lehet számítási költségeket és korlátozásokat végezni, miközben megpróbálja kezelni a fürtöt. Az első mechanizmus egyszerűen megszámlál minden lépést, amit tenne. Ha két megoldás körülbelül azonos egyenleggel (pontszámmal) jön létre, akkor a fürt Resource Manager a legalacsonyabb költséggel (az áthelyezések teljes számával) rendelkező megoldást részesíti előnyben.

Ez a stratégia jól működik. Az alapértelmezett vagy statikus terhelésekhez hasonlóan azonban nem valószínű, hogy bármely összetett rendszerben minden lépés egyenlő. Vannak, akik valószínűleg sokkal drágábbak.

Áthelyezési költségek beállítása

A létrehozáskor megadhatja a szolgáltatás alapértelmezett áthelyezési költségét:

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

A szolgáltatás létrehozása után dinamikusan is megadhatja vagy frissítheti a MoveCostot egy szolgáltatáshoz:

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

Áthelyezési költségek dinamikus megadása replikánként

Az előző kódrészletek mind a MoveCost megadására szolgálnak egy teljes szolgáltatáshoz egyszerre, a szolgáltatáson kívülről. Az áthelyezési költség azonban akkor hasznos, ha egy adott szolgáltatásobjektum áthelyezési költsége megváltozik az élettartama során. Mivel maguknak a szolgáltatásoknak valószínűleg a legjobb elképzelésük van arról, hogy milyen költségesek egy adott időpontot áthelyezni, van egy API a szolgáltatások számára, amely jelentést készít a saját egyéni áthelyezési költségeikről a futásidőben.

C#:

this.Partition.ReportMoveCost(MoveCost.Medium);

Megjegyzés

A másodlagos replikák átviteli költségét csak kóddal állíthatja be.

Partíció áthelyezési költségeinek jelentése

Az előző szakasz azt ismerteti, hogy a szolgáltatásreplikák vagy -példányok hogyan jelentik maguknak a MoveCost-t. A Service Fabric API-t biztosítottuk a MoveCost-értékek más partíciók nevében történő jelentéséhez. Előfordulhat, hogy a szolgáltatásreplika vagy -példány önmagában nem tudja meghatározni a legjobb MoveCost-értéket, és más szolgáltatáslogikára kell támaszkodnia. A MoveCost jelentéskészítése más partíciók nevében, valamint a terhelés más partíciók nevében történő jelentéskészítése lehetővé teszi a partíciók kívülről történő teljes kezelését. Ezek az API-k kiküszöbölik a Sidecar-mintára vonatkozó igényeket a fürt Resource Manager szempontjából.

Ugyanazon API-hívással jelentheti egy másik partíció MoveCost-frissítéseit. Meg kell adnia a PartitionMoveCostDescription objektumot minden olyan partícióhoz, amelyet frissíteni szeretne a MoveCost új értékeivel. Az API több módszert is lehetővé tesz a MoveCost frissítésére:

  • Az állapotalapú szolgáltatáspartíciók frissíthetik a MoveCost elsődleges replikáját.
  • Az állapot nélküli és az állapotalapú szolgáltatások is frissíthetik az összes másodlagos replikájának vagy példányának MoveCostját.
  • Az állapot nélküli és az állapotalapú szolgáltatások is frissíthetik egy adott replika vagy -példány MoveCostját egy csomóponton.

A partíció minden MoveCost-frissítésének tartalmaznia kell legalább egy érvényes értéket, amelyet módosítani fog. Kihagyhatja például az elsődleges replika frissítését úgy, hogy null értéket rendel az elsődleges replikabejegyzéshez, a MoveCost frissítése során más bejegyzéseket is használ, és kihagyjuk az elsődleges replika MoveCost-frissítését. Mivel a MoveCost frissítése több partícióhoz egyetlen API-hívással lehetséges, az API a megfelelő partícióhoz tartozó visszatérési kódok listáját biztosítja. Ha sikeresen elfogadjuk és feldolgozzuk a MoveCost frissítésére vonatkozó kérést, a visszaadott kód sikeres lesz. Ellenkező esetben az API a következő hibakódot biztosítja:

  • PartitionNotFound – A megadott partícióazonosító nem létezik.
  • ReconfigurationPending – A partíció jelenleg újrakonfigurálva van.
  • InvalidForStatelessServices – Kísérlet történt egy állapot nélküli szolgáltatáshoz tartozó partíció elsődleges replikájának MoveCostjának módosítására.
  • ReplicaDoesNotExist – A másodlagos replika vagy példány nem létezik egy megadott csomóponton.
  • InvalidOperation – A Rendszeralkalmazáshoz tartozó partíció MoveCost frissítése.

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

Ebben a példában egy 53df3d7f-5471-403b-b736-bde6ad584f42 partíció utolsó jelentett áthelyezési költségét fogja frissíteni. Az elsődleges replika áthelyezési költsége VeryHigh lesz. Minden másodlagos replika áthelyezési költsége Nulla lesz, kivéve a NodeName0 csomóponton található adott másodlagos replika áthelyezési költségét. Egy adott replika áthelyezési költsége Közepes lesz. Ha ki szeretné hagyni az elsődleges replika vagy az összes másodlagos replika áthelyezési költségeinek frissítését, a megfelelő bejegyzést null értékként hagyhatja.

Az áthelyezési költség hatása

A MoveCost öt szinttel rendelkezik: Nulla, Alacsony, Közepes, Magas és NagyonHigh. A következő szabályok érvényesek:

  • A MoveCosts egymáshoz viszonyítva van, kivéve a Nulla és a NagyonHigh értéket.
  • A nulla áthelyezési költség azt jelenti, hogy a mozgás szabad, és nem számít bele a megoldás pontszámaiba.
  • Az áthelyezési költség Magas vagy VeryHigh értékre állítása nem garantálja, hogy a replika soha nem lesz áthelyezve.
  • A VeryHigh áthelyezési költséggel rendelkező replikák csak akkor lesznek áthelyezve, ha a fürtben olyan korlátozás van, amely semmilyen más módon nem javítható ki (még akkor is, ha sok más replika áthelyezését igényli a szabálysértés kijavításához)

A költségek áthelyezése a replikák mozgáshoz való kiválasztásának tényezőjeként

A MoveCost segít megtalálni azokat a megoldásokat, amelyek összességében a legkisebb fennakadást okozzák, és amelyek a legegyszerűbben megvalósíthatók, miközben továbbra is megfelelő egyensúlyba kerülnek. A szolgáltatások költségeinek fogalma számos dologhoz viszonyítható. Az áthelyezési költségek kiszámításának leggyakoribb tényezői a következők:

  • A szolgáltatás által áthelyezendő állapot vagy adatok mennyisége.
  • Az ügyfelek leválasztásának költsége. Az elsődleges replika áthelyezése általában költségesebb, mint a másodlagos replika áthelyezésének költsége.
  • Egy repülés közbeni művelet megszakításának költsége. Az adattár szintjén végrehajtott egyes műveletek vagy az ügyfélhívásra válaszul végrehajtott műveletek költségesek. Egy bizonyos pont után nem akarod leállítani őket, ha nem kell. Így amíg a művelet folyamatban van, növelnie kell a szolgáltatásobjektum áthelyezési költségét, hogy csökkentse az áthelyezés valószínűségét. Ha a művelet befejeztével a költségeket visszaállítja a normál értékre.

Fontos

A VeryHigh áthelyezési költségének használatát alaposan meg kell fontolni, mivel jelentősen korlátozza a fürt Resource Manager globálisan optimális elhelyezési megoldást a fürtben. A VeryHigh áthelyezési költséggel rendelkező replikák csak akkor lesznek áthelyezve, ha a fürtben olyan korlátozás van, amely semmilyen más módon nem javítható ki (még akkor is, ha sok más replika áthelyezését igényli a szabálysértés kijavításához)

Áthelyezési költségek engedélyezése a fürtön

Ahhoz, hogy a részletesebb MoveCosts-t figyelembe lehessen venni, a MoveCost-nak engedélyezve kell lennie a fürtben. E beállítás nélkül a rendszer az áthelyezések számlálásának alapértelmezett módját használja a MoveCost kiszámításához, és a MoveCost-jelentések figyelmen kívül lesznek hagyva.

ClusterManifest.xml:

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

a ClusterConfig.json használatával önálló üzemelő példányokhoz vagy Template.json azure-beli üzemeltetett fürtökhöz:

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

Következő lépések