Nginx使用ngx_http_upstream_module实现负载均衡功能示例


Posted in Servers onAugust 05, 2022

负载均衡介绍

什么是负载均衡

负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。

为什么需要负载均衡

当单台web服务器直接面向用户,可能要承载着大量的并发请求,单台服务器可能难以负荷,我们需要使用多台web服务器组成一个集群,利用Nginx负载均衡功能,将请求分发给不同的后端服务器,实现负载的流量分发,提升整体性能、以及系统的容灾能力。

  • 负载均衡与代理有什么区别

代理是代理一台服务器基于URI调度,调度到不同功能的应用节点

负载均衡是将客户端请求通过proxy_pass代理至一组upstream资源池

  • 实现负载均衡场景

实现负载均衡功能需要使用两个模块:

  • proxy_pass:代理模块
  • upstream:虚拟资源池

示例:一个官方的的负载均衡展示

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;
    }
}

示例:自己完成一个小例子

upstream node {
    server 192.168.10.3:80;
    server 192.168.10.4:80;
}
server {
    listen 80;
    server_name www.yyang.com;
    location / {
        proxy_pass http://node;
        include prxoy_params;
    }
}

负载均衡调度算法

轮询调度

按顺序逐一分配到不同的后端节点,也是默认算法。(简单来说就是1:1:1)

加权轮询
考虑到不同服务器的性能不同,给予节点不同的权值,使其接收到相应的权值请求数

server 192.168.10.3:80 weight=3;
server 192.168.10.4:80 weight=1;

以上这个例子是说每4个请求会分配给10.3三个,10.4一个,以此循环。

ip_hash

根据用户请求的IP,对该IP进行hash运算,根据运算的值将请求分配给后端特定的一台节点进行处理。

取值范围为ipv4地址的前三个8位或ipv6的整个地址作为哈希键,确保来自从一个客户端的IP始终传递给同一台服务器,除非次服务器不可用。(简单来说就是172.16.20.1与172.16.20.2取前三个8位都是172.16.20)

ip_hash运算公式:hash(ip)%node_counts=index

ip_hash带来的问题:
大量同一IP的请求会造成某个节点流量过大
如果临时下线一台节点,会重新计算hash值,建议使用down状态

示例:注意ip_hash与权重不可同时使用

ip_hash;
server 192.168.10.3:80;
server 192.168.10.4:80;

一致性hash

为了避免上述问题,所以诞生了一致性hash,使用取模的方式,但不对服务器节点数量取模,而是对2的32次方取模,hash函数值为0~2^32-1。(形成一个虚拟圆环,用户请求会发给顺时针相邻的节点)
有一个问题:如果后端节点较少可能会造成数据倾斜,所以一致性hash引入了虚拟节点机制,即对每个服务器计算多个哈希,每个计算结果位置都放置一个虚拟节点。
如果我们想使用ip_hash,但是计算公式使用一致性hash,该怎么做?

hash $remote_addr consistent;
server 192.168.10.3:80;
server 192.168.10.4:80;

url_hash

根据用户的url进行hash取模,根据运算值,将请求分配给一台特定的后端服务器。clent——nginx——url_hash——cache1——app

1.用户请求nginx负载均衡,通过url算法,请求调度至cache1
2.cache1没有数据,会向后端获取,返回数据,并将数据缓存
3.当其他用户访问相同url时,调度器依然会调度到cache1节点
4.cache1会直接将数据返回

hash $request_uri consistent;
server 192.168.10.3:80;
server 192.168.10.4:80;

least_conn

哪台服务器的连接数最少,就将请求调度到这台服务器

least_conn;
server 192.168.10.3:80;
server 192.168.10.4:80;

负载均衡后端节点状态

down

将服务器节点标记为不可用状态,一般用于停机维护。

server 192.168.10.3:80 down;
server 192.168.10.4:80;

backup

备用节点,正常情况不会调度到此节点;当正常工作节点全部不可用时,会启用此节点;当节点恢复时此节点会继续恢复备用状态。

server 192.168.10.3:80;
server 192.168.10.4:80;
server 192.168.10.5:80 backup;

max_conns

用来限制每个后端节点接收到的最大的TCP连接数,如果超出限制就会抛出错误。

server 192.168.10.3:80 max_conns=10;
server 192.168.10.4:80 max_conns=10;

一台可以连接10.两台是20,超过20就会出错。

keepalived

与后端服务器激活缓存,也就是长链接,提升网站吞吐量。
默认不启用此功能,当有请求时,会建立连接,维护连接,关闭连接,所以会存在网络消耗;但是如果所有连接都缓存了,当连接空闲了又会占用其他系统资源,所以可以使用keepalived参数。

server 192.168.10.3:80;
server 192.168.10.4:80;

keepalived 32;   # 最大空闲连接数的个数
keepalived_timeout 100s; # 空闲连接的超时时间

# 需要配合以下两个参数使用

proxy_http_version 1.1;
proxy_set_header connection "";

max_fails与fail_timeout

max_fails=2:服务器通信失败两次,认为服务器不可用
fail_timeout=5s:服务器通信失败后,每5秒探测一次服务器是否恢复正常。
在fail_timeout设定时间内,与服务器连接失败次数达到max_fails数量,则认为服务器不可用。
如果不设置的话默认是探测一次,间隔10s。

server 192.168.10.3:80 max_fails=2 fail_timeout=5s;
server 192.168.10.4:80 max_fails=2 fail_timeout=5s;

这部分就到这,其他内容放在之后。

到此这篇关于Nginx使用ngx_http_upstream_module实现负载均衡功能示例的文章就介绍到这了,更多相关Nginx 负载均衡内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Servers 相关文章推荐
nginx 防盗链防爬虫配置详解
Mar 31 Servers
详解nginx.conf 中 root 目录设置问题
Apr 01 Servers
制作能在nginx和IIS中使用的ssl证书
Jun 21 Servers
nginx配置虚拟主机的详细步骤
Jul 21 Servers
Nginx反向代理至go-fastdfs案例讲解
Aug 02 Servers
基于Apache Hudi在Google云构建数据湖平台的思路详解
Apr 07 Servers
Win Server2016远程桌面如何允许多用户同时登录
Jun 10 Servers
windows server 2016 域环境搭建的方法步骤(图文)
Jun 25 Servers
windows系统安装配置nginx环境
Jun 28 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
Jul 15 Servers
windows10 家庭版下FTP服务器搭建教程
Aug 05 Servers
Nginx跨域问题解析与解决
Aug 05 #Servers
win10搭建配置ftp服务器的方法
Aug 05 #Servers
windows系统搭建WEB服务器详细教程
Aug 05 #Servers
Win10系统搭建ftp文件服务器详细教程
Aug 05 #Servers
Linux在两个服务器直接传文件的操作方法
Aug 05 #Servers
windows10 家庭版下FTP服务器搭建教程
Aug 05 #Servers
阿里云服务器(windows)手动部署FTP站点详细教程
Aug 05 #Servers
You might like
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
php控制文件下载速度的方法
2015/03/24 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
JavaScript中“+=”的应用
2007/02/02 Javascript
Javascript 获取LI里的内容
2008/12/17 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
Python中获取网页状态码的两个方法
2014/11/03 Python
python简单判断序列是否为空的方法
2015/06/30 Python
Python中使用asyncio 封装文件读写
2016/09/11 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
应届生幼儿园求职信
2013/11/12 职场文书
原材料检验岗位职责
2014/03/15 职场文书
授权委托书怎么写
2014/04/03 职场文书
创先争优一句话承诺
2014/05/29 职场文书
代领毕业证委托书
2014/08/02 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
党支部综合考察意见
2015/06/01 职场文书
赤壁观后感(2)
2015/06/15 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
庭外和解协议书
2016/03/23 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
python+opencv实现视频抽帧示例代码
2021/06/11 Python
Python实现对齐打印 format函数的用法
2022/04/28 Python