Nginx: 负载均衡基础配置, 加权轮序, hash算法, ip_hash算法, least_conn算法

2024-08-29 01:36

本文主要是介绍Nginx: 负载均衡基础配置, 加权轮序, hash算法, ip_hash算法, least_conn算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

负载均衡

  • 在真正的反向代理场景中,必然涉及到的一个概念,就是负载均衡
  • 所谓负载均衡,也就是将Nginx的请求发送给后端的多台应用程序服务器
  • 通常的应用程序服务器,后面的每台服务器都是一个同等的角色,提供相同的功能
  • 用户发送一个request 到我们的这个负载均衡器(Nginx)
  • 负载均衡器会将这个请求发给后端的任何一台服务器
  • 它会依据一定的负载均衡算法去后端的三台服务器中选择其中的一台
  • 从而将这个请求发送给后端这个应用程序服务器
  • 由应用程序服务器处理完之后,再次的返回给负载均衡器
  • 由负载均衡器再把这个响应的结果给传递给我们的用户
  • 在整个这样一个过程中,对于负载均衡器和后端的应用程序服务器来说
  • 它这三台服务器提供的角色通常来说是一样的
  • 比如说在某些场景下,后端的这个应用服务器可能都是一台mysql数据库服务器
  • 在mysql数据库服务器中,通常我们用的最多的一种性能是读请求读,请求压力会很大
  • 在一组两重的架构中,第一台服务器可能是用来写的,第二台和第三台都是用来读的
  • 当然很多情景下,我们第一台服务器也可以用来读
  • 这个时候所有的读请求,就都可以平均的分发到我们后端这些服务器

1 )场景举例1

  • 现在,后端的一个应用程序服务器提供了一个电商站点,
  • 这个时候我的用户可能需要去登录到自己的账户中,然后去买商品
  • 用户会首先发起个请求到负载均行器,负载均行器再发到应用服务器
  • 这个时候我们用户登录账户之后,账号信息保存在应用服务器一上
  • 这个时候我们的用户就去浏览我们的网页,选商品,之后,加到购物车
  • 这个时候,假如他一刷新页面,这会触发一个新的HTTP请求
  • 这个请求也会到负载均容器,但被分配到第二台服务器上了,这样用户信息丢失了
  • 后续操作可能会要重新登录,这种场景对用户来说是不能接受的
  • 对于这样一种情形来说,涉及到后端的三台应用服务器如何去对session进行共享?
  • 这是负载均衡器需要面临的第一个问题

2 )场景举例2

  • 负载均衡器在分发请求的时候,三台服务器,如果所有的角色能力都一样,服务器硬件规格也一样
  • 可能是第一次发给第一,第二次发给第二,第三次发给第三,第四次再发给第一,这样轮询
  • 假如,服务器有些性能处理能力很强,有些性能处理很弱,如何合理的分发这样一些请求 ?
  • 也就是说负载均衡器在选择后端的应用服务的时候,要依据一定的算法, 算法设定的优劣
  • 对于负载均衡的效果起到了决定性的影响的,其实没有一个绝对的优劣之分
  • 所有的这些负载均衡的算法,都各自有一些不同的适用场景,需要去结合业务来进行选择使用

3 )场景举例3

  • 在反向代理的场景下,这些应用服务器上面,某些缓存信息是如何结合Nginx进行保存的?

Nginx 对上游服务负载均衡

1 )回顾 upstream 段

  • 语法:upstream name { … }

  • 默认值:无

  • 上下文:http

  • 示例

    upstream {............
    }
    
  • 指令:

    • server address [parameters];
      • weight=number
      • max_conns=nuimber
      • fail_timeout=time
      • max_fails=number
      • backup
      • down
    • keepalive connections;
    • keepalive_request number;
    • keepalive_timeout time;
    • queue;
  • 配置示例

upstream back_end {server 127.0.0.1:8080 weight=3 max_conns=1000 fail_timeout=10s max_fails = 2;keepalive 32;keepalive_requests 50;keepalive_timeout 30s;
}

2 ) 实际部署

2.1 应用服务器 (使用 nginx 模拟),比如当前ip地址为:192.168.184.20

server {listen 8020;location / {return 200 'Return Result For Server 8020\n';}
}server {listen 8021;location / {return 200  'Return Result For Server 8021\n';}
}server {listen 8022;location / {return 200 'Return Result For Server 8022\n';}
}

这里 模拟3台 应用服务器

2.2 nginx 服务器

upstream demo_server {server 192.168.184.20:8020 weight=3 max_conns=50 fail_timeout=10s max_fails=2;server 192.168.184.20:8021 weight=2;server 192.168.184.20:8022 weight=1;
}server {listen 			80;server_name 	balance.baidu.com;location /balance/ {proxy_pass		http://demo_server;}
}

哈希算法

  • 上面的示例,演示的是加权轮询的方式,在分配请求的时候,会保持这个分配比例,而非严格按照顺序分配
  • 现在,来看新的一个负载均衡算法 — 哈希算法
  • 定义:哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值我们称之为哈希值,散落明文到哈希值的映射是不可逆的
  • 简单来说,哈希算法就是根据一个固定内容的值,经过哈希运算之后,可以得到一个唯一的值
  • 哈希算法有很多种,但是它的思想都是一样的,总的来说,它是根据一个内容经过一定的哈希值换算之后得到一个固定长度的一个字符串
  • 对一个文件内容不变的文件来说,它永远会得到一个相同的字符串值,这个算法可以解决文件传输前后校验是否一致的场景
  • 比如说,现在有两个文件,左侧的上和下,是不一样的,别看多了一行,就是多了一个字节,计算出来的内容都不会一样

1 )哈希指令

  • 语法:hash key [consistent];
    • 这个key 通常是一个内容, 可以使用变量,特定内容的变量
    • 可以根据请求头的内容来进行哈希运算,
    • 如果头部的某些内容来源一样,哈希值一定一致
    • 或者根据客户端的ip
  • 默认值:无
  • 上下文:upstream

2 )配置示例

2.1 这里使用Nginx模拟应用服务器

server {listen 	10020;location / {return 200 'Return Result For Server 10020\n';}
}server {listen 	10010;location / {return 200 'Return Result For Server 10010\n';}
}

2.2 应用服务器

upstream demo_server_1 {hash 		$request_uri;server  	192.168.184.20:10020;server  	192.168.184.20:10010;
}server {listen 		80;server_name balance_hash.baidu.com;location / {proxy_pass http://demo_server_1;}
}
  • 在上述两台服务器中,假如,请求在一台服务器上有缓存,在另一台是用不了的
  • 某一些情形下,为了保证来自同一个客户端的请求,总是能够分配到指定的一台服务器上
  • 可能需要根据这样一个哈希算法,把其永远分配到某一个服务器上,而不会再调度到另外一台服务器上
  • 其实最初它的一个设计应用是在缓存中用的比较多,像CDN这样的场景

IP Hash 算法

  • 哈希算法是可以指定各种不同的key来进行一个哈希运算,这适用于我们一些比较复杂的一个应用场景
  • 我们有一些特殊需求,比如,根据某一些应用层的信息,HTTP请求投入的某一些具体信息
  • 或者是请求行中的某一些具体信息来进行一个哈希运算
  • 它就是根据IP进行哈希运算,因为从这个算法的名称上也能够看出来

1 ) ip_hash 指令

  • 语法:ip_hash

  • 默认值:无

  • 上下文:upstream

  • 示例配置

    upstream demo_server_1 {ip_hash    # 只加这一个配置就行server  	192.168.184.20:10020;server  	192.168.184.20:10010;
    }
    
  • 其实, ip_hash 指令是为了解决Nginx和后端应用程序服务器的一个 session 保持的

  • 它其实对出的一个应用场景,也是对于这种 session 保持的解决而生的

  • 某一些客户端在请求完服务器之后,常会有cookie信息一些

  • 对应到服务器端的时候,会有 session 信息, 对于不同的用户来说是不同的

  • 对于固定的客户端来说,使用ip hash这样一种负载运用算法来进行 session 保持

  • 无疑是一个简错的选择

最少连接数算法

  • 不管是 hash 还是 ip_hash,还是加权轮循的负载均衡算法,其实都忽略了一个重要的事实
  • 对于这些算法来说,没有将后端应用服务器当前的一个负荷状况给考虑在内
  • 只是根据我们从用户发来的请求做一些负带均衡算法的挑选或者是加权轮型就更简单粗暴了
  • 不会把任何因素考虑在内,而只是简单的将请求逐个分发
  • 包括 hash 或者 ip_hash,他们只能根据某一些特定的属性来对后端进行分发的
  • 但是这些属性也仅仅是来自于用户的请求,其实这样一些场景是不合理的
  • 比如说,现在应用服务器一的处理能力很强,应用服务器二和三处理能力特别的弱
  • 你看之前的这些算法就不合理了
  • 都没有将后端服务器的一个当前运行状态就是作为服务器分发请求的一个策略
  • 现在引入最少连接算法,它考虑上游服务器的一个情况所决定的一种算法

1 )最少连接算法

  • 从上游服务器,挑选一台当前已建立连接数最少的分配请求
    • Nginx 在收到用户请求之后,在如何去挑选后端应用服务器的时候
    • 会去考虑当前这个应用服务器具体已经建立了多少个连接,已经正在处理多少用户请求
    • 他会找最少的,将请求分发给这个
    • 在某些情形下,总是挑选当前后端应用服务器正在处理连接数最少的那台进行分发请求
  • 极端情形下退化为 rr 算法
    • 当服务器分配数都一样的场景下
    • 会退化到轮循算法,逐个分发

1.1 least_conn 指令

  • 模块 ngx_http_upstream_least_conn_module
  • 禁用通过 --without-http_upstream_least_conn_module
  • 语法:least conn;
  • 默认值:无
  • 上下文:upstream
  • 基于此算法的Nginx在挑选应用程序服务器的时候会找当前处理请求数最少的一个
  • 存在多个 worker 子进程的时候,Nginx 是一个 worker 子进程的情形下,就有一个work子进程
  • 每一次的请求它都会分配到不同的worker子进程中,不同的worker子进程,是怎么样知道每一个应用服务器,当前正在处理的请求有多少,包括它当前的一个响应状态是怎么样的
  • 也就是说,我们的后端应用服务器的一个具体状态信息,是没办法在不同的worker子进程之间共享的
  • 解决办法:在Nginx上去开辟出一块内存空间
    • worker 子进程在处理这个用户请求的时候,都会将后端对应的应用程序服务器的一个当前状态
    • 比如说它当前正在处理的一个用户连接数,访问失败的次数等服务器的一个共态信息给保存到共享内存中
    • 这样实现了最少连接的算法

1.2 zone 指令

  • 用于指定共享内存空间大小
  • 语法:zone name [size];
  • 默认值:无
  • 上下文:upstream
  • 示例
    upstream demo_server_1 {zone        test     10M;least_conn;server  	192.168.184.20:10020;server  	192.168.184.20:10010;
    }
    
  • 在某一些场景中会有用的,但是它用的也并不是很多

这篇关于Nginx: 负载均衡基础配置, 加权轮序, hash算法, ip_hash算法, least_conn算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116466

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm