Nginx 通过 split_client 实现客户端分流
之前介绍过Nginx通过cookie做灰度发布,通过判断 cookie,将不同的请求根据需求分流到不同的后端,如图
上面的方法是通过判断 cookie 来进行分流的,其实在 Nginx 中专门有个模块是做客户端分流的——split_clients
在 nginx 官网文档中,定义 split_clients 是可以用来构建适用于 A/B 测试的变量
它这句话,如果你没使用 split_clients 的话,比较难理解,其实它就是定义了一组变量,通过使用变量来进行分流
如果你读了上面通过 cookie 做灰度发布的话,里面有关于 nginx 中 map 的介绍,你会发现 split_clients 和 map 定义变量是一样的,只不过,它这里还有一个 hash 算法的配置比例
split_clients 是通过 MurmurHash2 算法对原始字符串进行哈希处理,源码在 http/modules/ngx_http_split_clients_module.c
MurmurHash 算法在 core/ngx_murmurhash.c
就这么一段,murmurhash 是一种非加密型哈希函数,由 Austin Appleby 于 08 年发明,现在最新版本为 murmurhash3,性能是 md5 的 4 倍左右,在 redis 中应用广泛,包括数据库、集群、哈希键、阻塞操作 等功能都有用到这个算法
在 nginx 中, split_clients 执行过程如下:
对设定的变量获取到的值执行 Murmurhash2 算法得到 32 位整型哈希值,记为 hash
32 位无符号整型的最大数字 2^32-1,记为 max,也就是最大值
哈希数字与最大数字相除 hash/max,可以得到百分比 percent
配置指令中配置各个百分比范围对应的新变量值
当 percent 落在配置的范围里时,新变量值就对应赋值给 $variant
各个百分比相加不能超过 100%,* 表示匹配剩余的百分比,百分比可以为小数点后两位的小数
以上就是 split_clients 的执行过程,因为 split_clients 可以构造新的变量,通过这个特性,我们可以把该变量作为内部自定义变量用在很多地方,比如上图中,将该变量用在 upstream 的命名中,这个时候,我们就可以通过 remote_ip、cookie_hash、url_hash 等你需要的变量来进行分流,让不同的客户端,访问到对应的 upstream 上游服务器,配置示例如下:
类似的,还可以在 fastcgi 代理的时候,设置不同的 fpm 后端,另外可以在配置代理缓存、临时文件缓存时将不同的缓存分别存储到不同的位置等
split_client 使用比较灵活,例如可以在并发活动中,通过以上方式限流、分流等
更多使用方式欢迎评论留言!
版权声明: 本文为 InfoQ 作者【运维研习社】的原创文章。
原文链接:【http://xie.infoq.cn/article/ffcc57e6fb190ab0e0b19159e】。文章转载请联系作者。
评论