侧边栏壁纸
博主头像
qingtian博主等级

喜欢是一件细水流长的事,是永不疲惫的双向奔赴~!

  • 累计撰写 104 篇文章
  • 累计创建 48 个标签
  • 累计收到 1 条评论

Nginx学习2

qingtian
2021-10-25 / 0 评论 / 1 点赞 / 1,342 阅读 / 4,716 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-11-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Nginx learning 2

Nginx的集群负载均衡解析

单节点

单机节点部署在最后会成为限制系统性能的瓶颈

集群

将系统进行水平扩容

Nginx集群负载均衡

image-20211024110142484

四层负载均衡

  • F5硬负载均衡
  • LVS四层负载均衡 基于linux内核的四层负载与通信协议无关
  • Haproxy四层负载均衡 灵活性高
  • Nginx四层负载均衡 基于http进行负载均衡

七层负载均衡

是基于应用层的,基于http协议的负载均衡

  • Nginx七层负载均衡
  • Haproxy七层负载均衡
  • apache七层负载均衡

基于DNS的地域负载均衡

image-20211024121013948

交给DNS服务器来处理,根据就近原则将请求分配至相应的服务器

编辑nginx配置文件

#配置上游服务器
upstream tomcats {
        server  192.168.1.173:8080;
        server  192.168.1.174:8080;
        server  192.168.1.175:8080;
}
server {
        listen  80;
        server_name  www.tomcats.com;
        location / {
                proxy_pass  http://tomcats;
        }
}

使用JMeter测试单节点和集群的并发异常率

负载均衡

  • 轮询——负载均衡的默认策略

  • 轮询——加权轮询

    #配置上游服务器
    upstream tomcats {
            server  192.168.1.173:8080  weight=1;
            server  192.168.1.174:8080  weight=3;
            server  192.168.1.175:8080  weight=5;
    }
    server {
            listen  80;
            server_name  www.tomcats.com;
            location / {
                    proxy_pass  http://tomcats;
            }
    }
    
  • IP_HASH策略负载均衡

    IP_HASH可以保证来自同一个ip的会话会一直落在一台服务器上。

    image-20211025221435977

    upstream tomcats {
    		ip_hash;
            server  192.168.1.173:8080  weight=1;
            server  192.168.1.174:8080  weight=3;
            server  192.168.1.175:8080  weight=5;
    }
    

    Nginx的ip_hash算法

    image-20211025222050020

    Nginx的Hash算法实际上是根据ip段前三位来计算的,所以在相同段的ip地址中的请求会一直落在同一台服务器上。

    使用IP_HASH的注意点,

    If one of the servers needs to be temporarily removed, it should be marked with the down parameter in order to preserve the current hashing of client IP addresses.

    upstream backend {
        ip_hash;
    
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com down;
        server backend4.example.com;
    }
    

    如果需要临时将一台服务器移除时,不能直接将其删除,这样会导致hash值的突然变化。需要使用down参数

  • 一致性hash算法

    image-20211025223449960

    每个用户经过hash算法,通过就近原则去使用附近的服务器节点。

    使用一致性hash算法,无论在减少还是增加服务器时都只会尽可能少的影响到其他区域的用户节点,如下所示

    image-20211025224719234

  • url_hash负载均衡策略

    根据不同的url来进行hash计算,分配到不同的服务器节点上

    image-20211025225111716

    upstream backend {
        hash	$request_uri;
    
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com down;
        server backend4.example.com;
    }
    
  • 负载均衡之least_conn

    根据哪一台服务器节点的请求数最少就去请求哪一台服务器。

upstream指令参数

  • max_conns:限制一台服务器的最大请求连接数

    limits the maximum number of simultaneous connections to the proxied server (1.11.5). Default value is zero, meaning there is no limit. If the server group does not reside in the shared memory, the limitation works per each worker process.

    限制到代理服务器的最大同时连接数 (1.11.5)。默认值为零,表示没有限制。如果服务器组不驻留在共享内存中,则限制适用于每个工作进程。

    有关Nginx中的共享内存接口

    NGINX提供了一系列的共享内存使用接口。我们在开发新的模块时,使用现有的接口可以很容易地实现和使用共享内存提供的便利。

    我们以ngx_http_limit_conn_module模块为例来分析NGINX提供的这一系列共享内存的接口是如何使用的。这一模块是用来限制某一IP的并发连接数,防止恶意的流量攻击。它通过limit_conn_zone指令定义了一片共享内存区域用来存储会话状态,当前连接数等等信息以供多个worker进程共享使用。

    此模块共享内存使用的流程如下:

    a. 在NGINX启动时,Master进程开始解析所有的配置指令。在解析到指令limit_conn_zone时,函数ngx_http_limit_conn_zone被调用。

    b. 函数ngx_http_limit_conn_zone解析配置中的name和size参数,并且生成一个ngx_shm_zone_t结构。然后调用函数ngx_shared_memory_add把这共享内存的创建申请加入到全局数据结构ngx_cycle_t中的shared_memory链表中。

    c. 函数ngx_shared_memory_add通过ngx_shm_zone_t结构中的name,size和tag属性判断是否有重复的结构已经存在,或者相同名字和size的结构已经被用等有效性检查。如果找到原来已经定义对的相同的结构,则直接返回。否则把生成的结构挂到全局结构ctx中的shared_memory列表成员中。至此为止的动作只是把共享内存申请的需求加入到shared_memory列表中,并没有真正的进行共享内存的分配。

    d. Master进程在NGINX解析完配置文件以后,调用函数ngx_init_cycle进行初始化。函数ngx_init_cycle会对所有注册的共享内存调用ngx_shm_alloc来申请共享内存空间。函数ngx_shm_alloc根据系统配置调用mmap或者shmget来申请共享内存虚拟地址空间。

    e. 生成共享内存虚拟地址空间以后,调用函数ngx_init_zone_pool来申请和初始化共享内存空间。这个初始化函数是把申请到的内存空间初始化为ngx_slab_pool_t结构。然后分别调用ngx_shmtx_create和ngx_slab_init来初始化使用此共享内存的互斥锁以及初始化生成内存 slab结构。通过这个结构可以方便地管理和使用分配到的内存。

    f. 最后调用ngx_shm_zone_t结构中的init函数指针,来初始化各个模块需要的数据结构。我们举例的ngx_http_limit_conn_module模块对应的初始化函数就是ngx_http_limit_conn_init_zone。

    以上操作只发生在master进程中。当master进程初始化完毕,调用fork生成子进程,所有的子进程就会自动继承父进程通过mmap生成的虚拟地址空间,从各个worker子进程之间可以共享上述生成的内存。

  • slow_start:使得服务器慢慢地加入到集群中,而不是一启动就加入集群中,因为有的服务器在启动之后还需要做其他额外的配置。也便于运维人员可以观察到流量有小到多的一个过程可以用来分析。

    sets the time during which the server will recover its weight from zero to a nominal value, when unhealthy server becomes healthy, or when the server becomes available after a period of time it was considered unavailable. Default value is zero, i.e. slow start is disabled.

    If there is only a single server in a group, max_fails, fail_timeout and slow_start parameters are ignored, and such a server will never be considered unavailable.

    If there is only a single server in a group, max_fails, fail_timeout and slow_start parameters are ignored, and such a server will never be considered unavailable.

    设置服务器将其权重从零恢复到标称值的时间,当不健康的服务器变得健康时,或者当服务器被认为不可用一段时间后变得可用时。 默认值为零,即禁用慢启动.

    slow_start只适用于weight的负载均衡策略中,不适用于hash和random负载均衡策略,意味着在指定的时间内将该服务器的weight从0上升的配置的wieght级别。

    如果组中只有一个服务器,则忽略 max_fails、fail_timeout 和 slow_start 参数,并且永远不会认为这样的服务器不可用。

    #配置上游服务器
    upstream tomcats {
            server  192.168.1.173:8080  weight=6 slow_start=60s; 
            server  192.168.1.174:8080  weight=2;
            server  192.168.1.175:8080  weight=2;
    }
    server {
            listen  80;
            server_name  www.tomcats.com;
            location / {
                    proxy_pass  http://tomcats;
            }
    }
    
  • down:配置集群中的某台服务器不可以被使用到

    #配置上游服务器
    upstream tomcats {
            server  192.168.1.173:8080  down; 
            server  192.168.1.174:8080  weight=2;
            server  192.168.1.175:8080  weight=2;
    }
    server {
            listen  80;
            server_name  www.tomcats.com;
            location / {
                    proxy_pass  http://tomcats;
            }
    }
    
  • backup:表明被标记的server是一台备用机,在普通情况下不会被用户访问到,只有在其他server挂掉之后才能被访问到。

  • max_fails:最大失败次数,如果一台server的失败次数到达max_fails时,则认为此台服务器已经宕机,Nginx会将它从集群服务中剔除。

  • fail_timeout:失败时间,在Nginx通过max_fails判断一台服务器宕机后,不会直接剔除,而是等待相应的fail_timeout时间之后在给予这台server请求尝试,判断它有没有恢复正常,依次来循环。

  • keepalive:将所配置的链接作为长链接,避免创建和关闭链接的网络损耗。

0

评论区