nginx常见分发算法实现

nginx常见分发算法实现

之前我在 几种均衡负载算法里介绍了几种均衡算法。

这篇文章,主要介绍如何在nginx配置。

流量的分类

1. 单个请求消耗的资源大致一样,返回的响应大小也都差不多,如一些常见web服务的接口操作,都是做业务逻辑运算,Db查询写入,与第三方服务交互
2. 单个请求消耗的资源不一样,返回的响应大小也都千差万别,如npm下载tar包、docker拉镜像的layer层,每一层根据用户业务构建大小不一致,如算法组会把模型打入镜像、java服务开发,就是基础镜像jdk加用户的jar包

针对第一种我们可以用轮询、加权轮询、随机、 ip_hash; 第二种情况分为两种:如果是npm包,会存在很多公共包,可以基于URL的hash分发, 把相同的包请求分发到一台机器,这台机器上缓存热点包,减少服务到DFS文件的网络时间,优化链路,加快下载速度;如果是docker镜像,每个镜像都是用户自己构建,存在公共包比较少,则可以综合计算机器一段时间内负载、cpu、流量的情况,把请求分发到目前比较空闲的机器上。

基于轮询分发

upstream web {
        server server1;
        server sever2;
}

server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://web;
    }
}

基于主备分发

默认分发到主,主宕机后分发到备

upstream web {
   server server1;
   server server2 backup;
}

server {
 listen 80;
 server_name localhost;
 location / {
   proxy_pass http://web;
 }
}

轮询基于权重

配置机器性能好的高权重,可以有效利用机器资源

upstream web {
   // 设置权重比例 1:2
   server server1 weight=1;
   server server2 weight=2;
}

server {
 listen 80;
 server_name localhost;
 location / {
   proxy_pass http://web;
 }
}

基于ip_hash分发

可以使来自同样源地址的请求都打到同一台机器上

upstream web {
   // 指定ip_hash即可开启,默认权重1:1,不支持修改
   ip_hash;
   server server1;
   server server2;
}

server {
 listen 80;
 server_name localhost;
 location / {
   proxy_pass http://web;
 }
}

基于URL的hash分发

可以把相同的url分发到同一台机器上,url计算出hash值,除以机器的数量取余。(需要安装第三方插件)

upstream web {
    consistent_hash $request_uri;
    server server1;
    server server2;
}

server {
  listen 80;
  server_name localhost;
  location / {
    proxy_pass http://web;
  }
}

总结

根据流量类型的不同,选择合适的均衡算法;常用的均衡算法: 轮询、加权轮询、随机、ip_hash、 url的hash分发、根据机器性能实时计算分发。

你可能感兴趣的:(nginx,运维)