前言
随着公司业务规模扩大,传统的架构已无法支撑业务量阶梯式的增长,应用发布也必须迎来调整。之前的发布方式,需要通过脚本切换nginx,然后通过ansible进行批量发布;由于业务的特殊性质,原有方案一旦上线代码出现bug或者人为出现操作失误,将导致大面积应用无法提供服务,为了避免故障发生造成毁灭性的后果,决定分布进行架构调整。
灰度发布方式选择
通过nginx进行灰度发布大概有如下三种方式,三种方式各有优缺点:
1、Nginx+Lua脚本实现(可定制化高,需要编程基础,实现难度较大)
2、通过判断cookie值实现(可定制cookie值,精准定位到指定用户,配置简单)
3、通过判断源IP实现(配置简单,但是大多情况ip可变,无法准确定位)
通过商讨,决定使用判断cookie值实现灰度发布,可以快速达到我们的需求
架构图
现有Nginx集群变更成公共Nginx集群,增加区域Nginx集群若干及主入口Nginx集群,用户通过SLB访问进入主入口Nginx集群,再通过指定的cookie值转发到区域集群,没有cookie标记的统一转发到公共集群。主入口Nginx集群仅做转发功能,不额外配置其他服务,减少Nginx配置文件的改动。
配置过程
操作系统:CentOS-7.5
Nginx版本:openresty-1.11.2
主入口nginx.conf配置如下,主要增加cookie判断:
http {
upstream common {
server 10.0.0.1 weight=10;
server 10.0.0.2 weight=10;
}
upstream area1 {
server 10.10.0.1 weight=10;
server 10.10.0.2 weight=10;
}
upstream area2 {
server 10.20.0.1 weight=10;
server 10.20.0.2 weight=10;
}
server {
listen 80;
server_name www.test.com;
set $server "common";
if ($http_cookie ~* "area_code=A01"){
set $server area1;
}
if ($http_cookie ~* "area_code=A02"){
set $server area2;
}
location / {
proxy_pass http://$server;
}
}
}
公共及区域Nginx配置,只需配置转发到后端服务器即可。
测试
用户第一次访问时,因为没有带cookie,默认访问到公共Nginx,服务器向用户端存放指定区域cookie;第二次访问时,主入口Nginx通过判断,用户cookie中的area_code,将用户转向指定区域Nginx。
结束语
通过以上配置,可以灰度发布某个小流量区域的版本,通过测试后再按百分比进行逐步发布到全服,以此减小发布失败对项目造成的影响。