Nginx+KV db进行AB灰度测试

标签: 系统架构 | 发表时间:2012-07-12 23:26 | 作者:风的尾巴
出处:http://www.blogread.cn/it/

标签:   灰度测试

周6参加华东运维大会,听了人家淘宝用nginx的一些场景,其中AB的灰度测试可能适用场景会比较普遍,当然大会上,并没有详细讨论实现。

大概需求是: 网站类业务在更新new feature时,并不想让全量用户看到,可以针对地区性用户开放此feature

大概构思了一个方式,使用 nginx+redis/memcache+IP库实现,简单的流程图如下:

 

当然其中的new feature server和normal server不必要一定得是物理上的服务器,可以是任意逻辑上分开的服务和http URI

所用的模块是 ngx-lua-module, 以及一个基于ngx-lua写的lib:  lua-resty-memcached或lua-resty-redis, 这里假设使用memcached作为ip数据的存储,cache内保存以ip作为key,以true(1)或false(0)作为value的数据,nginx在请求到来时,从cache内以remote_addr(如果是用XFF头,则对XFF做一次处理后获取到real ip)作为key从cache内做一次get,判断此req应该的转发;

这里有一个问题是:cache内是保存具体的IP形式的方式,还是以CIDR的超网形势存储,若直接使用IP作为key,数据量不容小视,而且IP信息的准确度得有一定的保证才行;若使用CIDR的方式,则在nginx端又会增加一次IP转换CIDR以及对get到的CIDR做比较(具体实现方法还没想到), 复杂度会有所增加,个人偏向直接使用IP作为key,只要保证了IP的一定准确性,数据大小问题不大,现在遍地都是32G,64G内存的缓存。

若使用ip作为key,一个折中的办法是每次进行ABtest的时候,flush缓存,只保存指定地区的ip数据即可,ngx在做get的时候,如果没有返回,则认为此req是到normal server的.

管理平台方面,只需要做个简单的批量set缓存的功能就可以了,至于UI么,就看你给谁用了,自己用嘛,UI丑陋点就丑陋点了 :)

性能和可用性方面:

增加了一次缓存的连接和get操作,理论上此开销应该是很小的,ngx-lua实现的lua-resty-memcached有不少人做过测试,性能非常可观.

可用性方面会增加一个当缓存断线的风险点,通过settimeout,将缓存超时限制到一个较小的时间,影响较小,另外ABtest的方案也不应该常年累月的在线上,只有在有需求时,才需要这套系统吧,因此可用性方面对全局影响应该是较小的,相比新的feature上线时影响全部用户的风险,这个冒险还是值得的。

 

上述暂时只是个人的思路,而且也还没上线使用,实现方面只完成了nginx获取key来判断req转发的验证,针对此方式也未做过详细压力测试,抛砖引玉,有好的方式欢迎讨论.

您可能还对下面的文章感兴趣:

很抱歉,暂时没有......


相关 [nginx kv db] 推荐:

Nginx+KV db进行AB灰度测试

- - IT技术博客大学习
周6参加华东运维大会,听了人家淘宝用nginx的一些场景,其中AB的灰度测试可能适用场景会比较普遍,当然大会上,并没有详细讨论实现. 大概需求是: 网站类业务在更新new feature时,并不想让全量用户看到,可以针对地区性用户开放此feature. 大概构思了一个方式,使用 nginx+redis/memcache+IP库实现,简单的流程图如下:.

基于lucene的内嵌式kv存储

- - 开源软件 - ITeye博客
诸多业务场景下,都有使用kv型式存储数据供快速查询的需求. 正常的做法有使用HashMap存入内存,或者存入外部的nosql KV数据库/缓存. 使用HashMap做KV存储,速度快,但是如果数据量达到百万及至千万级时,HashMap必将占用大量的java堆内存,给应用带来极大的内存回收压力. 外部kv存储,以堆外(offHeap)存储的方式让我们的应用免于内存回收之忧,但其查询性能往往低于内存map.

滴滴从KV存储到NewSQL实战

- - DockOne.io
【编者的话】本文讲诉滴滴在分布式NoSQL存储Fusion之上构建NewSQL的实践之路. 详细描述Fusion-NewSQL的特性,应用场景,设计方案. Fusion-NewSQL是由滴滴自研的在分布式KV存储基础上构建的NewSQL存储系统. Fusion-NewSQ兼容了MySQL协议,支持二级索引功能,提供超大规模数据持久化存储和高性能读写.

db file sequential read等待事件总结

- - CSDN博客数据库推荐文章
该等待事件的参数:file#,first block#,and block count(一般是1)可以从dba_extents去确定访问的段,属于I/O类的等待. The Oracle process wants a block that is currently not in the SGA, and it is waiting for the database block to be read into the SGA from disk..

Python连接数据库之DB-API

- - 标点符
在Python中如果要连接数据库,不管是 MySQL、 SQL Server、 PostgreSQL亦或是SQLite,使用时都是采用游标的方式,所以就不得不学习Python DB-API. Python所有的数据库接口程序都在一定程度上遵守 Python DB-API 规范. DB-API定义了一系列必须的对象和数据库存取方式,以便为各种底层数据库系统和多种多样的数据库接口程序提供一致的访问接口.

[原]online db如何做字段扩充

- - yangfei的私房菜
声明:部分内容来自网络收集.     线上User表目前存在四个字段user(uid, name, passwd, nick),现在需要增加两个字段age, sex,变为user(uid, name, passwd, nick, age, sex).     目前user表数据量较大,且并发请求量较大.

在有序的KV引擎之上建造结构化数据库引擎

- - idea's blog
KV 数据结构极大地简化了存储引擎的接口和实现. 基本的 KV 接口一般就是 Get(), Set(), 实现上代码也很简单, 极简的实现可以直接利用编码语言提供的 map(哈希, 红黑树)来提供内存数据结构, 而且硬盘上直接 dump 内存数据即可(类似 Redis 的策略).. 不过, KV 存储引擎自己省事了, 但使用者不喜欢, 因为大部分的业务并不是 KV 所能表达的, 业务需要丰富的数据结构, 表格(table), 列表(list), map 等各种容器.

nginx配置ssl

- - 邢红瑞的blog
先生成网关证书 ,仿照CA模式.

Nginx安装

- - 企业架构 - ITeye博客
nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环境可以使用以下指令. centos平台编译环境使用如下指令. 一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩.

Nginx GZip 压缩

- - 开心平淡对待每一天。热爱生活
  Nginx GZip 模块文档详见: http://wiki.nginx.org/HttpGzipModule 常用配置片段如下:. # 压缩比例,比例越大,压缩时间越长. 默认是1 gzip_types. text/css text/javascript; # 哪些文件可以被压缩 gzip_disable.