当前位置: 首页 > 科技观察

如何使用Nginx作为系统发布前的最后一道防线

时间:2023-03-14 11:06:28 科技观察

背景在项目开发初期,为了简单方便,我们在升级服务端应用时,通常会上传应用先将源代码或程序包发送到服务器,然后停止旧版本服务,启动新版本服务。由于此时项目用户少,访问量小,所以通常问题不大。但是后来随着项目越来越大,用户越来越多,你会发现这样做有两个明显的问题。1、新版本升级过程中,服务暂时中断。在此期间,该服务将不可用。2、如果新版本有bug,升级失败,回滚会很麻烦,很容易导致服务更长时间不可用。为了解决上述问题,人们制定了很多发布策略,比如蓝绿发布、滚动发布等,下面要讲的灰度发布也是其中之一。什么是灰度发布灰度发布又叫金丝雀发布,其原理如下图所示:最后一道防线"src="http://p1.pstatp.com/large/pgc-image/6315b9822fb3472199a9e4dec8c42146"width="640"height="312">用文字描述一下,灰度发布开始后,我们会先上线一个新版本的应用V2,但是这个时候我们不会直接切流量,而是让测试人员测试新的版本先上线测试,如果测试没有问题,再导入少量用户流量(图中5%)到新版本,然后观察新版本的运行状态,收集各种运行时数据。当新版本确认版本运行良好后,逐渐向新版本导入更多流量,在此期间我们可以不断调整新旧版本的服务器副本数量,让新版本能够承受更多和更多的流量压力。当我们终于转身ch100%的流量到新版本,我们可以关闭剩余的老版本服务,完成灰度发布。另外,如果灰度发布时新版本出现问题,我们可以立即将流量切换回旧版本,这样可以将负面影响控制在最低限度。如何实现灰度发布实现灰度发布的方式有很多种,但归纳起来,基于权重的基于COOKIE的IP有以下三种:使用nginx实现这三种。1、基于IP,我们先用LUA获取客户端IP,然后通过判断客户端IP的类型来判断应该选择哪个服务器访问。如果客户端IP是公司的出口IP,则反向转发代理给@client;如果不是,反向代理到@client_test。如下:最后一道防线"src="http://p3.pstatp.com/large/pgc-image/278f6501b71e4636a5230f9efaaf5a11"width="640"height="1143">2.基于cookie,我们首先定义三个upstream,tts_v6,tts_v7,default,然后查询Cookiekey的值为version,如果Cookie值为tts1,则转发到tts_v6;如果Cookie值为tts2,则转发到tts_v7;如果Cookie值都不是tts1nortts2,默认使用default对应的服务器,如下:最后一道防线"src="http://p1.pstatp.com/large/pgc-image/6316eadd9c9f419ab479bc583541c173"width="640"height="716">其中,192.168.3.81:5380指向的服务器就是运行新功能的服务器。3、根据权重,我们定义一个upstream,设置三个服务器IP,权重分别为5、3、1。我们先将新函数部署到权重为1的服务器上,然后使用ip_hash进行负载均衡。待权重为1的服务器运行无问题后,再将新函数部署到权重为3的服务器上,如此反复,最终将新函数部署到所有服务器上。如下:最后一道防线"src="http://p1.pstatp.com/large/pgc-image/76629d95ba634cd984127e3d8066d4af"width="640"height="667">总结虽然灰度发布操作复杂,可以在一定程度上保证系统的安全性和稳定性,随着项目的不断发展,系统的稳定性越来越重要,而不是完善的功能,从长远来看,使用灰度发布的优势大于缺点。