0. 前言

近几年互联网上出现了很多带颜色的部署发布名词,这里总结一下,我对蓝绿部署和灰度发布的理解。

1. 部署与发布

说实话,在平时工作学习中,对于部署和发布这两个词区分不是很明显,也都经常混用;但是大家基本上也都能互相理解说话者想表达的意思。这里说一下,我对部署和发布的理解

  • 部署(deploy)

将我们的程序包(例如xxx.jar)放到服务器上运行。但是此时还没有对外(用户)提供服务。耗时较长,但是风险较低(因为此时没有对外提供服务,不会影响用户使用体验)。

  • 发布(release)

把部署好的服务暴漏给用户使用(可以通过代理服务器进行流量切换)。耗时较低,但是风险较高(只需要导流即可,但出问题,会影响用户体验)。

一般来说,我们常说的发布、发版、上线就是包括部署到服务器并给暴露给用户使用这一整个流程。

2. 古老的单体项目问题

以单体Java项目为例,服务器上运行着一个jar包,在第一次部署与发布时,因为还没有用户使用,不会有影响。但是当有新版本再次部署发布时,需要先将老的服务停掉,然后再运行新版本。这样操作的话,在老服务停机,新服务没有启动之前,这段时间服务是不可用的,严重影响用户的使用体验。

要解决这个问题,就可以使用蓝绿部署的方式。

3. 蓝绿部署

蓝绿部署是一种通过交换production服务器和staging服务器的部署方法。在该模式中,需要维护两台服务器:“蓝色”服务器和“绿色”服务器。在任何给定时间,只有一台服务器在处理用户请求。例如,用户请求可能会被路由到蓝色服务器,此时蓝色服务器为production服务器,而绿色服务器成为staging服务器,只能通过专用网络访问。

image

如果我们有新版本要部署发布,可将新版本的代码部署到绿色staging服务器,然后测试人员通过专用网络对代码进行测试无误后,运维人员可将用户流量从蓝色服务器切换到绿色服务器,此时绿色服务器成为production服务器。

image-1680165288879

如果在切换流量后出现了任何问题,可以快速将流量切换回原来的服务器,做到快速回滚。

通过蓝绿部署减少了服务器的停机时间,提升了用户的使用体验。

Tips:
上面的服务蓝和服务绿不仅仅可以是单台服务器,也可以是各自的集群。

蓝绿部署也不仅仅局限于上面的方式,大家也可以根据自己的业务场景进行适当的变化:

  1. 如果没有必要两台服务器一直同时存在,只是在部署发布时,临时同时存在,带发布结束后,可以只保留production服务(有些地方称这种方式为红黑部署)。
  2. 如果蓝色服务器和绿色服务器都是单个服务器提供服务器的话,也可以两个服务器组成一个集群,平时流量可以路由到任何一个台服务器。当需要新版本上线时,可以先将蓝色服务器从负载均衡列表中移除并升级为新版本,然后将升级后的蓝色服务器添加到负载均衡列表中并将绿色服务器移除,升级绿色服务器版本后,再次将绿色服务器添加到负载均衡列表中。

4. 灰度发布

蓝绿部署解决了服务器停机,影响用户使用体验问题,但是如果想要一部分用户使用新功能,一部分用户使用老功能,就需要灰度发布出马了。

灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。与蓝绿部署不同的是,灰度发布属于增量发布。也就是说,服务升级的过程中,新旧版本会同时为用户提供服务。让一部分用户继续用老功能,一部分用户开始用新功能,如果用户对新功能没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到新功能上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证影响粒度。灰度发布开始到结束期间的这一段时间,称为灰度期。

image-1680167836762

Tips:
对于使用新版本,不仅仅可以按照流量分配,也可以指定用户,具体可以根据自己的业务逻辑进行处理。

5. End

在实际工作中,升级过程中需要保持服务的稳定可用,对用户无感知是基本的要求。具体哪种部署方式最合适?取决于自己的业务和技术需求。



参考文献:
https://en.wikipedia.org/wiki/Blue-green_deployment
https://baike.baidu.com/item/%E7%81%B0%E5%BA%A6%E5%8F%91%E5%B8%83?fromModule=lemma_search-box

Q.E.D.

  • reword 支付宝打赏
  • reword 微信打赏