[整理] 灰度发布策略

灰度发布是什么

  1. 灰度发布是版本升级平滑过渡的一种方式(也可以增加产品的某些特性)。
  2. 简而言之,当版本升级时,使部分用户使用高版本,其他用户继续使用低版本,待高版本稳定后,逐步扩大范围把所有用户流量都迁移到高版本上面来。
  3. AB test也是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。

为什么要做灰度发布?

  • 灵活选择用户参与产品测试。
  • 规避一定的发布风险,降低产品迭代升级所影响的范围。
  • 快速获取用户的反馈意见,完善产品功能,提升产品质量。
  • 避免停服发布给用户带来不便。
  • 具有容灾能力:降低全量发布引起的服务器崩溃等风险,逐步发布产品,逐步控制服务器压力。

灰度发布常见一般有三种方式

  • Nginx+LUA方式
  • 根据Cookie实现灰度发布
  • 根据来路IP实现灰度发布

灰度发布的流程

  • 选定策略:包括用户规模、发布频率、功能覆盖度、回滚策略、运营策略、新旧系统部署策略等
  • 筛选用户:包括用户特征、用户数量、用户常用功能、用户范围等
  • 部署系统:部署新系统、部署用户行为分析系统(web analytics)、设定分流规则、运营数据分析、分流规则微调
  • 发布总结:用户行为分析报告、用户问卷调查、社会化媒体意见收集、形成产品功能改进列表

Nginx+LUA方式

参见: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
解决办法:

  1. nginx 负载均衡器判断客户端IP地址,
  2. 如果是办公室IP,则反向代理到准生产环境;
  3. 如果不是,则反向代理到生产环境。
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 模块。

posted @ 2020-11-24 13:45  哆啦梦乐园  阅读(456)  评论(0编辑  收藏  举报