Планирование ресурсов и масштабирование для Azure Service Fabric

Прежде чем создавать кластер Azure Service Fabric или масштабировать вычислительные ресурсы для размещения этого кластера, важно правильно оценить производительность. См. дополнительные сведения о планировании загрузки кластера Service Fabric. Дополнительные рекомендации по масштабируемости кластера см. в статье Рекомендации по масштабируемости Service Fabric.

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

Автомасштабирование

Операции масштабирования следует выполнять с помощью шаблонов Azure Resource Manager, так как рекомендуется рассматривать конфигурации ресурсов как код.

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

  • Если развертывание шаблонов Resource Manager с объявленной емкостью не подходит для вашего варианта использования.

    В дополнение к ручному масштабированию можно настроить конвейер непрерывной интеграции и доставки в Azure DevOps Services с помощью проектов развертывания группы ресурсов Azure. Этот конвейер обычно запускается приложением логики, которое использует метрики производительности виртуальной машины, запрашиваемые из REST API Azure Monitor. Конвейер эффективно автомасштабируется на основе любых нужных метрик, при этом выполняется оптимизация шаблонов Resource Manager.

  • В один момент времени нужно выполнить горизонтальное масштабирование только одного узла масштабируемого набора виртуальных машин.

    Для горизонтального увеличения масштаба по трем или более узлам за раз необходимо горизонтально увеличить масштаб кластера Service Fabric, добавив масштабируемый набор виртуальных машин. Надежнее всего горизонтально уменьшать и увеличивать масштаб масштабируемых наборов виртуальных машин по горизонтали по одному узлу за раз.

  • Необходимо использовать уровень надежности Silver или выше для кластера Service Fabric, а также уровень устойчивости Silver или выше для любого масштаба, для которого вы настраиваете правила автомасштабирования.

    Минимальная емкость для правил автомасштабирования должна быть больше или равна пяти экземплярам виртуальных машин. Она также должна быть больше или равна минимальному уровню надежности для узла основного типа.

Примечание

Service Fabric с отслеживанием состояния fabric:/System/InfastructureService/<NODE_TYPE_NAME> работает на каждом типе узла, который имеет устойчивость уровня Silver или более высокую. Это единственная системная служба, которая работает в Azure на любом из типов узлов кластера.

Важно!

Автомасштабирование Service Fabric поддерживает конфигурации горизонтального уменьшения масштаба масштабируемых наборов виртуальных машин Default и NewestVM.

Рекомендации по вертикальному масштабированию

Для вертикального масштабирования типа узла в Azure Service Fabric требуется выполнить несколько шагов и удовлетворить некоторые требования. Пример:

  • Масштабируемый кластер должен быть работоспособным. В противном случае будет дестабилизироваться кластер.
  • Уровень устойчивости Silver или выше требуется для всех типов узлов кластера Service Fabric, в котором размещены службы с отслеживанием состояния.

Примечание

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

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

Ваш кластер использует свойства узла и ограничения на размещение Service Fabric, чтобы выбрать место для размещения служб приложений. При вертикальном масштабировании узла основного типа вы развернете второй узел основного типа, а затем установите ("isPrimary": false) на исходном узле основного типа, а затем отключите его узлы и удалите его масштабируемый набор и связанные с ним ресурсы. Дополнительные сведения см. в статье Вертикальное увеличение масштаба узла основного типа кластера Service Fabric.

Примечание

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

Объявив свойства узла и ограничения на размещение, выполните следующие шаги поочередно для каждого экземпляра виртуальной машины. Это позволит корректно завершить работу системных служб (и служб с отслеживанием состояния) на удаляемом экземпляре виртуальной машины по мере создания новых реплик в других расположениях.

  1. В PowerShell выполните Disable-ServiceFabricNode с намерением RemoveNode, чтобы отключить удаляемый узел. Удалите тип узла с наибольшим номером. Например, если ваш кластер содержит шесть узлов, удалите экземпляр виртуальной машины MyNodeType_5.
  2. Выполните Get-ServiceFabricNode и убедитесь, что этот узел перешел в отключенное состояние. Если это не так, подождите, пока узел не будет отключен. Этот процесс для каждого узла может занять несколько часов. Не продолжайте процесс, пока узел не перейдет в отключенное состояние.
  3. Уменьшите на единицу число виртуальных машин для соответствующего типа узла. Будет удален самый верхний экземпляр виртуальной машины.
  4. При необходимости повторите шаги 1–3, но никогда не следует уменьшать число экземпляров в типах первичных узлов до значения меньше гарантируемого уровнем надежности. См. рекомендации по планированию загрузки кластера Service Fabric.
  5. После того как все виртуальные машины будут удалены (будет отображаться состояние "Отключено"), fabric:/System/InfrastructureService/[имя узла] будет отображать состояние ошибки. Затем можно обновить ресурс кластера, чтобы удалить тип узла. Можно либо использовать развертывание шаблона ARM, либо изменить ресурс кластера с помощью Azure Resource Manager. Это приведет к запуску обновления кластера, что приведет к удалению службы fabric:/System/InfrastructureService/[тип узла], которая находится в состоянии ошибки.
  6. После этого вы можете удалить VMScaleSet, однако в представлении Service Fabric Explorer для узлов по-прежнему будет отображаться состояние "Отключено". Последним шагом будет очистить их с помощью команды Remove-ServiceFabricNodeState.

Горизонтальное масштабирование

Горизонтальное масштабирование можно выполнять либо вручную, либо программно.

Примечание

Для типов узлов с уровнем устойчивости Silver или Gold масштабирование будет происходить медленно.

Развертывание

Горизонтально увеличьте масштаб кластера Service Fabric, увеличив число экземпляров для конкретного масштабируемого набора виртуальных машин. Горизонтальное увеличение масштаба можно выполнить программным способом, указав AzureClient и ID для того масштабируемого набора, размер которого вы намерены увеличить.

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);
var newCapacity = (int)Math.Min(MaximumNodeCount, scaleSet.Capacity + 1);
scaleSet.Update().WithCapacity(newCapacity).Apply(); 

Чтобы горизонтально увеличить масштаб кластер вручную, измените значение емкости в свойстве SKU для ресурса нужного масштабируемого набора виртуальных машин.

"sku": {
    "name": "[parameters('vmNodeType0Size')]",
    "capacity": "[parameters('nt0InstanceCount')]",
    "tier": "Standard"
}

Уменьшение масштаба

Уменьшение масштаба нужно выполнять осторожнее, чем увеличение. Примеры:

  • Системные службы Service Fabric запускаются в кластере на узле основного типа. Никогда не уменьшайте число экземпляров узлов для этого типа ниже значения, которое гарантирует соответствующий уровень надежности.
  • Для службы с отслеживанием состояния определенное количество узлов должно постоянно работать, чтобы поддерживать доступность этой службы и сохранять ее состояние. Количество узлов должно быть не меньше количества целевых наборов реплик секции или службы.

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

  1. В PowerShell выполните Disable-ServiceFabricNode с намерением RemoveNode, чтобы отключить удаляемый узел. Удалите тип узла с наибольшим номером. Например, если ваш кластер содержит шесть узлов, удалите экземпляр виртуальной машины MyNodeType_5.
  2. Выполните Get-ServiceFabricNode и убедитесь, что этот узел перешел в отключенное состояние. Если это не так, подождите, пока узел не будет отключен. Этот процесс для каждого узла может занять несколько часов. Не продолжайте процесс, пока узел не перейдет в отключенное состояние.
  3. Уменьшите на единицу число виртуальных машин для соответствующего типа узла. Будет удален самый верхний экземпляр виртуальной машины.
  4. При необходимости повторяйте шаги с 1 по 3, пока вы не достигнете нужной емкости. Никогда не уменьшайте число экземпляров в узлах основного типа ниже значения, которое гарантирует соответствующий уровень надежности. См. рекомендации по планированию загрузки кластера Service Fabric.

Чтобы горизонтально уменьшить масштаб кластера вручную, измените значение емкости в свойстве SKU для нужного ресурса масштабируемого набора виртуальных машин.

"sku": {
    "name": "[parameters('vmNodeType0Size')]",
    "capacity": "[parameters('nt0InstanceCount')]",
    "tier": "Standard"
}

Чтобы горизонтально уменьшить масштаб программным способом, необходимо подготовить узел к завершению работы. Найдите узел, который нужно удалить (узел с наивысшим номером). Пример:

using (var client = new FabricClient())
{
    var mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync())
        .Where(n => n.NodeType.Equals(NodeTypeToScale, StringComparison.OrdinalIgnoreCase))
        .Where(n => n.NodeStatus == System.Fabric.Query.NodeStatus.Up)
        .OrderByDescending(n =>
        {
            var instanceIdIndex = n.NodeName.LastIndexOf("_");
            var instanceIdString = n.NodeName.Substring(instanceIdIndex + 1);
            return int.Parse(instanceIdString);
        })
        .FirstOrDefault();

Отключите и удалите узел, указав тот же экземпляр FabricClient (в нашем примере это client) и экземпляра узла (в нашем примере это instanceIdString), которые вы использовали в коде выше:

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);

// Remove the node from the Service Fabric cluster
ServiceEventSource.Current.ServiceMessage(Context, $"Disabling node {mostRecentLiveNode.NodeName}");
await client.ClusterManager.DeactivateNodeAsync(mostRecentLiveNode.NodeName, NodeDeactivationIntent.RemoveNode);

// Wait (up to a timeout) for the node to gracefully shut down
var timeout = TimeSpan.FromMinutes(5);
var waitStart = DateTime.Now;
while ((mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Up || mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Disabling) &&
        DateTime.Now - waitStart < timeout)
{
    mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync()).FirstOrDefault(n => n.NodeName == mostRecentLiveNode.NodeName);
    await Task.Delay(10 * 1000);
}

// Decrement virtual machine scale set capacity
var newCapacity = (int)Math.Max(MinimumNodeCount, scaleSet.Capacity - 1); // Check min count 

scaleSet.Update().WithCapacity(newCapacity).Apply();

Примечание

При горизонтальном уменьшении масштаба в кластере вы увидите, что удаленный экземпляр узла или виртуальной машины отображается в Service Fabric Explorer в неработоспособном состоянии. Объяснение этого поведения см. в статье Возможные варианты поведения в Service Fabric Explorer. Вы можете:

Уровни надежности

Уровень надежности является свойством вашего кластерного ресурса Service Fabric. Его нельзя настроить по-разному для отдельных типов узлов. Он определяет коэффициент репликации для системных служб кластера и применяется на уровне ресурса кластера.

Уровень надежности определяет минимальное количество узлов для узла основного типа. Уровень надежности может принимать следующие значения:

  • Platinum — запуск системных служб с целевым количеством семь для набора реплик и девятью начальными узлами.
  • Gold — запуск системных служб с целевым количеством семь для набора реплик и семью начальными узлами.
  • Silver — запуск системных служб с целевым количеством пять для набора реплик и пятью начальными узлами.
  • Bronze — запуск системных служб с целевым количеством три для набора реплик и тремя начальными узлами.

Мы рекомендуем использовать уровень надежности не ниже Silver.

Уровень надежности задается в разделе свойств для ресурса Microsoft.ServiceFabric/clusters, как показано ниже:

"properties":{
    "reliabilityLevel": "Silver"
}

Уровни устойчивости

Предупреждение

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

Используйте уровень устойчивости Bronze только для тех типов узлов, на которых выполняются рабочие нагрузки без учета состояния. Для рабочих нагрузок используйте уровень Silver или выше, чтобы обеспечить согласованность состояния. Выберите уровень надежности, следуя рекомендациям в документации по планированию ресурсов.

Уровень устойчивости настраивается для двух ресурсов. Первый — профиль расширения для масштабируемого набора виртуальных машин:

"extensionProfile": {
    "extensions":          {
        "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType0Name')]",
        "properties": {
            "settings": {
                "durabilityLevel": "Bronze"
            }
        }
    }
}

Второй — nodeTypes для ресурса Microsoft.ServiceFabric/clusters:

"nodeTypes": [
    {
        "name": "[variables('vmNodeType0Name')]",
        "durabilityLevel": "Bronze"
    }
]

Дальнейшие действия