前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx通过split_client实现客户端分流

Nginx通过split_client实现客户端分流

作者头像
李俊鹏
发布2020-06-11 16:33:25
3.6K0
发布2020-06-11 16:33:25
举报
文章被收录于专栏:运维研习社

之前介绍过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使用比较灵活,例如可以在并发活动中,通过以上方式限流、分流等。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档