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


Общие сведения о динамических тегах узлов

Теги узлов позволяют динамически добавлять и удалять теги для узлов, чтобы повлиять на размещение служб. Расстановка тегов узлов является очень гибкой и позволяет вносить изменения в размещение служб без обновлений приложений или кластеров. Теги можно добавлять или удалять для узлов в любое время, а службы могут задавать требования к конкретным тегам при их создании. Кроме того, требования к тегам для службы могут быть динамически изменены во время ее выполнения.

Тегирование узлов похоже на ограничения размещения и обычно используется для управления узлами, на которых выполняется служба. Каждую службу Service Fabric можно настроить так, чтобы она требовала наличие тега для размещения или продолжала работать.

Расстановка тегов узлов поддерживается для всех типов размещенных служб Service Fabric (Reliable Services, гостевые исполняемые файлы и контейнеры). Чтобы использовать тегирование узлов, вам понадобится среда выполнения Service Fabric версии 8.0 или более поздней.

В остальной части этой статьи описаны способы включения или отключения тегирования узлов, а также приведены примеры использования этой функции.

Описание динамических тегов узлов

Службы могут указывать теги, которые им требуются. Существует два типа тегов.

  • Теги, необходимые для размещения: описывают набор тегов, которые необходимы только для размещения службы. После размещения реплики эти теги можно удалить, не нарушая работу службы. При удалении какого-либо из этих тегов с узла реплика службы продолжит работать, а Service Fabric не удалит эту службу.

  • Теги, необходимые для выполнения: описывают набор тегов, необходимых для размещения и выполнения службы. При удалении какого-либо из необходимых для выполнения тегов Service Fabric переместит службу на другой узел, где эти теги заданы.

Пример: Теги, необходимые для размещения, можно использовать, когда вы применяете определённый тип службы активации контейнера, и эта служба нужна для того, чтобы разместить контейнер. Как только контейнер активируется, активатор больше не требуется, и связанный с ним тег можно удалить, однако контейнер должен продолжать работать. Теги, необходимые для запуска, можно использовать, если у вас есть служба выставления счетов, которую удобно совместно размещать со службой, ориентированной на пользователей. При сбое службы выставления счетов на узле вы удаляете связанный с ней тег, и служба, ориентированная на пользователей, перемещается на другой узел, где есть служба выставления счетов и присутствует ее тег.

Тег или набор тегов можно добавлять, обновлять или удалять на одном узле с помощью стандартных механизмов интерфейса Service Fabric, таких как интерфейсы API C#, интерфейсы REST API и команды PowerShell.

Примечание.

Service Fabric не обеспечивает распределение по доменам обновления/сбоя при использовании тегов узлов. Управляйте тегами узлов правильно, чтобы избежать нарушений FD/UD из-за плохого распределения тегов по доменам.

Включение динамических тегов узлов

Чтобы эта функция работала, потребуется включить конфигурацию NodeTaggingEnabled в разделе PlacementAndLoadBalancing манифеста кластера, используя XML или JSON.

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

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

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

Настройка динамических тегов узлов

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

Добавление тегов к узлу

Add-ServiceFabricNodeTags -NodeName "DB.1" -NodeTags @("SampleTag1", "SampleTag2")

Эта команда добавит теги SampleTag1 и SampleTag2 для узла DB.1.

Удаление тегов из узла

Remove-ServiceFabricNodeTags -NodeName "DB.1" -NodeTags @("SampleTag1", "SampleTag2")

Эта команда удалит теги SampleTag1 и SampleTag2 для узла DB.1.

Использование программных интерфейсов C#

Добавление тегов к узлу

FabricClient fabricClient = new FabricClient();
List<string> nodeTagsList = new List<string>();
nodeTagsList.Add("SampleTag1");
nodeTagsList.Add("SampleTag2");
await fabricClient.ClusterManager.AddNodeTagsAsync("DB.1", nodeTagsList);

Удаление тегов из узла

FabricClient fabricClient = new FabricClient();
List<string> nodeTagsList = new List<string>();
nodeTagsList.Add("SampleTag1");
nodeTagsList.Add("SampleTag2");
await fabricClient.ClusterManager.RemoveNodeTagsAsync("DB.1", nodeTagsList);

Установка обязательных тегов для служб

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

Создание новой службы

New-ServiceFabricService -ApplicationName fabric:/HelloWorld -ServiceName fabric:/HelloWorld/svc1 -ServiceTypeName HelloWorldStateful -Stateful -PartitionSchemeSingleton -TargetReplicaSetSize 5 -MinReplicaSetSize 3 -TagsRequiredToRun @("SampleTag1") - TagsRequiredToPlace @("SampleTag2")

Эта команда создает службу, которая требует наличие тега SampleTag2 на узле, чтобы службу можно было там разместить, и тега SampleTag1 для продолжения выполнения службы на этом узле.

Обновление существующей службы

Update-ServiceFabricService -Stateful -ServiceName fabric:/myapp/test -TagsRequiredToRun @("SampleTag1") -TagsRequiredToPlace @("SampleTag2")

Эта команда обновляет службу, которая требует наличие тега SampleTag2 на узле, чтобы службу можно было там разместить, и тега SampleTag1 для продолжения выполнения службы на этом узле.

Использование программных интерфейсов C#

Создание новой службы

FabricClient fabricClient = new FabricClient();
StatefulServiceDescription serviceDescription = new StatefulServiceDescription();
//set up the rest of the ServiceDescription
ServiceTags serviceTags = new ServiceTags();
serviceTags.TagsRequiredToPlace.Add("SampleTag1");
serviceTags.TagsRequiredToRun.Add("SampleTag2");
serviceDescription.ServiceTags = serviceTags;
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Обновление существующей службы

FabricClient fabricClient = new FabricClient();
StatefulServiceUpdateDescription serviceUpdate = new StatefulServiceUpdateDescription();
ServiceTags serviceTags = new ServiceTags();
serviceTags.TagsRequiredToPlace.Add("SampleTag1");
serviceTags.TagsRequiredToRun.Add("SampleTag2");
serviceUpdate.ServiceTags = serviceTags;
await fabricClient.ServiceManager.UpdateServiceAsync(new Uri("fabric:/AppName/ServiceName"), serviceUpdate);

Все эти команды аналогичным образом применяются к бестейтовым службам.

Следующие шаги

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