Service Fabric - 无法进行配置升级以添加或删除节点

Posted

技术标签:

【中文标题】Service Fabric - 无法进行配置升级以添加或删除节点【英文标题】:Service Fabric - Cannot do Config upgrade to add or remove nodes 【发布时间】:2019-07-28 01:16:07 【问题描述】:

我有一个由 18 个节点(9 个是种子节点)组成的本地 Service Fabric - 通过 gMSA Windows 安全性进行保护。集群代码版本 6.4.622.9590

不幸的是,我必须重建其中的 6 个节点(3 个种子节点)。他们都住在一个数据中心(集群跨越 3 个数据中心)。因此,我希望删除这 6 个节点,重建它们,然后重新添加它们。

根据MSDOCs,添加/删除节点是通过配置升级执行的。注意:我最近已经使用这个过程添加了 12 个节点,所以很好理解 SF 配置升级的概念。

不幸的是,在删除节点之前,我无法在此集群上进行任何配置升级 - 这是由于 Start-ServiceFabricClusterConfigurationUpgradepowershell 命令报告的 ValidationExceptions:

如果我不将 6 个节点添加到“NodesToBeRemoved”部分,我会收到验证错误,即并非所有已删除的节点都在此字段中 如果添加 6 个节点,则会收到以下验证错误:
Start-ServiceFabricClusterConfigurationUpgrade : 
System.Runtime.InteropServices.COMException (-2147017627)
ValidationException: Model validation error. Removing a non-seed node and changing reliability level in the same
upgrade is not supported. Initiate an upgrade to remove node first and then change the reliability level.
At line:1 char:1
+ Start-ServiceFabricClusterConfigurationUpgrade -ClusterConfigPath "AL ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Microsoft.Servi...usterConnection:ClusterConnection) [Start-ServiceFa
   ...gurationUpgrade], FabricException
    + FullyQualifiedErrorId : StartClusterConfigurationUpgradeErrorId,Microsoft.ServiceFabric.Powershell.StartClusterC
   onfigurationUpgrade

所以,我们被困住了!我还已经删除了节点状态,因此所有 6 个节点都处于“无效状态”。 Get-ServiceFabricClusterConfiguration 不会返回这 6 个节点,但它们仍会显示在 SF Explorer 中并列在集群清单 XML 文件中。

就可靠性级别而言 - 我很确定在 SF 中无法再改变这一点;即旧版本的 SF 允许您在配置文件中配置青铜/银/金,但在最近的版本中(+6.0??) - 这是一个计算字段,由 SF 内部管理。无论如何——因为种子节点将从 9 个减少到 6 个,我怀疑内部计算的可靠性水平会下降(大概从黄金到白银)。

我还遇到过hack,有人用它来删除集群中的节点...但在我的场景中,节点仍列在清单文件中...尽管如此,hack 和 production 永远不应该相遇!

那么,如何让我们的生产集群摆脱这种情况?重建集群不是一种选择(这就是集群的全部原因......高可用性!)。

【问题讨论】:

【参考方案1】:

我发现上述错误主要是由于缺乏明确记录的程序以及在进行服务结构配置升级时出现错误/误导性错误消息的症状。

我自己进行了很多测试,以确保我可以自信地从集群中添加/删除多个节点。我还删除了足够的节点以将种子节点从 9 删除到 6。

因此,要解决上述问题,我必须执行以下操作来删除节点:

    使用 SF 资源管理器删除节点状态 - 这将节点状态从错误更改为无效 通过 Get-ServiceFabricClusterConfiguration 获取最新的 json 配置 从节点部分删除节点 完全删除 NodesToBeRemoved json 部分(即,如果要删除的节点列表为空,则会收到不一致的错误 - 所以只需删除包含的 json 块 进行配置更新

注意:最初我只尝试执行上面的 2-5 - 但它不起作用,节点仍处于错误状态。

也就是说,根据我的经验,删除节点时还请注意以下几点(此信息在MSDOC 中不清楚:

可以一次删除多个种子节点(我想这样做以尝试复制上述场景) 您也可以一次添加多个节点 - 请注意,您可能不会通过 SF 配置升级状态工具看到任何活动/指示 任何事情都在发生...准备等待至少 +15 分钟 (取决于你要添加多少节点......毕竟,SF 正在复制 安装文件到节点) 有时,当移除一个或多个节点时,该节点不会被成功移除 - 而是处于错误状态。如果这是 在这种情况下,使用 SF Explorer(或 powershell)删除节点状态。状态 将变为无效。此时,再进行一次配置升级 确保: 删除的节点不在节点部分 移除的节点不在 NodesToBeRemoved 列表中 如上所述,如果 NodesToBeRemoved 的值为(或应该)为空,请删除整个 JSON 块,否则您将收到关于 NodesToBeRemoved 参数包含不一致信息的误导性/模糊警告。

后半部分确实是上次让我感到困惑的部分。还要记住的是,一旦成功删除节点,Get-ServiceFabricClusterConfiguration 仍将在 NodesToBeRemoved 参数中返回已删除的节点。这可能会使您在任何后续尝试进行配置升级时感到困惑/绊倒。因此,我建议您在完全删除此部分的情况下再次进行最终配置升级

最后一点:如果您重新添加之前已删除的节点,它可能会重新处于停用状态。只需激活此节点,一切都会好起来的。

【讨论】:

以上是关于Service Fabric - 无法进行配置升级以添加或删除节点的主要内容,如果未能解决你的问题,请参考以下文章

Service Fabric 群集升级失败

无法将 Service Fabric 应用程序部署到开发/本地群集

Service Fabric 升级卡在 PreUpgradeSafetyCheck 上

Azure Service Fabric 从 Visual Studio 发布升级 - PowerShell 脚本错误

部署包升级时VSTS Deploy Service Fabric应用程序任务超时

尝试使用 Start-ServiceFabricApplicationUpgrade 升级 Service Fabric 应用程序时出现错误