本地服务结构添加节点和节点类型关联

Service fabric on premises add node and node type correlation

我有一个 2 节点本地 windows 集群,集群清单中有以下节点定义

 "nodes": [
  {
    "nodeName": "node1",
    "iPAddress": "192.168.1.1",
    "nodeTypeRef": "node1",
    "faultDomain": "fd:/dc1/r1",
    "upgradeDomain": "UD1"
  },
  {
    "nodeName": "node2",
    "iPAddress": "192.168.1.2",
    "nodeTypeRef": "node2",
    "faultDomain": "fd:/dc2/r2",
    "upgradeDomain": "UD2"
  }

我正在尝试使用 "AddNode.ps1" 脚本添加一个名为 "node3" 的新节点:

 .\AddNode.ps1 -FabricRuntimePackagePath  "G:\Downloads\ServiceFabricRuntime\MicrosoftAzureServiceFabric.6.2.274.9494.cab" -NodeName node3 -NodeType "node3" -NodeIPAddressorFQDN 192.168.1.3 -ExistingClientConnectionEndpoint node0.gbl.net:19000 -UpgradeDomain UD3 -FaultDomain fd:/dc3/r3 -AcceptEULA

我在 powershell 中收到错误 "Invalid Node Type"。根据文档 here,NodeType 必须是集群中的 "existing" 节点类型。我想知道这是为什么? "NodeTypeRef" 在 clustermanifest.json 中表示什么?如果我 运行 AddNode.ps1 将节点类型参数设置为 "node1" 或 "node2" [这是现有的节点类型],它会起作用。

一般来说,您可以将 NodeType 视为将要执行您的服务的执行环境的硬件的一些抽象定义。

考虑一个例子:

假设您有两个服务 A 和 B。服务 A 执行大量磁盘 I/O 绑定操作,而服务 B 需要大量内存才能工作。

根据这个信息你可以定义两个NodeType's然后:FastSDDHugeMemory。将节点添加到集群时,您可以根据硬件指定适当的节点类型(即具有 SSD 的机器如 FastSSD 和具有巨大 RAM 的机器如 HugeMemory)。

现在您可以为您的服务定义以下placement constraints

  • 服务 A:NodeType == FastSSD
  • 服务 B:NodeType == HugeMemory

使用此配置 ClusterManager 将组织您的服务以确保 Service A 的副本放置在 FastSSD 类型的节点上和 Service B 仅放置在 HugeMemory.

类型的节点上

您可能从 docs 了解到,每个节点类型都映射到一个 VMSS(虚拟机规模集)。 VMSS 是具有相同配置的节点的集合,因此 VMSS 中的每个节点将具有相同数量的 RAM、CPU、OS 和配置(端口、软件等),除非您在部署后为每个节点设置单独的配置。

NodeType must be an "existing" nodetype in the cluster. I am wondering why is this? What does the "NodeTypeRef" signify in the clustermanifest.json?

在 SF 上,NodeType 是节点池 (VM) 的虚拟表示,具有相同的配置,可以处理与同一池中其他节点相同类型和数量的工作。

它们是虚拟的,因为它们代表一个机器池,它并不严格依赖于 VMSS,因为当您 运行 您的集群 OnPremises 或其他云提供商时,您不会有 VMSS,但是您仍然可以有一个链接到 NodeType 的相同配置的虚拟机池。

您的集群迟早将不得不扩展(增加和减少)节点数量,拥有 NodeType 将使在新节点上放置服务变得更加容易,因为您知道特定的 NodeType 具有预定义的要求并且添加到池中的任何新节点都是兼容的,因此您不需要在服务配置上进行复杂的配置来限制服务 运行ning 在不受支持的节点上。

再比如,如果你没有NodeType,你需要给一个特定的节点分配一个服务,当节点掉线的时候,你的服务就无法运行,因为节点不可用。然后你想,我可以在节点中使用标签来满足特定要求(即:Ram=8Gb),但如果你想将这些 VM 升级到 16GB,你还必须更新服务,现在应该与16GB.

一个例子是这样的集群:

FrontEndNodetype: 您将安装托管 UI 或 API 所需的服务,不需要大量磁盘,您必须配置 LoadBalancer 端口以打开访问,例如端口 80(http)

BackEndNodeType: 将托管处理繁重负载的工作人员服务,需要更多 CPU 和内存。

DBNodeType: 将托管您的数据库,需要内存和磁盘存储

假设您将 FrontEndNode 类型上的 API 限制为 运行,如果您在那里添加一个新节点以减少其他节点上的负载,SF 将知道它会参加该服务要求并且可以 运行 你的 API 没有任何问题,因为你已经在部署期间说过 FrontEndNodetype 包含服务需要的所有依赖项。

另一个示例可能是基于 GPU 的工作,因此您的服务需要非常特定的硬件才能 运行。

.

根据你的例子:

如果您为添加的每个节点创建一个节点类型,您将失去拥有节点类型的好处,并且您将无法获得与上述相同的灵活性。

另一个问题是,当您将具有不同配置的多个节点添加到同一节点类型时,这不会成为服务结构的问题,但您的服务迟早会在特定节点上开始失败,这可能是因为配置是错误的或缺少一些依赖项,将很难调试和发现问题,因为每个节点都有不同的配置,您将需要一段时间才能确定问题仅发生在该节点中

昨晚我花了一些时间解决这个问题并克服了节点类型错误。我现在正在寻找一个不同的错误,但这是一个不同的故事。如上所述,您需要将节点类型添加到现有集群,然后再添加新节点。我们 运行 对 onPremise 安装的另一个问题是您需要对 AddNode.ps1 进行更改。以下是 3 个步骤:

  1. 启动 ServiceFabricClusterConfigurationUpgrade
    cd D:\TMHPSupport\Installs\Microsoft.Azure.ServiceFabric.WindowsServer.x.x.x
    Connect-ServiceFabricCluster -ConnectionEndpoint "mycluster.mydomain.com:19000" -WindowsCredential
    Start-ServiceFabricClusterConfigurationUpgrade -ClusterConfigPath NewNodeType.ClusterConfig.Windows.MultiMachine.json
  1. 更新 addnode。ps1 以传递 windows 凭据 - 出于某种原因,您需要调整 addnode。ps1 以传递 windows 凭据(如果您正在保护)连接到集群时具有 windows 凭据的集群。所以在第 203 行
    if($X509Credential)
    {    Connect-ServiceFabricCluster -ConnectionEndpoint $ExistingClientConnectionEndpoint -X509Credential -ServerCertThumbprint $ServerCertThumbprint -StoreLocation $StoreLocation -StoreName $StoreName -FindValue $FindValueThumbprint -FindType FindByThumbprint
    }
    else
    {
        Connect-ServiceFabricCluster $ExistingClientConnectionEndpoint **-WindowsCredential**
    }
  1. 调用添加节点。ps1
.\AddNode.ps1 -NodeName dmz1 -NodeType newNodeType -NodeIPAddressorFQDN newnodeservername.domain.org -ExistingClientConnectionEndpoint existingnodeservername.domain.org:19000 -UpgradeDomain UD3 -FaultDomain fd:/dc1/r1 -AcceptEULA