zoukankan      html  css  js  c++  java
  • Nginx * 负载均衡

    常见负载均衡算法

     
    • 轮询(默认)
    • 权重
      • weight,访问比率等于权重之比
    • IP 哈希
      • 解决session问题:每个请求访问IP的hash结果分配,这样每个访客可以固定到后端某一个台服务器。
      • 问题:
        • 如某台服务器挂掉,对应ip_hash找不到该机器?
          • 如果哈希选择失败次数达到20次以上,回退到轮询策略进行选择。
        • 如果同一IP地址请求较多,造成某一服务器压力较大,而其余的服务器较空闲?。
          • 可以使用url_hash 进一步细分,来实现负载均衡。
    • 最少连接(least_conn)
      • 选择连接数最少的服务器
    • url_hash(第三方)
      • 按访问URL的hash结果来分配请求,使每个URL定向到同一个后端服务器。后端服务器为缓存时比较适用。
      • 此中策略中,不能使用weight,等其他参数。
    • fair(第三方)
      • 按后端服务器的响应时间来分配请求,响应时间短的优先分配
     
     
    配置模块--upstream模块

    upstream模块可定义一个新的上下文, 它包含了一组upstream服务器,这些服务器可能被赋予了不同的权重、不同的类型甚至可以基于维护等原因被标记为down。
    upstream模块经常使用在 proxy模块中;
     
    常用指令
    • ip_hash
      • 基于客户端IP地址完成请求的分发
      • 它可以保证来自于同一个客户端的请求始终被转发至同一个upstream服务器;
    • keepalive
      • 每个worker进程为发送到upstream服务器的连接所缓存的个数;
    • least_conn
      • 最少连接调度算法;
    • server:定义一个upstream服务器的地址,还可包括一系列可选参数,如:
      • weight
        • 权重
      • max_fails
        • 最大失败连接次数,失败连接的超时时长由fail_timeout指定;
      • fail_timeout
        • 等待请求的目标服务器发送响应的时长;
      • backup
        • 用于fallback的目的,所有服务均故障时才启动此服务器;
      • down
        • 手动标记其不再处理任何请求;
     
    应用场景

    官方给的简单例子:
    upstream backend {
        server backend1.example.com       weight=5;
        server backend2.example.com:8080;
        server unix:/tmp/backend3;
    
        server backup1.example.com:8080  backup;
        server backup2.example.com:8080  backup;
    }
    
    server {
        location / {
            proxy_pass http://backend;
        }
    }
    动态选择的例子
    resolver 10.0.0.1;
    
    upstream dynamic {
        zone upstream_dynamic 64k;
    
        server backend1.example.com      weight=5;
        server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
        server 192.0.2.1                 max_fails=3;
        server backend3.example.com      resolve;
        server backend4.example.com      service=http resolve;
    
        server backup1.example.com:8080  backup;
        server backup2.example.com:8080  backup;
    }
    
    server {
        location / {
            proxy_pass http://dynamic;
            health_check;
        }
    }


     
    实践与问题

    实现默认轮询与权重
         // 权重
          upstream backend {
                  server 10.103.100.3:8090 weight=2;
                  server 10.103.100.4:8090;
         }
         // 默认轮询
          upstream backend {
                  server 10.103.100.3:8090;
                  server 10.103.100.4:8090;
           }
     
          server {
     
              listen 80;
              server_name localhost;
     
              location /{
                  proxy_pass http://backend;
              }
         }
    问题
    • upstream 模块是在http配置块底下,放在server配置块里面会报错
    • upstream server 定义后台服务器时直接指定主机名和端口即可
      • 不需要加上http://
      • http:// 在proxy_pass 中加上即可
    • weight 默认值为1
     
    IP_hash
    // 带权重ip_hash
          upstream backend {
                   ip_hash;
                  server 10.103.100.3:8090 weight=2;
                  server 10.103.100.4:8090;
         }
         // 普通ip_hash
          upstream backend {
                  ip_hash;
                  server 10.103.100.3:8090;
                  server 10.103.100.4:8090;
           }
     
          server {
     
              listen 80;
              server_name localhost;
     
              location /{
                  proxy_pass http://backend;
              }
         }
    注意:
    • weight,ip_hash 可以叠加使用
  • 相关阅读:
    如何检测死锁并快速定位死锁位置
    几种线程本地存储变量和普通变量的性能比较
    multi_index_container性能测试
    [高并发引擎]定时器模块
    [高并发引擎]Log模块
    静态博客教程 1:hexo + github
    蛇形填数
    实现简单的 ls 命令
    静态库与动态库的创建和使用
    用两个栈实现队列
  • 原文地址:https://www.cnblogs.com/Aiapple/p/7367877.html
Copyright © 2011-2022 走看看