【问题标题】:Service Fabric Networking - Is it possible to have two nodes of different Node types on one VM?Service Fabric 网络 - 一个 VM 上是否可以有两个不同节点类型的节点?
【发布时间】:2018-07-31 06:43:32
【问题描述】:

我问这个与我之前的帖子有关。我已经阅读了一些内容,但没有看到对我的评论 Diego 的回答的明确答案。

Service Fabric - How to reserve or protect my hardcoded Port

更新:当我充实这一点时,我认为问题真的变成了你能否在一个 VM 上拥有多个节点。它不是关于节点类型,而是节点本身。所以问题是:我可以拥有一个托管 Service Fabric 的多个 IP 的 VM,然后在其上托管两个不同类型的节点吗?

这样我可以解决上述问题,并有一个用于外部访问的节点类型和一个用于内部访问的第二个节点类型,而不是硬编码超出集群设置期间使用范围的端口。

我想我会变得贪婪并在这里问后续问题:

如果我不能拥有多个 IP,使用范围之外的端口是否有任何需要注意的问题。服务结构会将该端口号用于其他任何事情吗?

例如,我不希望 Service Fabric 仅仅因为端口超出范围就认为微服务需要像所有其他微服务一样进行管理?

例如,在我当前拥有的 onPrem ClusterConfig.Windows.MultiMachine.json 文件中:

"nodes": [
    {
        "nodeName": "vm0",
        "iPAddress": "Server1.DomainName.net",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r0",
        "upgradeDomain": "UD0"
    },
    {
        "nodeName": "vm1",
        "iPAddress": "Server2.DomainName.net",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r1",
        "upgradeDomain": "UD1"
    },
    {
        "nodeName": "vm2",
        "iPAddress": "Server3.DomainName.net",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r2",
        "upgradeDomain": "UD2"
    }
]
"nodeTypes": [
        {
            "name": "NodeType0",
            "clientConnectionEndpointPort": "19000",
            "clusterConnectionEndpointPort": "19001",
            "leaseDriverEndpointPort": "19002",
            "serviceConnectionEndpointPort": "19003",
            "httpGatewayEndpointPort": "19080",
            "reverseProxyEndpointPort": "19081",
            "applicationPorts": {
                "startPort": "20001",
                "endPort": "20100"
            },
            "isPrimary": true
        }
    ],

如果 IP 1 和 4、2 和 5 以及 3 和 6 在同一个 VM 上,我可以改为执行类似的操作吗?请注意,这两种节点类型的起始端口和结束端口未拆分以允许硬编码的 WebAPI 端点。

"nodes": [
    {
        "nodeName": "vm0",
        "iPAddress": "IPAddress_1",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r0",
        "upgradeDomain": "UD0"
    },
    {
        "nodeName": "vm1",
        "iPAddress": "IPAddress_2",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r1",
        "upgradeDomain": "UD1"
    },
    {
        "nodeName": "vm2",
        "iPAddress": "IPAddress_3",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r2",
        "upgradeDomain": "UD2"
    }
]


"nodes": [
    {
        "nodeName": "vm3",
        "iPAddress": "IPAddress_4",
        "nodeTypeRef": "NodeType1",
        "faultDomain": "fd:/dc1/r0",
        "upgradeDomain": "UD0"
    },
    {
        "nodeName": "vm4",
        "iPAddress": "IPAddress_5",
        "nodeTypeRef": "NodeType1",
        "faultDomain": "fd:/dc1/r1",
        "upgradeDomain": "UD1"
    },
    {
        "nodeName": "vm5",
        "iPAddress": "IPAddress_6",
        "nodeTypeRef": "NodeType1",
        "faultDomain": "fd:/dc1/r2",
        "upgradeDomain": "UD2"
    }
] 
"nodeTypes": [
        {
            "name": "NodeType0",
            "clientConnectionEndpointPort": "19000",
            "clusterConnectionEndpointPort": "19001",
            "leaseDriverEndpointPort": "19002",
            "serviceConnectionEndpointPort": "19003",
            "httpGatewayEndpointPort": "19080",
            "reverseProxyEndpointPort": "19081",
            "applicationPorts": {
                "startPort": "20001",
                "endPort": "20500"
            },
            "isPrimary": true
        }
"name": "NodeType1",
            "clientConnectionEndpointPort": "19000",
            "clusterConnectionEndpointPort": "19001",
            "leaseDriverEndpointPort": "19002",
            "serviceConnectionEndpointPort": "19003",
            "httpGatewayEndpointPort": "19080",
            "reverseProxyEndpointPort": "19081",
            "applicationPorts": {
                "startPort": "20501",
                "endPort": "21000"
            },
    ],

提前致谢, 格雷格

【问题讨论】:

  • @chacko-MSFT 对此有何想法?请看看我对 Diego 的评论
  • @Mike Morton 我看到你在监视这些家伙,有什么想法吗?

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


【解决方案1】:

是和否。

在开发机器上安装 SF 集群时,它会在同一台机器上模拟 5 节点集群,默认情况下,从 azure 门户配置时不能这样做。 Service Fabric 只不过是在虚拟机之上运行的 Windows 服务。

这里的问题应该是:

如果我在同一台机器上有两种节点类型,它会解决我的端口吗 冲突问题?

答案是否定的,因为它们都将竞争端口,就像您尝试在本地开发机器的所有节点上加载绑定到端口 80 的单个服务时一样。

正如我在另一个问题上所建议的,如果创建节点类型不是一个选项,您应该使用应用程序端口列表之外的硬编码端口。

例如: - ServiceA 是一个 API,它在端口 80 上公开操作 - ServiceB 是一个后台工作服务,使用随机端口(取自应用程序端口范围)

以这种方式设计您的服务,您不会遇到端口问题。

另一种选择是让所有服务使用随机端口并使用反向代理来联系它们,检查它here

【讨论】:

  • 嗯,我有许多服务器具有多个 IP 地址,这些 IP 地址共享同一个端口(例如 443),用于托管在一个盒子上的多个站点。只要 IP 端口组合是唯一的,您就可以在同一个端口上托管和拥有多个站点。这应该可以解决您对港口竞争的担忧吗?我知道您可以轻松地在 IIS 和网站上执行此操作,问题是您可以在具有节点类型的 Service Fabric 上执行此操作吗?
  • AFAIK,在 SF 中无法定义应该绑定到每个服务的 Network\IP,我知道的唯一方法是在启动服务后硬编码侦听器中的 IP,就像你在 IIS 上做的那样,但不是一个灵活的解决方案。
【解决方案2】:

一般来说,您会保留一个面向公众的服务(即 Asp.net 核心 api)以供外部客户端(从 sf 集群外部访问的任何人)使用。您可以使用此 api 服务来调用托管在同一集群中的其他微服务。您可以将远程处理用作集群内的通信堆栈。这样您就不必担心集群中的端口。

对于 api 服务正在侦听的外部客户端,仅需要 80 或其他端口。根据文档,这也是首选方式。

【讨论】:

  • 是的,这正是我们正在做的,@diego 建议使用不同的节点类型来托管 WebAPI 端点,这样我们就不会发生端口冲突。我的后续问题是我们可以使用多 IP 网卡在一个 VM 上托管两种节点类型吗?
  • 我相信这将非常具有挑战性,我还没有在 azure 上尝试过。
【解决方案3】:

如独立部署准备步骤中所述,您不能在一个 VM 上拥有两个节点。

“但是,在生产环境中,Service Fabric 仅支持每个物理机或虚拟机一个节点。”

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-cluster-standalone-deployment-preparation#determine-the-initial-cluster-size

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 2020-09-18
    • 2017-01-10
    • 2016-09-28
    • 2020-02-19
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多