Web服务现网升级部署——给高速行驶的汽车换轮子
现网多版本同步运行方案
众测发布
一般作为客户端的前台或后台会有该阶段的测试。参与测试的人员,一般为真实的种子用户。服务端也具备识别种子用户群体的能力,其可以通过客户端版本号或者其他用户标识以分发到众测版本。
灰度发布
新老版本并存运行。分批量开放用户使用。在分批切换的过程中,监控新版本的运行情况。如
A/B测试
互联网面向2C的常用运营手段。新版本不止一种方案,而是在不同用户群体(用户群体总体上不应有较大差异)中使用不同的方案版本。并检测其各项关键指标的差异,以决定最后的发布版本。 灰度发布其实也属于AB测试的一种,使用的技术手段也基本一致。
负载均衡&流量分发
以上这些现网升级发布的手段,都有一个共同点:现网同时存在多个服务器版本对外提供服务。那么,如何实现这一点呢,这就得引出我们一个关键的网络基础服务——负载均衡服务器。
负载均衡服务器,是将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量分发控制服务。负载均衡扩展了应用的服务能力,增强了应用的可用性。在阿里云平台上,称作SLB(Server Load Balancer)。在华为云平台上,称作ELB(Elastic Load Balance)。
其流量分发控制的能力,也正好满足了不同版本同时对外提供服务的能力。
例如我们将图中BackendServer_1服务器作为灰度服务器。在Listener上的转发策略中做一些针对性的配置:
- 对于众测发布,可以根据请求中的header、body甚至IP做一些特定的过滤,将众测群体的请求都发送到灰度服务器中,其他大量的正常的非众测请求依旧使用历史版本处理。
- 对于灰度发布,则可以调节流控比。将特定比例的请求转发到灰度服务器,分阶段发布。例如先将一台服务器作为灰度服务器升级,然后将三分之一的流量转发到灰度服务器。灰度运行一段时间,反响良好,则继续升级第二台服务器,然后将更多流量转发到灰度服务器。最后直到所有的流量都切换到新版本。不过一般而言,往往会保留少量服务器运行老版本服务,以防止未知错误发生时快速回滚。
- 对于A/B测试,则可以将BackendServer_1用于发布A版本的服务,BackendServer_2用于发布B版本的服务,灰度运行评估之后,再统一切到最合适的版本。
不同场景下的灰度升级形式
分布式跨地域容灾场景
如图,下面是阿里云跨地域容灾场景下负载均衡器向后端服务器进行分发的架构图
对于超大的分布式系统,负载均衡器及服务器主机也只不过变成了以集群为单位进行规划,但其本质还是一样。划分灰度服务器集群,灰度升级,负载均衡器集群上配置合理的灰度策略。并做好指标监控。便可以做到现网服务升级的平滑过渡了。
<font color=gray>注:其实对于这个架构图,如果是一个跨区域的大公司,还会在SLB前面添置一个专门面向公网的负载均衡器,以屏蔽内部网络架构。也更方便做自己内网架构的设计。</font>
单主机练手模式
单机情况下,我们需要明白负载均衡器能实现的基本功能,Nginx也能做得到 (<font color=gray>不考虑性能或高级功能的情况下</font>)。那么,我们只需要在Nginx上配置转发策略即可。而如果没有多的后端服务器的情况下,则只需多规划几个端口给tomcat启动不同版本的服务;多规划几个目录给不同的Nginx映射到不同的前端版本。