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

Posted

技术标签:

【中文标题】本地服务结构添加节点和节点类型关联【英文标题】:Service fabric on premises add node and node type correlation 【发布时间】:2018-12-07 22:32:39 【问题描述】:

我有一个 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 必须是集群中的 "existing" 节点类型。我想知道这是为什么? clustermanifest.json 中的“NodeTypeRef”表示什么?如果我使用 nodetype 参数作为“node1”或“node2”[它们是现有的 nodetypes] 运行 AddNode.ps1,它可以工作。

【问题讨论】:

【参考方案1】:

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

考虑一个例子:

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

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

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

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

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

【讨论】:

【参考方案2】:

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

NodeType 必须是集群中的“现有”节点类型。我想知道这是为什么? clustermanifest.json 中的“NodeTypeRef”是什么意思?

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

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

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

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

一个例子是这样的集群:

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

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

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

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

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

.

根据您的示例:

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

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

【讨论】:

Diego,您的答案似乎是基于使用 Azure,但在这个问题中,重点是 OnPremise,因此在这种情况下 NodeType 与 VMSS 没有任何关系。我遇到了同样的问题,我正在尝试向我的集群添加一个新的节点类型。我的第一个节点位于 LAN 上,而我尝试添加的新节点位于 DMZ 中。但是我不能添加新的节点类型,除非它存在。那么我们如何在 Prem 上添加新的节点类型呢?我看到 Azure powershell 有一个 add nodetype 调用,但是 OnPremise 呢? docs.microsoft.com/en-us/powershell/module/… 你说得对,我不应该让我的答案与 VMSS 耦合,但我试图证明的主要观点是 NodeType is a virtual representation of a pool of nodes(VMs) with equal configurations that can handle the same type and amount of work,所以无论是在 azure 还是 On-Premisses,它应该以相同的方式工作,唯一的区别是您如何向每个节点添加额外的 NodeType。 我看到您已经解决了您的问题。总之,您必须更新集群定义以添加 NoteTypes 和节点。在 azure 中,资源提供者会为您执行此操作,OnPremises 是手动的。【参考方案3】:

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

    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
    更新 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**
    
    调用 AddNode.ps1
.\AddNode.ps1 -NodeName dmz1 -NodeType newNodeType -NodeIPAddressorFQDN newnodeservername.domain.org -ExistingClientConnectionEndpoint existingnodeservername.domain.org:19000 -UpgradeDomain UD3 -FaultDomain fd:/dc1/r1 -AcceptEULA

【讨论】:

docs.microsoft.com/en-us/azure/service-fabric/… 我确实发现这被记录为正确的方法,并且 addnode.ps1 的问题已在 6.4 github.com/Azure/service-fabric-issues/issues/974 中修复

以上是关于本地服务结构添加节点和节点类型关联的主要内容,如果未能解决你的问题,请参考以下文章

节点连接到本地主机中的 Xmpp 服务器

Docker Swarm - 节点标签与服务约束

想在加载页面时使用节点在本地服务器上运行我的 html 页面,但 css 文件不起作用

代码组织:节点服务器和具有共享类型的反应项目

Service Fabric 本地群集管理器节点设置错误

Cinder 块存储服务