2016-03-08 99 views
11

我目前正在使用Azure ServiceFabric上的ReliableActors框架構建應用程序。隨着我們擴大規模,我正在研究藍色/綠色部署。我可以看到如何使用無狀態系統來做到這一點。有沒有辦法使用有狀態的演員來做到這一點?使用Azure ServiceFabric的藍色/綠色部署

回答

25

服務結構是關於滾動升級,而不是部署互換,如VIP互換。無狀態和有狀態的服務都以同樣的方式升級,但還有一些細微的差別,以便稍後提及。

通過滾動升級,我的意思是升級的應用程序在做的地方,一個升級域的時間,所以沒有停機時間,並沒有突然的開關。服務結構中的滾動升級可以在安全的「託管」模式下完成,平臺在進入下一個升級域之前將執行健康檢查,並在健康檢查失敗時自動回滾。

好吧,這一切聽起來不錯。但是當升級總是滾動升級時,你如何進行藍/綠部署?

這其中,應用程序類型和版本進來。不是有兩個「環境」,它可以容納兩個運行的應用程序,服務織物具有哪些應用實例可以被創建的版本化的應用程序類型的概念。下面是如何工作的一個例子:

比方說,我想使所謂的富應用程序。我的Foo應用程序被定義爲一個應用程序類型,稱之爲FooType。這與在C#中定義類相似。和C#中的類一樣,我可以創建我的類型的實例。每個實例都有一個唯一的名稱,類似於每個類的每個對象實例具有唯一的變量名稱。但與C#中的類不同,我的FooType有一個版本號。然後,我可以「登記」在我的羣集的應用程序類型和版本:

FooType 1.0 

連同該註冊,我可以創建應用程序的實例:

"fabric:/FooApp" of FooType 1.0 

現在,讓我們說,我開發2.0版我的應用程序。所以,我在羣集中註冊我FooType的2.0版本:

FooType 1.0 
FooType 2.0 

現在我已經FooType的兩個版本註冊,和我仍然有1.0運行的一個實例:

"fabric:/FooApp" of FooType 1.0 

這裏就是它得到樂趣。我可以做一些有趣的事情:

我可以採取「面料:/ FooApp」 - 的FooType 1.0實例 - 並將其升級爲2.0 FooType。這將是該正在運行的應用程序的滾動升級。

或..我可以離開「面料:/ FooApp」別說了,我的創造2.0版應用程序的例如:

"fabric:/FooApp" of FooType 1.0 
"fabric:/FooAppv2Test" of FooType 2.0 

現在我有兩個應用程序,運行並排側,在同一個集羣中。一個是1.0的實例,另一個是2.0的實例。通過對端口和應用程序端點進行一些配置,我可以確保用戶在測試2.0實例的同時仍然可以訪問1.0實例。

好極了,所以我所有的測試都通過了2.0的實例,所以現在我可以放心地採取1。0實例和將其升級爲它爲2.0的FooType。再次,這是該實例的滾動升級(fabric:/ FooApp),它不會將用戶遷移到新實例(fabric:/ FooAppv2Test)。稍後我會去刪除結構:/ FooAppv2Test,因爲那只是爲了測試。

儘管藍色/綠色的好處之一是能夠交換回其他部署,如果新的失敗。那麼,你仍然有1.0和2.0的FooType註冊。因此,如果您的應用程序在從1.0升級到2.0之後開始行爲不當,那麼您可以將其「升級」回到1.0!實際上,您可以根據需要在應用程序類型的許多不同版本之間「升級」應用程序實例!並且您不需要像在交換環境中那樣運行所有應用程序版本的實例,只需註冊不同的版本以及可以在版本之間「升級」的單個應用程序實例。

我提到了有狀態服務的警告。使用有狀態服務需要記住的一件大事情是,應用程序狀態(用戶的數據)包含在應用程序實例(fabric:/ FooApp)中,因此爲了讓用戶看到他們的數據,您需要將它們保留在該實例中。這就是我們進行滾動升級而不是部署互換的原因。

這只是基本的想法。根據你的目標是什麼以及你的應用程序的工作方式,你還可以使用其他方式來處理應用程序類型,版本和實例,但這是另一回事。

+0

這很有幫助,謝謝你Vaclav。在我看來,藍/綠風格部署的好處之一是我可以通過第二個服務來做一些細節,以確保它在我進行整個交換之前工作,通常是通過引導它通過負載均衡器。有沒有辦法在SF上做類似的驗證? – blackSphere

+1

對於無狀態服務,當然,您可以將其設置爲創建v1.0和v2.0的實例,並且通過您自己的一些路由,您可以將流量導入到v2.0,同時逐漸縮放並縮小v1.0。 。對於有狀態的服務來說,它有點棘手,因爲狀態本身在應用程序實例中,所以如果你將用戶發送到應用程序的新實例,他們的數據就不會在那裏。這一般只是有狀態事物的本質,這就是Service Fabric具有非常強大,一流的滾動升級的原因。 –

+1

我還認爲滾動升級在某種意義上是「流淌」的,因爲您的整個應用程序不會一次全部升級。它一次升級一次,如果任何時候健康檢查失敗(您可以執行自定義健康檢查),它將回滾。所以你可以把它想成一個自動化的滴漏式部署,我們確實愛上了一些自動化! –

相關問題