Compartir a través de


1. Sensibilidad del servicio

Cluster Resource Manager de Service Fabric proporciona la interfaz de costo de movimiento para permitir el ajuste de la prioridad de conmutación por error del servicio cuando se realizan movimientos para equilibrar, desfragmentar u otros requisitos. Sin embargo, el costo de movimiento tiene algunas limitaciones para satisfacer las necesidades de los clientes. Por ejemplo, el costo de movimiento no puede optimizar explícitamente un movimiento individual, ya que Cluster Resource Manager (CRM) se basa en la puntuación total de todos los movimientos realizados en una sola ejecución de algoritmo. El costo de movimiento no funciona cuando CRM realiza intercambios. Esto se debe a que todas las réplicas comparten el mismo costo de intercambio, lo que provoca un error al limitar la conmutación por error de intercambio para las réplicas sensibles. Otra limitación es que el costo de movimiento solo proporciona cuatro valores posibles (cero, bajo, medio, alto) y un valor especial (muy alto) para ajustar la prioridad de una réplica. Esto no proporciona la suficiente flexibilidad para la diferenciación de la sensibilidad de la réplica que se va a conmutar por error.

CRM introdujo la característica de sensibilidad a partir de la versión 10.1 de Service Fabric. Actualmente, esta característica asocia un servicio a una variable booleana IsMaximumSensitivity, lo que indica si la réplica de servicio es la réplica más sensible o no. CRM proporciona la máxima protección contra la conmutación por error para estos tipos de réplicas. Es decir, cuando IsMaximumSensitivity se establece en true para un servicio, la réplica de sensibilidad máxima (MSR) de este servicio solo se puede mover o intercambiar en los siguientes casos inevitables:

  • Infracción de restricción FD/UD solo si FD/UD está establecido en restricción dura
  • Intercambio de réplicas durante la actualización
  • Infracción de la capacidad del nodo si solo hay MSR en el nodo (si hay presente en el nodo una carga que no sea MSR, no se podrá mover la MSR).

Por ejemplo, en el escenario que se muestra en la tabla, el nodo 1 se encuentra bajo infracción de capacidad del nodo, ya que la carga de nodo de 150 supera la capacidad de nodo de 100. Por su parte, el nodo 2 está completamente vacío. En este caso, ambas MSR son inamovibles, ya que la carga que no es MSR se mueve al nodo 2 para corregir la infracción.

Nodo Carga y capacidad del nodo Carga de servicio MSR 1 Carga de servicio MSR 2 Carga de servicio que no es MSR
Nodo 1 150/100 50 50 50
Nodo 2 0/100

En el siguiente caso, dos MSR con carga de 60 cada una se colocan en el nodo 1, lo que provoca la infracción de capacidad del nodo 1. El nodo 2 tiene espacio de 80 con solo una carga no MSR de 20 colocada en él. Una de las MSR en el nodo 1 debe moverse al nodo 2, ya que no hay ninguna carga que no sea MSR presente en el nodo 1 que se vaya a mover para corregir la infracción.

Nodo Carga y capacidad del nodo Carga de servicio MSR 1 Carga de servicio MSR 2 Carga de servicio que no es MSR
Nodo 1 120/100 60 60
Nodo 2 20/100 20

La característica de sensibilidad permite que varias MSR se intercalen en el mismo nodo. Sin embargo, un número excesivo de MSR puede provocar una infracción de la capacidad del nodo. Por lo tanto, junto con IsMaximumSensitivity, la característica introduce la carga máxima en la métrica para asegurarse de que la suma de las cargas máximas de cada métrica sea menor o igual que la capacidad de nodo de esa métrica. Con este conjunto de límite superior, CRM puede colocar de forma segura varias MSR en el mismo nodo, evitando que la única manera de corregir la infracción de la capacidad del nodo sea mover una réplica de sensibilidad máxima.

Supongamos que se definen dos métricas de cliente para el nodo de clúster: MetricA y MetricB. Las capacidades de nodo para MetricA y MetricB son 100 y 4 respectivamente.

En la tabla siguiente se muestran algunos ejemplos sobre la intercalación de réplicas de sensibilidad máxima. En el caso de los tres escenarios enumerados en la tabla, suponga que ya existe una réplica de sensibilidad máxima en un nodo y la carga máxima para MetricA o MetricB debe ser positiva. Si se puede o no colocar más MSR en este nodo depende del espacio que queda en el nodo y los recursos necesarios para las nuevas MSR.

  1. Se pueden colocar más MSR en este nodo siempre y cuando no provoque la carga del nodo o la infracción de la capacidad de carga máxima. Es decir, MetricA (Max)Load <= 50 && MetricB (Max)Load <= 2.
  2. No se puede colocar ninguna otra MSR en este nodo, ya que las cargas máximas para MetricA y MetricB llegan a sus capacidades de carga máxima de nodo.
  3. No se puede colocar ninguna otra MSR en este nodo, ya que la carga máxima para MetricB llega a su capacidad de carga máxima de nodo, aunque existe espacio desde la perspectiva de MetricA.
Número de escenario Carga de MetricA Carga de MetricB IsMaximumSensitivity Carga máxima de MetricA Carga máxima de MetricB ¿Se puede colocar otra MSR en este nodo?
1 50 2 true 50 2
2 100 2 true 100 4 No
3 50 2 true 50 4 No

Nota:

La característica de sensibilidad actual solo proporciona una funcionalidad de MSR. Para cargas que no sean MSR, pero con valores de sensibilidad diferentes, CRM no las trata de forma diferente desde la perspectiva de la sensibilidad.

1.1. Habilitar o deshabilitar la sensibilidad del servicio

La característica de sensibilidad se activa o desactiva al establecer la configuración EnableServiceSensitivity en la sección PlacementAndLoadBalancing del manifiesto de clúster mediante XML o JSON:

En ClusterManifest.xml:

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

A través de ClusterConfig.json para las implementaciones independientes o Template.json para los clústeres hospedados en Azure:

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

1.2. Establecer la sensibilidad del servicio

Nota:

Aunque no es necesario, para establecer un servicio en sensibilidad máxima, se recomienda establecer el valor MaximumLoad correspondiente, y así evitar desbordar la capacidad del nodo cuando se colocan varios servicios de sensibilidad máxima en el mismo nodo. Consulte la sección Establecer la carga máxima para obtener más información.

1.2.1. Uso del manifiesto de aplicación

<Service>
  <StatefulService>
    <ServiceSensitivityDescription PrimaryDefaultSensitivity="0" SecondaryDefaultSensitivity="0" AuxiliaryDefaultSensitivity="0" IsMaximumSensitivity="True" />
  </StatefulService>
</Service>

1.2.2. Uso de API de PowerShell

Para especificar la sensibilidad de un servicio cuando se crea:

$sensitivity = New-Object -TypeName System.Fabric.Description.ServiceSensitivityDescription
$sensitivity.PrimaryDefaultSensitivity = 0
$sensitivity.SecondaryDefaultSensitivity = 0
$sensitivity.AuxiliaryDefaultSensitivity = 0
$sensitivity.IsMaximumSensitivity = $true

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -ServiceSensitivityDescription $sensitivity

Para especificar o actualizar la sensibilidad dinámicamente para un servicio existente:

$sensitivity = New-Object -TypeName System.Fabric.Description.ServiceSensitivityDescription
$sensitivity.PrimaryDefaultSensitivity = 0
$sensitivity.SecondaryDefaultSensitivity = 0
$sensitivity.AuxiliaryDefaultSensitivity = 0
$sensitivity.IsMaximumSensitivity = $true

Update-ServiceFabricService -Stateful -ServiceName fabric:/AppName/ServiceName -ServiceSensitivityDescription $sensitivity

1.2.3. Usar la API de C#

Para especificar la sensibilidad de un servicio cuando se crea:

FabricClient fabricClient = new FabricClient();

ServiceSensitivityDescription serviceSensitivity = new ServiceSensitivityDescription();
serviceSensitivity.PrimaryDefaultSensitivity = 0
serviceSensitivity.SecondaryDefaultSensitivity = 0
serviceSensitivity.AuxiliaryDefaultSensitivity = 0
serviceSensitivity.IsMaximumSensitivity = $true

StatefulServiceDescription serviceDescription = new StatefulServiceDescription();
serviceDescription.ServiceSensitivityDescription = serviceSensitivity; 

await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Para especificar o actualizar la sensibilidad dinámicamente para un servicio existente:

FabricClient fabricClient = new FabricClient();

ServiceSensitivityDescription serviceSensitivity = new ServiceSensitivityDescription();
serviceSensitivity.PrimaryDefaultSensitivity = 0
serviceSensitivity.SecondaryDefaultSensitivity = 0
serviceSensitivity.AuxiliaryDefaultSensitivity = 0
serviceSensitivity.IsMaximumSensitivity = $true

StatefulServiceUpdateDescription serviceUpdate = new StatefulServiceUpdateDescription();
serviceUpdate.ServiceSensitivityDescription = serviceSensitivity; 

await fabricClient.ServiceManager.UpdateServiceAsync(new Uri("fabric:/AppName/ServiceName"), serviceUpdate);

1.3. Establecer la carga máxima

Nota:

El valor predeterminado de MaximumLoad es 0. Cuando el usuario especifica un valor positivo para MaximumLoad, se le requiere que establezca primero el valor IsMaximumSensitivity del servicio correspondiente en true. Otro requisito es que MaximumLoad sea igual o mayor que todas las cargas predeterminadas en la misma métrica.

1.3.1. Uso del manifiesto de aplicación

<Service>
  <StatefulService>
    <SingletonPartition />
    <LoadMetrics>
      <LoadMetric Name="CPU" PrimaryDefaultLoad="10" SecondaryDefaultLoad="5" MaximumLoad="20" Weight="High" />
    </LoadMetrics>
  </StatefulService>
</Service>

1.3.2. Uso de API de PowerShell

Para especificar la carga máxima de un servicio cuando se crea:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton –Metric @("CPU,High,10,5,0,20")

Para especificar o actualizar la carga máxima de un servicio existente:

Update-ServiceFabricService -Stateful -ServiceName fabric:/AppName/ServiceName -Metric @("CPU,High,10,5,0,20")

1.3.3. Usar la API de C#

Para especificar la sensibilidad de un servicio cuando se crea:

FabricClient fabricClient = new FabricClient();

StatefulServiceLoadMetricDescription cpuMetric = new StatefulServiceLoadMetricDescription();
cpuMetric.Name = "CPU";
cpuMetric.PrimaryDefaultLoad = 10;
cpuMetric.SecondaryDefaultLoad = 5;
cpuMetric.AuxiliaryDefaultLoad = 0;
cpuMetric.Weight = ServiceLoadMetricWeight.High;
cpuMetric.MaximumLoad = 20;

StatefulServiceDescription serviceDescription = new StatefulServiceDescription();
serviceDescription.Metrics["CPU"] = cpuMetric;

await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Para especificar o actualizar la carga máxima de un servicio existente:

FabricClient fabricClient = new FabricClient();

StatefulServiceLoadMetricDescription cpuMetric = new StatefulServiceLoadMetricDescription();
cpuMetric.Name = "CPU";
cpuMetric.PrimaryDefaultLoad = 10;
cpuMetric.SecondaryDefaultLoad = 5;
cpuMetric.AuxiliaryDefaultLoad = 0;
cpuMetric.Weight = ServiceLoadMetricWeight.High;
cpuMetric.MaximumLoad = 20;

StatefulServiceUpdateDescription updateDescription = new StatefulServiceUpdateDescription();
updateDescription.Metrics["CPU"] = cpuMetric;

await fabricClient.ServiceManager.UpdateServiceAsync(new Uri("fabric:/AppName/ServiceName"), updateDescription);

1.4. Pasos siguientes

Obtenga más información sobre el costo de movimiento del servicio.