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 URL重写rewrite机制原理及使用实例
Apr 01 Servers
nginx配置虚拟主机的详细步骤
Jul 21 Servers
NGINX 权限控制文件预览和下载的实现原理
Jan 18 Servers
Z-Order加速Hudi大规模数据集方案分析
Mar 31 Servers
Apache Hudi的多版本清理服务彻底讲解
Mar 31 Servers
微信告警的zabbix监控系统 监控整个NGINX集群
Apr 18 Servers
Nginx 安装SSL证书完成HTTPS部署
Apr 28 Servers
WinServer2012搭建DNS服务器的方法步骤
Jun 10 Servers
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
Jun 25 Servers
windows server2016安装oracle 11g的图文教程
Jul 15 Servers
nginx访问报403错误的几种情况详解
Jul 23 Servers
教你使用Ubuntu搭建DNS服务器
Sep 23 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
动态新闻发布的实现及其技巧
2006/10/09 PHP
php之字符串变相相减的代码
2007/03/19 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
JavaScript 对象、函数和继承
2009/07/07 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
JavaScript实现多态和继承的封装操作示例
2018/08/20 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
原生js实现表格翻页和跳转
2020/09/29 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
python re模块的高级用法详解
2018/06/06 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
大学辅导员事迹材料
2014/02/05 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
教师演讲稿开场白
2014/08/25 职场文书
德劲DE1108畅想
2021/04/22 无线电
利用Python判断你的密码难度等级
2021/06/02 Python
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技