[整理] 灰度发布策略
灰度发布是什么
- 灰度发布是版本升级平滑过渡的一种方式(也可以增加产品的某些特性)。
- 简而言之,当版本升级时,使部分用户使用高版本,其他用户继续使用低版本,待高版本稳定后,逐步扩大范围把所有用户流量都迁移到高版本上面来。
- AB test也是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。
为什么要做灰度发布?
- 灵活选择用户参与产品测试。
- 规避一定的发布风险,降低产品迭代升级所影响的范围。
- 快速获取用户的反馈意见,完善产品功能,提升产品质量。
- 避免停服发布给用户带来不便。
- 具有容灾能力:降低全量发布引起的服务器崩溃等风险,逐步发布产品,逐步控制服务器压力。
灰度发布常见一般有三种方式
- Nginx+LUA方式
- 根据Cookie实现灰度发布
- 根据来路IP实现灰度发布
灰度发布的流程
- 选定策略:包括用户规模、发布频率、功能覆盖度、回滚策略、运营策略、新旧系统部署策略等
- 筛选用户:包括用户特征、用户数量、用户常用功能、用户范围等
- 部署系统:部署新系统、部署用户行为分析系统(web analytics)、设定分流规则、运营数据分析、分流规则微调
- 发布总结:用户行为分析报告、用户问卷调查、社会化媒体意见收集、形成产品功能改进列表
Nginx+LUA方式
根据Cookie实现灰度发布
nginx+lua根据来访者ip地址区分,由于公司出口是一个ip地址,会出现访问网站要么都是老版,要么都是新版,采用这种方式并不适合
nginx 根据权重来分配,实现很简单,也可以尝试
nginx根据cookie分流,灰度发布基于用户才更合理
两台服务器分别定义为
tts_V6 192.168.3.81:5280
tts_V7 192.168.3.81:5380
默认服务器为:
default:192.168.3.81:5280
前端nginx服务器监听端口80,需要根据cookie转发,查询的cookie的键(key)为tts_version_id(该键由开发负责增加),如果该cookie值(value)为tts1则转发到tts_V6,为tts2则转发到tts_V7。
upstream tts_V6 {
server 192.168.3.81:5280 max_fails=1 fail_timeout=60;
}
upstream tts_V7 {
server 192.168.3.81:5380 max_fails=1 fail_timeout=60;
}
upstream default {
server 192.168.3.81:5280 max_fails=1 fail_timeout=60;
}
server {
listen 80;
server_name test.taotaosou.com;
access_log logs/test.taotaosou.com.log main buffer=32k;
#match cookie
set $group "default";
if ($http_cookie ~* "tts_version_id=tts1"){
set $group tts_V6;
}
if ($http_cookie ~* "tts_version_id=tts2"){
set $group tts_V7;
}
location / {
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
根据来路IP实现灰度发布
nginx 的语法本身可以看作是一门小型的编程语言,通过简单的编程,可以轻松实现基于IP的灰度发布。
需求:搭建准生产环境,供开发人员/运维在线上做最后的调整。如果OK,直接用rsync推送至生产环境。
条件:办公室网络出口有固定IP
解决办法:
- nginx 负载均衡器判断客户端IP地址,
- 如果是办公室IP,则反向代理到准生产环境;
- 如果不是,则反向代理到生产环境。
upstream prod {
server 192.168.1.10;
server 192.168.1.11;
}
upstream pre-prod {
server 192.168.1.100;
}
server {
listen 80;
access_log /var/log/nginx/access.log main;
set $web_backend prod;
if ($remote_addr ~ "123.123.123.123") {
set $web_backend pre-prod;
}
location / {
proxy_pass http://$web_backend;
include proxy.conf;
}
}
同理,也可以根据不同的IP,设置不同的网站根目录,达到相同的目的。
server {
listen 80;
access_log /var/log/nginx/access.log main;
set $rootdir "/var/www/html";
if ($remote_addr ~ "123.123.123.123") {
set $rootdir "/var/www/test";
}
location / {
root $rootdir;
}
}
同理,还可以利用geoip做基于地理位置的灰度发布,不详细介绍。
注: set 命令依赖rewrite 模块。
附记:在茫茫的信息海洋中,遇到就是有缘,期待回复交流,为缘分留下痕迹……