Поделиться через


1. Конфиденциальность службы

Диспетчер кластерных ресурсов Service Fabric предоставляет интерфейс для настройки стоимости перемещения, чтобы разрешить корректировку приоритета отказоустойчивости службы при перемещении для балансировки, дефрагментации или других требований. Однако стоимость перемещения имеет несколько ограничений для удовлетворения потребностей клиентов. Например, затраты на перемещение не могут явно оптимизировать отдельный шаг, так как диспетчер кластерных ресурсов (CRM) зависит от общей оценки всех движений, выполненных в одном алгоритме. Перемещение затрат не работает, когда CRM проводит переключения. Это связано с тем, что все реплики имеют одинаковые затраты на переключение, что приводит к сбою ограничения отработки отказа переключения для конфиденциальных реплик. Другое ограничение заключается в том, что стоимость перемещения предоставляет только четыре возможных значения (ноль, низкий, средний, высокий) и одно специальное значение (очень высокое) для настройки приоритета реплики. Это не обеспечивает достаточной гибкости для дифференциации чувствительности реплик при переключении на резервный экземпляр.

CRM представила функцию чувствительности начиная с Service Fabric версии 10.1. В настоящее время эта функция связывает службу с логовой переменной IsMaximumSensitivity, указывая, является ли реплика службы наиболее конфиденциальной или нет. CRM обеспечивает максимальную защиту при отказе для этих типов реплик. Другими словами, если для службы IsMaximumSensitivity задано значение true, реплика с максимальной чувствительностью (MSR) этой службы может быть перемещена или заменена только в следующих неизбежных случаях:

  • Нарушение ограничения FD/UD происходит только в том случае, если для FD/UD установлено жесткое ограничение.
  • Переключение реплики во время обновления
  • Нарушение емкости узла при наличии на узле только MSR (т. е. если на узле есть что-либо, кроме MSR, MSR не перемещается).

Например, в сценарии, указанном в таблице, узел 1 находится под нарушением емкости узла, так как нагрузка узла 150 превышает емкость узла 100. С другой стороны, узел 2 полностью пуст. В этом случае обе MSR являются неподвижными, поскольку немаршрутный узел перемещается на узел 2, чтобы устранить нарушение.

Узел Загрузка узла и емкость Загрузка службы MSR 1 Загрузка службы MSR 2 Загрузка службы, отличной от MSR
Узел 1 150/100 50 50 50
Узел 2 0/100

Хотя в следующем случае два MSR с нагрузкой 60 каждый размещаются на узле 1, что приводит к превышению его емкости. Узел 2 имеет пространство 80 и на нем размещена одна нагрузка типа Non-MSR (нагрузка = 20). Один из MSR на узле 1 должен быть перемещен на узел 2, так как на узле 1 не присутствует Non-MSR, чтобы устранить нарушение.

Узел Загрузка узла и емкость Загрузка службы MSR 1 Загрузка службы MSR 2 Загрузка службы, отличной от MSR
Узел 1 120/100 60 60
Узел 2 20/100 20

Функция чувствительности позволяет нескольким MSR размещаться на одном узле. Тем не менее, чрезмерное количество MSR может привести к нарушению емкости узла. Таким образом, функция IsMaximumSensitivityвводит максимальную нагрузку на метрику, чтобы убедиться, что сумма максимальных нагрузок для каждой метрики меньше или равна емкости узла этой метрики. С установлением этой верхней границы CRM может безопасно размещать несколько МСР на одном узле, избегая ситуации, когда единственным способом исправить нарушение емкости узла является перемещение максимально чувствительной реплики.

Предположим, что для узла кластера определены две метрики клиента: MetricA и MetricB. Емкость узлов для MetricA и MetricB — 100 и 4 соответственно.

В таблице приведены несколько примеров о размещении реплик максимальной чувствительности. Для трех сценариев, перечисленных в таблице, предположим, что на узле уже существует одна реплика максимальной чувствительности, и требуется, чтобы MaxLoad для метрики A или MetricB был положительным. Возможность размещения большего количества MSR на этом узле зависит от оставшегося места на узле и ресурсов, необходимых для новых MSR.

  1. Дополнительные MSR можно поместить на этот узел, если он не вызывает нарушения нагрузки узла или максимальной загрузки емкости. (т. е., MetricA (Max)Load <= 50 && MetricB (Max)Load <= 2).
  2. Другие MSR не могут быть помещены на этот узел, поскольку MaxLoads как для MetricA, так и для MetricB достигают максимальной нагрузки узла.
  3. Другие MSR не могут быть размещены на этом узле, так как MaxLoad для MetricB достигает максимальной нагрузки узла, несмотря на то, что с точки зрения MetricA место ещё есть.
Номер сценария Загрузка MetricA MetricB: загрузка МаксимальнаяЧувствительность MetricA MaxLoad MetricB MaxLoad Можно ли разместить на этом узле другой MSR?
1 50 2 истинное 50 2 Да
2 100 2 true 100 4 Нет
3 50 2 истина 50 4 Нет

Примечание.

Текущая функция чувствительности предоставляет только функцию MSR. Для не-MSR, но с разными значениями чувствительности, CRM обрабатывает их одинаково с точки зрения чувствительности.

1.1. Включение и отключение чувствительности службы

Функция чувствительности включена или отключена, задав настройку EnableServiceSensitivity в PlacementAndLoadBalancing разделе манифеста кластера с помощью XML или JSON.

В ClusterManifest.xml:

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

С помощью файла ClusterConfig.json для автономных развертываний или Template.json для кластеров, размещенных в Azure.

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

1.2. Установить чувствительность службы

Примечание.

Хотя это не обязательно, чтобы задать службу максимальной чувствительности, рекомендуется установить соответствующую Максимальную Нагрузку, чтобы избежать переполнения емкости узла при сочетании нескольких служб максимальной чувствительности на одном узле. Дополнительные сведения см. в разделе "Настройка максимальной нагрузки ".

1.2.1. Использование манифеста приложения

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

1.2.2. Использование API PowerShell

Чтобы указать чувствительность службы при создании:

$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

Чтобы динамически указать или обновить чувствительность для существующей услуги, выполните указанные действия.

$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. Использование API C#

Чтобы указать чувствительность службы при создании:

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

Чтобы динамически указать или обновить чувствительность для существующей службы.

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. Установка максимальной нагрузки

Примечание.

Значение по умолчанию для типа MaximumLoad — 0. Когда пользователь указывает положительное значение для MaximumLoad, ему необходимо сначала установить IsMaximumSensitivity соответствующей службы как true. Другое требование: MaximumLoad равно или больше всех загрузок по умолчанию в одной и той же метрике.

1.3.1. Использование манифеста приложения

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

1.3.2. Использование API PowerShell

Чтобы указать максимальную нагрузку для службы при создании:

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

Чтобы указать или обновить максимальную нагрузку для существующей службы:

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

1.3.3. Использование API C#

Чтобы указать чувствительность службы при ее создании:

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

Чтобы указать или обновить максимальную нагрузку для существующей службы:

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. Следующие шаги

Дополнительные сведения о затратах на перемещение служб.