2016-03-08 104 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

我还认为滚动升级在某种意义上是“流淌”的,因为您的整个应用程序不会一次全部升级。它一次升级一次,如果任何时候健康检查失败(您可以执行自定义健康检查),它将回滚。所以你可以把它想成一个自动化的滴漏式部署,我们确实爱上了一些自动化! –

相关问题