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

时间:2018-06-28 19:02:17

标签: azure-service-fabric service-fabric-on-premises

我有一个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中收到错误“无效的节点类型”。根据文档here,NodeType必须是集群中的“现有” 节点类型。我想知道为什么会这样吗? clustermanifest.json中的“ NodeTypeRef”表示什么?如果我运行带有nodetype参数为“ node1”或“ node2”(它们是现有节点类型)的AddNode.ps1,则它可以正常工作。

3 个答案:

答案 0 :(得分:0)

通常,您可以将 NodeType 视为要在其中执行服务的执行环境的硬件的抽象定义。

考虑一个例子:

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

根据此信息,您可以定义两个 NodeType ,然后: FastSDD HugeMemory 。将节点添加到集群时,您可以根据硬件(即SSD为 FastSSD 的计算机和RAM为 HugeMemory 的计算机)指定适当的NodeType。

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

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

使用此配置 ClusterManager 将以某种方式组织服务,以确保将 Service A的副本放置在FastSSD类型的Node上,并且将 Service B放置仅在类型为HugeMemory的Node上。

答案 1 :(得分:0)

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

  

NodeType必须是集群中的“现有”节点类型。我想知道为什么会这样吗?

在clustermanifest.json中,“ NodeTypeRef”表示什么?

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

它们是虚拟的,因为它们代表计算机池,它并不严格地与VMSS绑定,因为在本地OnPremises或其他云提供程序上运行群集时将没有VMSS,但是您仍然可以拥有配置相同的虚拟机链接到NodeType。

您的群集迟早将不得不按比例增加或减少节点的数量,拥有NodeType可以使在新节点上放置服务更加容易,因为您知道特定的NodeType具有预先定义的要求,而任何新的添加到池中的节点将兼容,因此您不需要在服务配置上进行复杂的配置即可限制在不受支持的节点上运行的服务。

另一个示例是,如果您没有NodeType,并且需要将服务分配给特定节点,则在该节点脱机的情况下,该服务将无法运行,因为该节点不可用。然后您认为,我可以使用节点中的标签来绑定特定的要求(即:Ram = 8Gb),但是如果要将这些VM升级到16GB,还必须更新服务,现在该服务应与16GB。

一个例子是这样的集群:

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

BackEndNodeType :     将托管将处理重负载,需要更多CPU和内存的辅助服务。

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

假设您要限制API在FrontEndNodetype上运行,如果在其中添加新节点以减少其他节点上的负载,SF将知道它将满足服务要求,并且可以在那里毫无问题地运行您的API,因为您已经在部署过程中说过FrontEndNodetype包含服务需要的所有依赖项。

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

根据您的示例:

如果为添加的每个节点创建一个节点类型,则会失去拥有节点类型的好处,并且您将没有如上所述的灵活性。

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

答案 2 :(得分:0)

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

  1. Start-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凭据-由于某些原因,如果在群集连接到群集时使用Windows凭据保护群集,则需要调整addnode.ps1以通过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. 致电AddNode.ps1
.\AddNode.ps1 -NodeName dmz1 -NodeType newNodeType -NodeIPAddressorFQDN newnodeservername.domain.org -ExistingClientConnectionEndpoint existingnodeservername.domain.org:19000 -UpgradeDomain UD3 -FaultDomain fd:/dc1/r1 -AcceptEULA