为什么不能在升级中更改放置限制?
Why isn't it possible to change placement constraints in an upgrade?
我的 Azure Service Fabric 集群中有一个无状态 ASP.NET 核心 (RC1) 服务 运行。它具有以下清单:
<ServiceManifest Name="MyServicePkg" Version="1.0.2" ...>
<ServiceTypes>
<StatelessServiceType ServiceTypeName="MyServiceType" />
</ServiceTypes>
...
</ServiceManifest>
我的集群配置了放置属性。我有 5 台服务器 "nodeType=Backend" 和 3 台服务器 "nodeType=Frontend".
我想升级我的服务并指定它只能放在 "Backend" 个节点上。这是我更新的清单:
<ServiceManifest Name="MyServicePkg" Version="1.0.3" ...>
<ServiceTypes>
<StatelessServiceType ServiceTypeName="MyServiceType">
<PlacementConstraints>(nodeType==Backend)</PlacementConstraints>
</StatelessServiceType>
</ServiceTypes>
...
</ServiceManifest>
但是,如果我现在执行升级,我会收到以下错误:
Start-ServiceFabricApplicationUpgrade : Default service descriptions
must not be modified as part of upgrade. Modified default service:
fabric:/MyApp/MyService
为什么无法通过升级更改限制?
我是否必须删除并重新创建该服务?这对我来说似乎是个大问题,因为它会导致有状态服务的停机和数据丢失。
所以这里的问题实际上与 ApplicationManifest 的 DefaultService 部分有关。当服务作为 DefaultService 的一部分创建时,有些事情您之后无法更改。您也许可以通过 ServiceFabric 资源管理器更改它,但我不确定。
一个建议是让 ApplicationManifest 中的 DefaultServices 为空,而是手动创建您的服务。对于手册,我的意思是通过 powershell、代码或 ServiceFabric Explorer。
这使您以后可以更灵活地更改服务的各个部分。以这种方式完成后,我知道您可以在服务 运行.
后更改诸如放置限制之类的内容
要使用 PowerShell 创建服务,您可以使用 New-ServiceFabricService
命令。
要从代码创建它,您可以使用 FabricClient
来完成它。可以在此处找到其中的示例:
实际上有一种相当简单的方法可以做到这一点,而无需编写一堆代码来手动定义结构集群上的应用程序。
虽然您可以在服务清单中声明放置约束,但您也可以在应用程序清单中声明它们。应用程序清单中声明的任何内容都将覆盖服务清单中的内容。通过应用程序清单中的设置,您可以使用参数根据特定部署所需的参数文件更改值。
我刚写完 a blog post that discusses this approach in greater detail。希望对你有帮助。 :)
我的 Azure Service Fabric 集群中有一个无状态 ASP.NET 核心 (RC1) 服务 运行。它具有以下清单:
<ServiceManifest Name="MyServicePkg" Version="1.0.2" ...>
<ServiceTypes>
<StatelessServiceType ServiceTypeName="MyServiceType" />
</ServiceTypes>
...
</ServiceManifest>
我的集群配置了放置属性。我有 5 台服务器 "nodeType=Backend" 和 3 台服务器 "nodeType=Frontend".
我想升级我的服务并指定它只能放在 "Backend" 个节点上。这是我更新的清单:
<ServiceManifest Name="MyServicePkg" Version="1.0.3" ...>
<ServiceTypes>
<StatelessServiceType ServiceTypeName="MyServiceType">
<PlacementConstraints>(nodeType==Backend)</PlacementConstraints>
</StatelessServiceType>
</ServiceTypes>
...
</ServiceManifest>
但是,如果我现在执行升级,我会收到以下错误:
Start-ServiceFabricApplicationUpgrade : Default service descriptions must not be modified as part of upgrade. Modified default service: fabric:/MyApp/MyService
为什么无法通过升级更改限制?
我是否必须删除并重新创建该服务?这对我来说似乎是个大问题,因为它会导致有状态服务的停机和数据丢失。
所以这里的问题实际上与 ApplicationManifest 的 DefaultService 部分有关。当服务作为 DefaultService 的一部分创建时,有些事情您之后无法更改。您也许可以通过 ServiceFabric 资源管理器更改它,但我不确定。
一个建议是让 ApplicationManifest 中的 DefaultServices 为空,而是手动创建您的服务。对于手册,我的意思是通过 powershell、代码或 ServiceFabric Explorer。 这使您以后可以更灵活地更改服务的各个部分。以这种方式完成后,我知道您可以在服务 运行.
后更改诸如放置限制之类的内容要使用 PowerShell 创建服务,您可以使用 New-ServiceFabricService
命令。
要从代码创建它,您可以使用 FabricClient
来完成它。可以在此处找到其中的示例:
实际上有一种相当简单的方法可以做到这一点,而无需编写一堆代码来手动定义结构集群上的应用程序。
虽然您可以在服务清单中声明放置约束,但您也可以在应用程序清单中声明它们。应用程序清单中声明的任何内容都将覆盖服务清单中的内容。通过应用程序清单中的设置,您可以使用参数根据特定部署所需的参数文件更改值。
我刚写完 a blog post that discusses this approach in greater detail。希望对你有帮助。 :)