新浪的动态策略灰度发布系统:ABTestingGateway
原文链接:http://www.open-open.com/lib/view/open1439889185239.html
ABTesingGateway 是一个可以动态设置分流策略的灰度发布系统,工作在7层,基于tengine,采用ngx-lua开发,使用 redis 作为分流策略数据库,可以实现动态调度功能。
nginx是目前使用较多的7层服务器,可以实现高性能的转发和响应;ABTestingGateway 是在 nginx 转发的框架内,在转向 upstream 前,根据 用户请求特征 和 系统的分流策略 ,查找出目标upstream,进而实现分流。
在以往的基于 nginx 实现的灰度系统中,分流逻辑往往通过 rewrite 阶段的 if 和 rewrite 指令等实现,优点是性能较高,缺点是功能受限、容易出错,以及转发规则固定,只能静态分流。针对这些缺点,我们设计实现了ABTesingGateway,采用 ngx-lua 实现系统功能,通过启用lua-shared-dict和lua-resty-lock作为系统缓存和缓存锁,系统获得了较为接近原生nginx转发的性能。

ABTesingGateway 的架构简图
Features:
支持多种分流方式,目前包括iprange、uidrange、uid尾数和指定uid分流
动态设置分流策略,即时生效,无需重启
可扩展性,提供了开发框架,开发者可以灵活添加新的分流方式,实现二次开发
高性能,压测数据接近原生nginx转发
灰度系统配置写在nginx配置文件中,方便管理员配置
适用于多种场景:灰度发布、AB测试和负载均衡等
系统实现
分流功能:
转发分流是灰度系统的主要功能,目前 ABTesingGateway 支持ip段分流(iprange)、uid用户段分流(uidrange)、uid尾数分流(uidsuffix)和指定特殊uid分流(uidappoint)四种方式。
ABTesingGateway 依据系统中配置的运行时信息runtimeInfo进行分流工作;通过将 runtimeInfo 设置为不同的分流策略,实现运行时分流策略的动态更新,达到动态调度的目的。
系统运行时信息设置

如图所示
系统管理员通过系统管理接口将分流策略policy设置为运行时策略,并指定该策略对应的分流模块名divModulename和用户信息提取模块名userInfoModulename后,系统可以进行分流工作。
系统对用户请求进行分流时,首先获得系统运行时信息runtimeInfo中的信息,然后提取用户特征userInfo,最后分流模块divModule根据分流策略dviDataKey和用户特征userInfo查找出应该转发到的upstream。如果没有对应的upstream,则将该请求转向默认upstream。
以iprange分流为例
以某个iprange分流策略为例:
{
"divtype":"iprange",
"divdata":[
{"range":{"start":1111, "end":2222}, "upstream":"beta1"},
{"range":{"start":3333, "end":4444}, "upstream":"beta2"},
{"range":{"start":7777, "end":8888}, "upstream":"beta3"}
]
}其中divdata中的每个 range:upstream 对中,range 为 ip 段,upstream 为 ip 段对应的后端;range 中的 start 和 end 分别为 ip 段的起始和终止, ip以整型表示。 当灰度系统启用iprange分流方式时,会根据用户请求的ip进行分流转发。 假如用户请求中的ip信息转为整型后是4000,将被转发至beta2 upstream。
分流过程流程图

分流过程流程图
管理功能:

管理功能架构图
1. 管理员登入后,得到系统信息视图,运行时信息视图,可以进行策略管理和运行时信息管理
2. 业务接口层向管理员提供 增/删/查/改 接口
3. 适配层将承担业务接口与分流模块的沟通工作
4. 适配层提出统一接口,开发人员可以通过实现接口来添加新的分流方式
管理接口:
[策略管理接口]
#分流策略检查,参数为一个分流策略数据的json串
1. /admin/policy/check
#分流策略添加,参数与check接口一致
2. /admin/policy/set
#分流策略读取,参数为要读取策略的policyid
3. /admin/policy/get
#分流策略删除,参数为要删除策略的policyid
4. /admin/policy/del [运行时信息管理接口]
#设置分流策略为运行时策略,参数为policyid
1. /admin/runtime/set
#获取系统当前运行时信息,无参数
2. /admin/runtime/get
#删除系统运行时信息,关闭分流接口,无参数
3. /admin/runtime/del
快速部署
软件依赖
tengine-2.1.0
LuaJIT-2.1-20141128
ngx_lua-0.9.13
lua-cjson-2.1.0.2
redis-2.8.19
系统部署
repo中的utils/conf文件夹中有灰度系统部署所需的最小示例
1. git clone https://github.com/SinaMSRE/ABTestingGateway
2. cd /path/to/ABTestingGateway/utils #启动redis数据库
3. redis-server conf/redis.conf #启动upstream server,其中stable为默认upstream
4. /usr/local/nginx/sbin/nginx -p `pwd` -c conf/stable.conf
5. /usr/local/nginx/sbin/nginx -p `pwd` -c conf/beta1.conf
6. /usr/local/nginx/sbin/nginx -p `pwd` -c conf/beta2.conf
7. /usr/local/nginx/sbin/nginx -p `pwd` -c conf/beta3.conf
8. /usr/local/nginx/sbin/nginx -p `pwd` -c conf/beta4.conf #启动灰度系统,proxy server,灰度系统的配置也写在conf/nginx.conf中
9. /usr/local/nginx/sbin/nginx -p `pwd` -c conf/nginx.conf
灰度系统使用demo
管理功能
1. 部署并启动系统 2. 查询系统运行时信息,得到null
0> curl 127.0.0.1:8030/admin/runtime/get
{"errcode":200,"errinfo":"success ","data":{"divModulename":null,"divDataKey":null,"userInfoModulename":null}} 3. 查询id为9的策略,得到null
0> curl 127.0.0.1:8030/admin/policy/get?policyid=9
{"errcode":200,"errinfo":"success ","data":{"divdata":null,"divtype":null}} 4. 向系统添加策略,返回成功,并返回新添加策略的policyid
以uidsuffix尾数分流方式为例,示例分流策略为:
{
"divtype":"uidsuffix",
"divdata":[
{"suffix":"1", "upstream":"beta1"},
{"suffix":"3", "upstream":"beta2"},
{"suffix":"5", "upstream":"beta1"},
{"suffix":"0", "upstream":"beta3"}
]
}
添加分流策略接口 /admin/policy/set 接受json化的policy数据
0> curl 127.0.0.1:8030/admin/policy/set -d '{"divtype":"uidsuffix","divdata":[{"suffix":"1","upstream":"beta1"},{"suffix":"3","upstream":"beta2"},{"suffix":"5","upstream":"beta1"},{"suffix":"0","upstream":"beta3"}]}'
{"errcode":200,"errinfo":"success the id of new policy is 0"} 5. 查看添加结果
0> curl 127.0.0.1:8030/admin/policy/get?policyid=0
{"errcode":200,"errinfo":"success ","data":{"divdata":["1","beta1","3","beta2","5","beta1","0","beta3"],"divtype":"uidsuffix"}} 6. 设置系统运行时策略为 0号策略
0> curl 127.0.0.1:8030/admin/runtime/set?policyid=0
{"errcode":200,"errinfo":"success "} 7. 查看系统运行时信息,得到结果
0> curl 127.0.0.1:8030/admin/runtime/get
{"errcode":200,"errinfo":"success ","data":{"divModulename":"abtesting.diversion.uidsuffix","divDataKey":"ab:test:policies:0:divdata","userInfoModulename":"abtesting.userinfo.uidParser"}} 8. 当访问接口不正确返回时,将返回相应的 错误码 和 错误描述信息
0> curl 127.0.0.1:8030/admin/policy/get?policyid=abc
{"errcode":50104,"errinfo":"parameter type error for policyID should be a positive Integer"}分流功能
在验证管理功能通过,并设置系统运行时策略后,开始验证分流功能 1. 分流,不带用户uid,转发至默认upstream
0> curl 127.0.0.1:8030/
this is stable server 2. 分流,带uid为30,根据策略,转发至beta3
0> curl 127.0.0.1:8030/ -H 'X-Uid:30'
this is beta3 server 3. 分流,带uid为33,根据策略,转发至beta2
0> curl 127.0.0.1:8030/ -H 'X-Uid:33'
this is beta2 server
压测结果:

压测环境下灰度系统与原生nginx转发的对比图

压测环境下灰度系统与原生nginx转发的数据对比
如图所示,用户请求完全命中cache是理想中的情况,灰度系统在理想情况下可以达到十分接近原生nginx转发的性能。
产生图中压测结果的场景是:用户请求经过proxy server转向upstream server,访问1KB大小的静态文件。
proxy server的硬件配置:
CPU:E5620 2.4GHz 16核
Mem:24GB
Nic:千兆网卡,多队列
线上部署简图:

项目主页:http://www.open-open.com/lib/view/home/1439889185239
新浪的动态策略灰度发布系统:ABTestingGateway的更多相关文章
- jquery实现隐藏显示层动画效果、仿新浪字符动态输入、tab效果
已经有两年多没登陆csdn账号了,中间做了些旁的事,可是现在却还是回归程序,但改做前端了,虽然很多东西都已忘得差不多了,但还是应该摆正心态,慢慢来,在前端漫游,做一只快乐双鱼. 路是一步一步走出来的, ...
- 基于新浪sae使用php生成图片发布图文微博
1.生成图片的代码: <?php header ("Content-type: image/png"); mb_internal_encoding("UTF-8&q ...
- 基于nginx+lua简单的灰度发布系统
upstream.conf upstream grey_1 { keepalive 1000; server localhost:8020; } upstream grey_2 { keepalive ...
- 使用Nginx实现灰度发布
灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式.AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B ...
- 使用Nginx实现灰度发布(转)
灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式.AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B ...
- 门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结(转)
add by zhj:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群 ...
- 新浪云SAE使用入门,教你如何发布自己的网站
新浪云sae是一个免费的web服务器,SAE的Web服务器采用分布式部署的方式,开发者将代码部署到SAE前端机后,会通过同步的方式,将代码部署到SAE所有的Web服务器.相当于在每一台Web服务器上都 ...
- MWeb 1.3.7 发布!增加发布到 Wordpress 等支持 MetaWeblog API 的服务,如:Wordpress 博客、新浪博客、cnblogs、oschina。
MWeb 1.3.7 版的新功能 增加发布到 Wordpress 等支持 Metaweblog API 的服务,目前经测试过的有: Wordpress 博客.新浪博客.cnblogs.oschina. ...
- MiinCMP1.0 SAE 新浪云版公布, 开源企业站点系统
MiinCMP是一款开源企业站点系统,除可执行于256M左右100元的国内IDC外,JUULUU聚龙软件团队最近开发了面向新浪云的版本号,该版本号可将站点免费布署到新浪云SAE上.MiinCMP採用j ...
随机推荐
- 关于SpringMVC的文件上传
关于文件的上传,之前写过2篇文章,基于Struts2框架,下面给出文章链接: <关于Struts2的文件上传>:http://www.cnblogs.com/lichenwei/p/392 ...
- 8. Django系列之上传文件与下载-djang为服务端,requests为客户端
preface 运维平台新上线一个探测功能,需要上传文件到服务器上和下载文件从服务器上,那么我们就看看requests作为客户端,django作为服务器端怎么去处理? 对于静态文件我们不建议通过dja ...
- 在Visual Stdio 2012中编译执行JM18.6的方法
JM是H.264编码的官方实现,与X264开源实现相比,JM的实现比較完整,代码更加规范.并且同一时候提供了编码和解码过程.便于对照分析.可是JM的最大缺点是效率比X264低.因此.非常多应用都基于X ...
- Dubbo -- 系统学习 笔记 -- 入门
Dubbo -- 系统学习 笔记 -- 目录 入门 背景 需求 架构 用法 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行, ...
- C++ mysql 乱码
C++读mysql数据库中的中文显示出来的是乱码 在连接到数据库后加上这么一句 mysql_query(pMYSQL, "SET NAMES GB2312"); 或者 mysql_ ...
- CM和CDH的安装-准备工作
估计要分开来两篇博客说明,因为截图较多. 1.三个节点cdh1(主节点),cdh2,cdh3 配置就用一张图来说明,因为资源有限 2.版本依赖说明: CDH-5.9.0-1.cdh5.9.0.p0.2 ...
- BootStrap Table将时间戳更改为日期格式
一.使用BootStrap Table遇到的问题: 1.MyBatis从数据库中取出的时间格式如下:2017-12-04 21:43:19.0,时间后面多了一个点零. 2.从BootStrap Tab ...
- ssh面密码登录配置-hadoop安装准备
1. 用ssh-keygen创建公钥,一直回车即可 root@kali:~# ssh-keygen -t rsa Generating public/private rsa key pair. Ent ...
- CentOS6.5下安装Oracle11g
一.安装前系统准备 1. 修改主机名 #sed -i "s/HOSTNAME=localhost.localdomain/HOSTNAME=oracledb.01/" /etc/s ...
- [XPath] XPath 与 lxml (三)XPath 坐标轴
本章我们将沿用上一章的 XML 示例文档. XPath 坐标轴 坐标轴用于定义当对当前节点的节点集合. 坐标轴名称 含义 ancestor 选取当前节点的所有先辈元素及根节点. ancestor-or ...