写点什么

Nginx 通过 split_client 实现客户端分流

发布于: 2021 年 05 月 15 日

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


更多使用方式欢迎评论留言!

发布于: 2021 年 05 月 15 日阅读数: 256
用户头像

运维技术社区,坚持运维技术研究与分享 2020.07.14 加入

「运维研习社」技术社区发起人,同名公众号「运维研习社」、知识星球,专注运维技术研究分享,坚持原创,希望能和大家在运维路上结伴而行!

评论

发布
暂无评论
Nginx通过split_client实现客户端分流