我们正在运行一个本地服务结构集群 (5.4.145.9494),但我们遇到了一些奇怪的问题。基本上,每当我们运行一个应用程序时(尤其是当它包含副本时),我们都会注意到服务大多数时候无法启动。在 SF 内部,错误消息并不是那么具有描述性(不健康的分区...),但在事件日志中,很明显服务无法启动,因为它选择的端口已被另一个应用程序使用(从 svchost 进程到 winit 基本上任何应用程序)。
在这种情况下,开发人员不会自己分配端口,因此基本上 SF 必须弄清楚这一点。在我们的设置中,我们按照以下要求分配了临时端口和应用程序端口https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-cluster-manifest我们尝试了这两种选择,因为文档中关于应用程序端口是临时端口子集的说法相当混乱,而示例表明它不是。另一个有趣的事情是,由于临时端口配置基本上会更改 Windows 本身的动态端口范围,因此我们在此处所做的任何更改也会更改在 Windows 内运行的任何其他应用程序的端口范围。
除此之外,SF 似乎不会在注意到端口已被使用时尝试使用另一个端口,因此它也无法自行修复。事件日志的简单片段:
transport 35d3ce77c0 failed to bind on 0.0.0.0:49160, error = 0x80072740, port 49160 already held by process 204
在这种情况下,进程 204 是 spoolsv.exe,但它也可以是任何进程。
此时节点的配置设置为:
<NodeType Name="NodeType0">
<Endpoints>
<ClientConnectionEndpoint Port="19000" />
<LeaseDriverEndpoint Port="19002" />
<ClusterConnectionEndpoint Port="19001" />
<HttpGatewayEndpoint Port="19080" Protocol="http" />
<HttpApplicationGatewayEndpoint Port="19081" Protocol="http" />
<ServiceConnectionEndpoint Port="19003" />
<ApplicationEndpoints StartPort="49152" EndPort="50000" />
<EphemeralEndpoints StartPort="49152" EndPort="65534" />
</Endpoints>
但如前所述,我们已经尝试将 ApplicationEndpoints 放在它自己的范围内,但这并不能解决问题 ;-)。
任何帮助都非常欢迎;-)
答案1
我们在本地 QA 环境中遇到了同样的问题。我们通过确保为 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort] 指定的值 (https://technet.microsoft.com/en-us/library/aa995661(v=exchg.80).aspx)。 低于 Service Fabric 群集清单中指定的最低端口( 和 )。
我们首先根据上述规则修改了 MaxUserPort 的值,但重启后其值被重置。看到这一点,我们调整了 SF 集群 ApplicationEndpoints 和 EphemeralEndpoints 的值,SF 运行时不再出现问题。