null

Обновление конфигурации кластера Service Fabric в Unhealthy состоянии

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

Все описываемые операции выполняются в PowerShell, запущенном от имени Администратора после подключения к кластеру с помощью команды Connect-ServiceFabricCluster.

Процесс обновления конфигурации

Получение текущей конфигурации кластера

Изменение параметров Standalone-кластера происходит через файл ClusterConfig.json, который изначально использовался для создания кластера. В случае, если данный файл был утерян, получить актуальную конфигурацию можно следующей командой:

Get-ServiceFabricClusterConfiguration > ClusterConfig.old.json

Затем копируем полученный файл (в данном примере, в ClusterConfig.json) и изменяем необходимые параметры.

Обновляем версию конфигурации

Не забываем инкрементировать значение поля ClusterConfigurationVersion в ClusterConfig.json.

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

Проверка корректности конфигурации

После этого, необходимо проверить полученную конфигурацию на корректность, используя скрипт TestConfiguration.ps1 из Standalone пакета установки.

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

Скачивание Standalone и Runtime Packages

Получаем текущую версию SF с помощью команды Get-ServiceFabricNode. откуда берём параметр CodeVersion:

...
CodeVersion     : 6.4.622.9590
...

Скачиваем Snandalone Package по следующей ссылке, подставив вместо W.X.YYY.ZZZZ текущую версию кластера:

https://download.microsoft.com/download/8/3/6/836E3E99-A300-4714-8278-96BC3E8B5528/W.X.YYY.ZZZZ/Microsoft.Azure.ServiceFabric.WindowsServer.W.X.YYY.ZZZZ.zip

Проделываем то же самое с Runtime Package по этой ссылке:

https://download.microsoft.com/download/B/0/B/B0BCCAC5-65AA-4BE3-AB13-D5FF5890F4B5/W.X.YYY.ZZZZ/MicrosoftAzureServiceFabric.W.X.YYY.ZZZZ.cab

Например,

https://download.microsoft.com/download/8/3/6/836E3E99-A300-4714-8278-96BC3E8B5528/6.4.622.9590/Microsoft.Azure.ServiceFabric.WindowsServer.6.4.622.9590.zip
https://download.microsoft.com/download/B/0/B/B0BCCAC5-65AA-4BE3-AB13-D5FF5890F4B5/6.4.622.9590/MicrosoftAzureServiceFabric.6.4.622.9590.cab

Распаковываем Microsoft.Azure.ServiceFabric.WindowsServer.W.X.YYY.ZZZZ.zip, создаём в получившейся директории подкаталог DeploymentRuntimePackages, куда кладём скачанный MicrosoftAzureServiceFabric.W.X.YYY.ZZZZ.cab. Должна получиться следующая иерархия:

Microsoft.Azure.ServiceFabric.WindowsServer.6.4.622.9590
│
├───DeploymentRuntimePackages
│       MicrosoftAzureServiceFabric.6.4.622.9590.cab
│
│   AddNode.ps1
│   CertInstallUtilities.psm1
│   CertSetup.ps1
│   CleanFabric.ps1
│   ClusterConfig.gMSA.Windows.MultiMachine.json
│   ClusterConfig.Unsecure.DevCluster.Autoupgrade.json
│   ClusterConfig.Unsecure.DevCluster.json
│   ClusterConfig.Unsecure.MultiMachine.json
│   ClusterConfig.Unsecure.OneNode.json
│   ClusterConfig.Windows.DevCluster.json
│   ClusterConfig.Windows.MultiMachine.json
│   ClusterConfig.Windows.OneNode.json
│   ClusterConfig.Windows.X509.DevCluster.json
│   ClusterConfig.Windows.X509.MultiMachine.json
│   ClusterConfig.Windows.X509.OneNode.json
│   ClusterConfig.X509.DevCluster.json
│   ClusterConfig.X509.MultiMachine.json
│   ClusterConfig.X509.OneNode.json
│   CreateServiceFabricCluster.ps1
│   DeploymentComponentsAutoextractor.exe
│   DownloadServiceFabricRuntimePackage.ps1
│   EULA_ENU.txt
│   Readme.txt
│   RemoveNode.ps1
│   RemoveServiceFabricCluster.ps1
│   TestConfiguration.ps1
│   ThirdPartyNotice.rtf
│
└───Tools
        Microsoft.Azure.ServiceFabric.WindowsServer.SupportPackage.zip
        ServiceFabricUpdateService.zip

Проверяем конфигурацию

 .\TestConfiguration.ps1 -ClusterConfigFilePath ClusterConfig.json -OldClusterConfigFilePath ClusterConfig.old.json

DeploymentComponents extracted.
Trace folder doesn't exist. Creating trace folder: E:\Install\SF\Microsoft.Azure.ServiceFabric.WindowsServer.6.4.622.959
0\DeploymentTraces
Running Best Practices Analyzer...
Running Best Practices Upgrade Analyzer. Please make sure you are validating against the current cluster json config in
your cluster. Cluster configuration in the system may change after you add or remove node which means the original clust
er json config can't represent the cluster state anymore. You can get the latest configuration by Get-ServiceFabricClust
erConfiguration in Powershell.
Best Practices Analyzer completed successfully.


LocalAdminPrivilege        : True
IsJsonValid                : True
IsCabValid                 :
RequiredPortsOpen          : True
RemoteRegistryAvailable    : True
FirewallAvailable          : True
RpcCheckPassed             : True
NoDomainController         : True
NoConflictingInstallations : True
FabricInstallable          :
DataDrivesAvailable        : True
DrivesEnoughAvailableSpace : True
IsAllOrNoneIOTDevice       : True
DotNetExeInPath            : True
Passed                     : True

Если все тесты пройдены, приступаем к обновлению.

Обновление конфигурации

Обновление запускается командой Start-ServiceFabricClusterConfigurationUpgrade:

Start-ServiceFabricClusterConfigurationUpgrade -ClusterConfigPath <Path to Configuration File>

Следить за ходом обновления можно выполняя команду Get-ServiceFabricClusterUpgrade.

Обновление в состоянии Unhealth

В случае, если какие-то задеплоенные приложения не находятся в состоянии Healthy, обновление кластера будет откатываться обратно из-за настроек мониторинга состояния по умолчанию.

Чтобы выполнить обновление, потребуется смягчить политики мониторинга.

Обнаружение проблемы

В основном, причины остановки обновления конфигурации могут быть следующие:

Не удаётся пройти этап EnsurePartitionQuorum

На данном этапе происходит проверка того, что количество Partitions приложений удовлетворяют заданным ограничениям в их манифестах. Если же, кластеру по каким-то причинам не удаётся создать необходимое количество партиций на нодах, обновление ждёт, пока это (не)произойдёт, а затем останавливается по таймауту с ошибкой.

Чтобы это исправить, нужно сразу после запуска обновления, установить параметр ReplicaSetCheckTimeout в ноль:

Start-ServiceFabricClusterConfigurationUpgrade <...>

Update-ServiceFabricClusterUpgrade -UpgradeReplicaSetCheckTimeout 0
TargetCodeVersion                          : 6.4.622.9590
TargetConfigVersion                        : 3
StartTimestampUtc                          : 2/25/2019 7:55:54 AM
UpgradeState                               : RollingForwardInProgress
UpgradeDuration                            : 00:40:04
CurrentUpgradeDomainDuration               : 00:40:04
CurrentUpgradeDomainProgress               : UD0

                                             NodeName            : sf-cluster-node1
                                             UpgradePhase        : PreUpgradeSafetyCheck
                                             PendingSafetyChecks :
                                                EnsurePartitionQuorum - PartitionId: 3ce8214d-d614-40a2-8127-bbbc6ca6179c
NextUpgradeDomain                          : UD1
UpgradeDomainsStatus                       : { "UD0" = "InProgress";
                                             "UD1" = "Pending";
                                             "UD2" = "Pending" }
UpgradeKind                                : Rolling
RollingUpgradeMode                         : Monitored
FailureAction                              : Rollback
ForceRestart                               : False
UpgradeReplicaSetCheckTimeout              : 49710.06:28:15
HealthCheckWaitDuration                    : 00:00:00
HealthCheckStableDuration                  : 00:00:00
HealthCheckRetryTimeout                    : 00:10:00
UpgradeDomainTimeout                       : 37201.09:59:01
UpgradeTimeout                             : 37201.09:59:01
ConsiderWarningAsError                     : False
MaxPercentUnhealthyApplications            : 0
MaxPercentUnhealthyNodes                   : 0
ApplicationTypeHealthPolicyMap             : {}
EnableDeltaHealthEvaluation                : True
MaxPercentDeltaUnhealthyNodes              : 0
MaxPercentUpgradeDomainDeltaUnhealthyNodes : 0
ApplicationHealthPolicyMap                 : {}

Превышен параметр MaxPercentUnhealthyNodes

Максимальное количество Unhealthy нод по умолчанию - 0. Поэтому, если уже имеется некоторое количество нездоровых нод, нужно запускать обновление с таким значением параметра MaxPercentUnhealthyNodes, чтобы оно перекрывало фактическое количество таких нод.

Во время старта:

Start-ServiceFabricClusterConfigurationUpgrade -MaxPercentUnhealthyNodes 67 <...>

После старта:

Update-ServiceFabricClusterUpgrade -MaxPercentUnhealthyNodes 67
TargetCodeVersion             : 6.4.622.9590
TargetConfigVersion           : 1
StartTimestampUtc             : 2/25/2019 8:46:03 AM
FailureTimestampUtc           : 2/25/2019 9:09:30 AM
FailureReason                 : Interrupted
UpgradeState                  : RollingBackInProgress
UpgradeDuration               : 00:25:03
CurrentUpgradeDomainDuration  : 00:01:00
CurrentUpgradeDomainProgress  : UD1

                                NodeName            : sf-cluster-node2
                                UpgradePhase        : PreUpgradeSafetyCheck
                                PendingSafetyChecks :
                                        EnsureSeedNodeQuorum
NextUpgradeDomain             : UD1
UpgradeDomainsStatus          : { "UD0" = "Completed";
                                "UD1" = "Pending";
                                "UD2" = "Pending" }
UnhealthyEvaluations          :
                                Unhealthy nodes: 66% (2/3), MaxPercentUnhealthyNodes=0%.

                                Unhealthy node: NodeName='sf-cluster-node2', AggregatedHealthState='Error'.

                                        Error event: SourceId='FabricDCA', Property='DataCollectionAgent'.
                                        Exception occured while creating an object of type FabricDCA.FileShareEtwCsvUploader
                                (assembly FileShareUploader, Version=6.0.0.0, Culture=neutral,
                                PublicKeyToken=31bf3856ad364e35) for creating consumer FileShareWinFabEtw.

                                Unhealthy node: NodeName='sf-cluster-node1', AggregatedHealthState='Error'.

                                        Error event: SourceId='FabricDCA', Property='DataCollectionAgent'.
                                        Exception occured while creating an object of type FabricDCA.FileShareEtwCsvUploader
                                (assembly FileShareUploader, Version=6.0.0.0, Culture=neutral,
                                PublicKeyToken=31bf3856ad364e35) for creating consumer FileShareWinFabEtw.

UpgradeKind                   : Rolling
RollingUpgradeMode            : UnmonitoredAuto
ForceRestart                  : False
UpgradeReplicaSetCheckTimeout : 00:00:00

Превышен параметр MaxPercentUnhealthyApplications

Максимальное количество Unhealthy приложений по умолчанию - 0. Поэтому, если уже имеется некоторое количество нездоровых приложений, нужно запускать обновление с таким значением параметра MaxPercentUnhealthyApplications, чтобы оно перекрывало фактическое количество таких приложений.

Во время старта:

Start-ServiceFabricClusterConfigurationUpgrade -MaxPercentUnhealthyApplications 27 <...>

После старта:

Update-ServiceFabricClusterUpgrade -MaxPercentUnhealthyApplications 27
TargetCodeVersion                          : 6.4.622.9590
TargetConfigVersion                        : 5
StartTimestampUtc                          : 2/25/2019 9:22:50 AM
UpgradeState                               : RollingForwardPending
UpgradeDuration                            : 00:02:00
CurrentUpgradeDomainDuration               : 00:02:00
NextUpgradeDomain                          : UD1
UpgradeDomainsStatus                       : { "UD0" = "Completed";
                                             "UD1" = "Pending";
                                             "UD2" = "Pending" }
UnhealthyEvaluations                       :
                                             Unhealthy applications: 26% (6/23), MaxPercentUnhealthyApplications=0%.

                                             Unhealthy application: ApplicationName='fabric:/Dev.App.ApplicationA', AggregatedHealthState='Error'.

                                                Unhealthy deployed applications: 50% (1/2), MaxPercentUnhealthyDeployedApplications=0%.

                                                Unhealthy deployed application: ApplicationName='fabric:/Dev.App.ApplicationA', NodeName='sf-cluster-node2',
                                             AggregatedHealthState='Error'.

                                                        Unhealthy deployed service packages: 100% (1/1).

                                                        Unhealthy deployed service package: ApplicationName='fabric:/Dev.App.ApplicationA',
                                             ServiceManifestName='Dev.App.ApplicationA.Service1', ServicePackageActivationId='', NodeName='sf-cluster-node2',
                                             AggregatedHealthState='Error'.

                                                                Error event: SourceId='System.Hosting', Property='Activation:1.0:1.12:131620483436573681'.
                                                                There was an error during activation.EndpointProviderPortRangeExhausted


                                             Unhealthy application: ApplicationName='fabric:/Dev.App.ApplicationF', AggregatedHealthState='Error'.

                                                Unhealthy services: 100% (1/1), ServiceType='Service1Type', MaxPercentUnhealthyServices=0%.

                                                Unhealthy service: ServiceName='fabric:/Dev.App.ApplicationF/Service1',
                                             AggregatedHealthState='Error'.

                                                        Unhealthy partitions: 100% (5/5), MaxPercentUnhealthyPartitionsPerService=0%.

                                                        Unhealthy partition: PartitionId='063fe200-e01e-441a-b2e8-90a7c5c531d5', AggregatedHealthState='Error'.

                                                                Error event: SourceId='System.FM', Property='State'.
                                                                Partition is in quorum loss.
                                             fabric:/Dev.App.ApplicationF/Service1 1 1 063fe200-e01e-441a-b2e8-90a7c5c531d5
                                               N/P Down sf-cluster-node1 131955589271462113

                                             For more information see: http://aka.ms/sfhealth


UpgradeKind                                : Rolling
RollingUpgradeMode                         : Monitored
FailureAction                              : Rollback
ForceRestart                               : False
UpgradeReplicaSetCheckTimeout              : 00:00:00
HealthCheckWaitDuration                    : 00:00:00
HealthCheckStableDuration                  : 00:00:00
HealthCheckRetryTimeout                    : 00:10:00
UpgradeDomainTimeout                       : 37201.09:59:01
UpgradeTimeout                             : 37201.09:59:01
ConsiderWarningAsError                     : False
MaxPercentUnhealthyApplications            : 9
MaxPercentUnhealthyNodes                   : 67
ApplicationTypeHealthPolicyMap             : {}
EnableDeltaHealthEvaluation                : True
MaxPercentDeltaUnhealthyNodes              : 0
MaxPercentUpgradeDomainDeltaUnhealthyNodes : 0
ApplicationHealthPolicyMap                 : {}

Примечание

Устанавливать два вышеуказанных параметра MaxPercentUnhealthyNodes и MaxPercentUnhealthyApplications необходимо только вместе, поэтому, если есть необходимость установить их оба, пользуясь командой нужно повторно указать предыдущий заданный параметр, чтобы он не сбросился в ноль:

Во время старта:

Start-ServiceFabricClusterConfigurationUpgrade -MaxPercentUnhealthyNodes 67 -MaxPercentUnhealthyApplications 27 <...>

После старта:

Update-ServiceFabricClusterUpgrade -MaxPercentUnhealthyNodes 67 -MaxPercentUnhealthyApplications 27