栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

nginx负载均衡中常见的算法及原理

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

nginx负载均衡中常见的算法及原理

nginx负载均衡中常见的算法及原理
  • 1. Nginx负载均衡中常见的算法
    • 1.1 轮询(round robin)
    • 1.2 加权轮询(weight round robin)
    • 1.3 源地址hash(ip_hash)
    • 1.4 目的Url hash(url_hash)
    • 1.5 最少连接数(least_conn)
    • 1.6 最快响应时间(fair)
  • 2. 源码剖析
    • 2.1 轮询(round robin)
    • 2.1.1 RR 请求流程图
    • 2.1.2 RR 请求源码
    • 2.2 源地址hash(ip_hash)
    • 2.3 加权轮询(weight round robin)

1. Nginx负载均衡中常见的算法 1.1 轮询(round robin)

轮询,依次将请求分配到各个后台服务器,默认方式。

upstream backserver { 
server 192.168.31.7; 
server 192.168.31.8; 
} 
1.2 加权轮询(weight round robin)

根据权重加权依次轮询,默认为1,实现类似于LVS中的WRR,WLC等.默认时和rr效果一样.

upstream backserver { 
server 192.168.31.7 weight=10; 
server 192.168.31.8 weight=20; 
} 
1.3 源地址hash(ip_hash)

源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持.

upstream backserver { 
ip_hash;
server 192.168.31.7; 
server 192.168.31.8; 
} 
1.4 目的Url hash(url_hash)

hash $request_uri consistent;
根据请求的url的hash值分配服务器,当后台服务器为缓存时,效率较高.

upstream backserver { 
consistent_hash $remote_addr;
server 192.168.31.7; 
server 192.168.31.8; 
} 
1.5 最少连接数(least_conn)

least_conn;
最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC

upstream backserver { 
least_conn;
server 192.168.31.7; 
server 192.168.31.8; 
} 
1.6 最快响应时间(fair)

根据服务器响应时间来分发,响应时间短,分发越多。

upstream backserver { 
fair;
server 192.168.31.7; 
server 192.168.31.8; 
} 
2. 源码剖析

nginx的负载均衡策略可以划分为两大类:

  • 内置策略
    在默认情况下这两种策略会编译进nginx内核,只需在nginx配置中指明参数即可。
  • 扩展策略
    默认不编译进nginx内核。

内置策略:

  • 轮询(round robin)
  • 加权轮询(weight round robin)
  • 源地址hash(ip_hash)

扩展策略:

2.1 轮询(round robin) 2.1.1 RR 请求流程图

2.1.2 RR 请求源码

以nginx-1.20.1版本为例
源码中的重要声明:
nginx-1.20.1/src/http/ngx_http_upstream_round_robin.h

current_weight: 权重排序的值,随着处理请求会动态的变化.
weight: 配置值,用来恢复初始状态。
轮询的创建过程。代码如下图:
nginx-1.20.1/src/http/ngx_http_upstream_round_robin.c

变量tried: tried中记录了服务器当前是否被尝试连接过。他是一个位图。如果服务器数量小于32,则只需在一个int中即可记录下所有服务器状态。如果服务器数量大于32,则需在内存池中申请内存来存储。

对该位图数组的使用可参考如下代码:

2.2 源地址hash(ip_hash)

ip_hash算法的原理很简单,根据请求所属的客户端IP计算得到一个数值,然后把请求发往该数值对应的后端。
所以同一个客户端的请求,都会发往同一台后端,除非该后端不可用了。ip_hash能够达到保持会话的效果。
ip_hash是基于round robin的,判断后端是否可用的方法是一样的。

  • 第一步,根据客户端IP计算得到一个数值。
hash1 = (hash0 * 113 + addr[0]) % 6271;
hash2 = (hash1 * 113 + addr[1]) % 6271;
hash3 = (hash2 * 113 + addr[2]) % 6271;

hash3就是计算所得的数值,它只和初始数值hash0以及客户端的IP有关。

  • 第二步,根据计算所得数值,找到对应的后端。
w = hash3 % total_weight;
while (w >= peer->weight) {
    w -= peer->weight;
    peer = peer->next;
    p++;
}

total_weight为所有后端权重之和。遍历后端链表时,依次减去每个后端的权重,直到w小于某个后端的权重。
选定的后端在链表中的序号为p。因为total_weight和每个后端的weight都是固定的,所以如果hash3值相同,则找到的后端相同。
nginx-1.20.1/src/http/modules/ngx_http_upstream_ip_hash_module.c

2.3 加权轮询(weight round robin)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/468468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号