2016-03-02 55 views
6

我有一個無狀態的ASP.NET Core(RC1)服務在我的Azure服務結構集羣中運行。它具有以下清單:爲什麼不能在升級中更改佈局約束?

<ServiceManifest Name="MyServicePkg" Version="1.0.2" ...> 
    <ServiceTypes> 
     <StatelessServiceType ServiceTypeName="MyServiceType" /> 
    </ServiceTypes> 
    ... 
</ServiceManifest> 

我的羣集配置了展示位置屬性。我有5個「nodeType =後端」的服務器和3個「nodeType = Frontend」的服務器。

我想升級我的服務並指定它只能放在「後端」節點上。這是我更新的清單:

<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

爲什麼不是有可能改變的約束與升級?

我需要刪除並重新創建服務嗎?這對我來說似乎非常成問題,因爲它會導致有狀態服務的停機和數據丟失。

回答

5

實際上有一個相當簡單的方法可以做到這一點,而無需編寫一堆代碼來手動定義結構集羣上的應用程序。

儘管您可以在服務清單中聲明佈局約束,但您也可以在應用程序清單中聲明它們。在應用程序清單中聲明的​​任何內容都將覆蓋服務清單中的內容。然後使用應用程序清單中的設置,然後可以使用參數根據您想要進行特定部署的參數文件來更改值。我剛寫了a blog post that discusses this approach in greater detail。希望對你有幫助。 :)

+1

這真棒,讓我難以置信的快樂!感謝分享!這應該在官方文檔中明確記錄。 –

6

所以這裏的問題實際上是ApplicationManifest的DefaultService部分。當服務作爲DefaultService的一部分創建時,以後有些事情你不能改變。您可能可以通過ServiceFabric瀏覽器進行更改,但我不確定。

一個建議是將DefaultServices保留爲ApplicationManifest爲空,而不是手動創建您的服務。對於手冊,我的意思是通過PowerShell,代碼或ServiceFabric Explorer。 這樣可以讓您更靈活地隨後更改部分服務。當這樣做的時候,我知道你有可能在服務運行後改變放置限制等事情。

要使用PowerShell創建服務,您可以使用New-ServiceFabricService命令。 要從代碼創建它,您可以使用FabricClient來完成。可以在這裏找到一個示例:Azure Service Fabric Multi-Tenancy

+1

謝謝你的回答。這似乎是一個巨大的缺點,因爲這是Visual Studio中的默認設置,每個人都會像這樣使用它。你有關於如何手動創建服務的一些鏈接/進一步的信息? –