Nginx负载均衡以及常用的7层协议和4层协议的介绍

一、引言

明人不说暗话,下面来解析一下 Nginx 的负载均衡。需要有 Linux 和 Nginx 环境哈。

二、nginx负载均衡的作用

高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。

伸缩性:添加或减少服务器数量,然后由负载均衡进行分发控制。这使得应用集群具备伸缩性。

高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。

安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防 DDos 攻击等

三、upstream配置

首先给大家说下 upstream 这个配置,写一组被代理的服务器地址,然后配置负载均衡的算法。这里的被代理服务器地址有两种写法。

第一种方式

upstream testapp { 
      server ip:端口;        #需要代理的服务器地址ip
      server ip:端口;        #需要代理的服务器地址ip
    }
 server {
        listen 80;
        server_name localhost;
        location / {         
           proxy_pass  http://testapp;      #请求转向 testapp 定义的服务器列表         
        } 
}

第二种方式

upstream mysvr { 
      server  http://ip:端口;     #需要代理的服务器ip和端口
      server  http://ip:端口;     #需要代理的服务器ip和端口
    }
 server {
        listen 80;
        server_name localhost;
        location  / {         
           proxy_pass  http://mysvr;     #请求转向mysvr 定义的服务器列表         
        } 
}

示例

我们使用第一种方法准备三台机器

代理器 :10.12.153.41

服务器1 :10.12.153.222

服务器2:10.12.153.140

首先保证服务器1和2能够正常访问到web页面

现在配置代理端的nginx配置文件

配置完成后重新加载就可以进入浏览器测试了

我们通过访问代理器10.12.153.41访问到了两个服务器的页面

默认访问页面是轮询的,什么是轮询下面会讲到哈

四、负载均衡算法

upstream 支持4种负载均衡调度算法:

1、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;

2、ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

3、url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候提高效率。

4、fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。 

负载均衡调度算法配置示例

1、热备backup

当一台服务器发生事故时,才启用第二台服务器给提供服务

服务器处理请求的顺序为 001 001 001 001 001 001 突然001出现故障这是访问页面则会是002 002 002 002 ....

2、轮询weight

nginx默认就是轮询其权重默认为1,服务器处理请求的顺序:001 002 001 002 001 002....

weight的默认值为1可以不写。上面的upstream配置实例中使用的就是普通轮询。

3、加强轮询weight

即可以使用weight修改轮询次数,下面的配置轮询访问显示为001 001 001 002 002 001 001 001 002 002 ...

4、ip_hash

nginx会让相同的客户端ip请求相同的服务器,使用ip_hash这种负载均衡以后,可以保证用户的每一次会话都只会发送到同一台服务器上

注意事项

  • 一旦使用了ip_hash,当我们需要移除一台服务器的时候,不能直接删除这个配置项,而是需要在这台服务器配置后面加上关键字down,表示不可用;
  • 因为如果直接移除配置项,会导致hash算法发生更改,后续所有的请求都会发生混乱;

5、nginx负载均衡配置状态参数

down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。 
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误   
fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和fail_timeout一起使用。

10.12.153.222 轮循两次且请求2次后失败,失败后暂停服务2秒

10.12.153.140 轮循三次且请求2次后失败,失败后暂停服务1秒

五、7层协议和4层协议介绍

7层负载和4层负载的区别

四层负载与七层负载最大的区别就是效率与功能的区别。

四层负载架构设计比较简单,无需解析具体的消息内容,在网络吞吐量及处理能力上会相对比较高,

而七层负载均衡的优势则体现在功能多,控制灵活强大。

在具体业务架构设计时,使用七层负载或者四层负载还得根据具体的情况综合考虑。

七层协议

OSI(Open System Interconnection)是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范,共包含七层协议

如图显示

4层协议

TCP/IP协议 之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。

从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。

nginx在1.9.0的时候,增加了一个 stream 模块,用来实现四层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡

扩展

TCP (传输控制协议)和 UDP (用户数据报协议) 是两种不同的网络通信协议,它们在传输数据的方式可靠性、传输速度和应用场景等方面存在一些区别。
1.传输方式
TCP 是一种面向连接的协议,它在传输数据之前需要先建立连接,然后才能传输数据。而 UDP 是一种无连接的协议,它不需要建立连接就可以直接传输数据。

2.可靠性:
TCP 是一种可靠的协议,它可以保证数据的传输不会出现丢失、重复或乱序等问题。它通过确认机制.超时重传和滑动窗口等技术来保证数据的可靠性。而 UDP 是一种不可靠的协议,它不能保证数据的传输不会出现丢失、重复或乱序等问题。
3.传输速度:
TCP 的传输速度相对较慢,因为它需要建立连接、确认数据的传输和进行流量控制等操作。而 UDP 的传输速度相对较快,因为它不需要建立连接和进行流量控制等操作。
4.应用场景:
TCP 适用于需要可靠传输数据的应用场景,例如文件传输、电子邮件、远程登录等。而 UDP 适用于对传输速度要求较高,但对数据可靠性要求不高的应用场景,例如视频会议、实时游戏、DNS 解析等。
总的来说,TCP 和 UDP 都有各自的优缺点,需要根据具体的应用场景来选择使用哪种协议。

好了今天就分享到这里了!感谢大家观看!希望能够帮助到大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/315292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flutter在windows环境搭建

下载flutter https://flutter.cn/docs/development/tools/sdk/releases 下载相应的版本 我放在C盘下: 环境变量 再加系统变量: PUB_HOSTED_URLhttps://pub.flutter-io.cn 如图 FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 完成

[自动驾驶算法][从0开始轨迹预测]:一、坐标和坐标系变换

既然要从0开始轨迹预测,那从哪开始写起呢?回想下自己的学习历程,真正有挑战性的不是模型结构,不是繁琐的训练和调参,而是数据的制作!!! 笔者自认为不是一个数学基础牢固的人&#xf…

Photoshop 2024 (PS2024) v25 直装版 支持win/mac版

Photoshop 2024 提供了多种创意工具,如画笔、铅笔、涂鸦和渐变等,用户可以通过这些工具来创建独特和令人印象深刻的设计效果。增强的云同步:通过 Adobe Creative Cloud,用户可以方便地将他们的工作从一个设备无缝同步到另一个设备…

Docker之数据卷的使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Docker之数据卷的使用》。🎯&#x…

《GreenPlum系列》GreenPlum初级教程-03GreenPlum系统管理

文章目录 第三章 GreenPlum系统管理1.关于GreenPlum数据库发布版本号2.启动和停止GreenPlum数据库2.1 启动数据库2.2 重启数据库2.3 仅重新载入配置文件更改2.4 停止GreenPlum数据库2.5 停止客户端进程 3.GreenPlum数据库状态查询4.访问GreenPlum数据库4.1 数据库会话参数4.2 支…

基于STM32和ESP8266的物联网应用开发与实现

基于STM32和ESP8266的物联网应用开发与实现可以实现智能家居、智能工业、环境监测等多种应用,它将结合STM32微控制器的实时控制能力和ESP8266无线通信模块的WiFi连接能力。在本文中,我们将介绍如何设计和实现这样的物联网应用,并提供相关的代…

使用 Github、Hugo 搭建个人博客

Hugo 静态网站构建手册:https://jimmysong.io/hugo-handbook/ 关键字:开源 博客 框架 1、GitHub Pages 官网:https://pages.github.com/ 文档:https://docs.github.com/zh Github Pages 简介 Websites for you and your project…

java多线程(并发)夯实之路-线程池深入浅出

线程池 Thread Pool:线程池,存放可以重复使用的线程(消费者) Blocking Queue:阻塞队列,存放等待执行的任务(生产者) poll方法(有时限地获取任务)相对take注…

【iOS】数据存储方式总结(持久化)

在iOS开发中,我们经常性地需要存储一些状态和数据,比如用户对于App的相关设置、需要在本地缓存的数据等等,本篇文章将介绍六个主要的数据存储方式 iOS中数据存储方式(数据持久化) 根据要存储的数据大小、存储数据以及…

mac 使用brew卸载node

1.查看当前的node版本 node -v 2.查看使用brew 安装的版本,可以看到本机装了14、16、18版本的node brew search node 3.卸载node brew uninstall node版本号 --force 如分别删除14、16、18版本的node命令如下 brew uninstall node14 --force brew uninstall no…

漏洞分析|Cacti命令执行漏洞 (CVE-2022-46169)

1.漏洞描述 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具,可为用户提供强大且可扩展的操作监控和故障管理框架。 该漏洞存在于remote_agent.php文件中,未经身份验证的恶意攻击者可以通过设置HTTP_变量…

UE4工程升级UE5教程及注意事项

原文链接:https://mp.weixin.qq.com/s/vSVu0VsNub0J62Nz7vM6cA虚幻引擎5迁移指南 | 虚幻引擎5.3文档 (unrealengine.com) 官方教程应该是从英文直接翻译过来的,过多词汇没修改,本篇重新整理修改一下,供各位参考。 本教程介绍&…

Java8常用新特性

目录 简介 1.默认方法 2..Lambda表达式 3.Stream API 4.方法引用 5.Optional类 简介 Java 8是Java编程语言的一个重要版本,引入了许多令人兴奋和强大的新特性。这些特性使得Java程序更加现代化、灵活和高效。让我们一起来探索一些Java 8的常用新特性吧&#…

达摩研究院Paraformer语音识别-中文-通用-16k

原文:https://github.com/alibaba-damo-academy/FunASR/blob/main/runtime/readme_cn.md FunASR软件包路线图 English Version(docs) FunASR是由阿里巴巴通义实验室语音团队开源的一款语音识别基础框架,集成了语音端点检测、语…

FlinkCDC的分析和应用代码

前言:原本想讲如何基于Flink实现定制化计算引擎的开发,并以FlinkCDC为例介绍;发现这两个在表达上不知以谁为主,所以先分析FlinkCDC的应用场景和技术实现原理,下一篇再去分析Flink能在哪些方面,做定制化计算…

【动态规划】LeetCode-42. 接雨水

42. 接雨水。 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1…

OpenCV-22高斯滤波

一、高斯函数的基础 要理解高斯滤波首先要直到什么是高斯函数,高斯函数是符合高斯分布的(也叫正态分布)的数据的概率密度函数。 高斯函数的特点是以x轴某一点(这一点称为均值)为对称轴,越靠近中心数据发生…

css——文字实现渐变色的两种方案

&#xff08;一&#xff09;通过设置color、background-image及background-clip实现文字颜色渐变 <template><span class"title">文字实现渐变色的两种方案</span> </template><style> .title {color: transparent;background-image:…

Windows 项目从0到1的部署

目录 一. 安装jdk 1.1 安装jdk 1.2 配置jdk的环境配置jdk 1.3 配置成功 二. 配置tomcat 2.1 启动tomcat 2.2 防火墙设置 三. 安装MySQL 3.1 安装步骤 3.2 内部连接 3.3 外部连接 四. 部署项目 4.1 项目部署 4.2 修改mysql的用户密码 一. 安装jdk 这里给大家准备好了jdk和…

【Python】使用Opencv裁剪指定区域,再重构大小和保存示例

在Python中&#xff0c;使用OpenCV库可以很方便地截取图像的某一区域&#xff0c;然后尺寸重构&#xff0c;最后保存为新的图像文件。以下是一个示例代码&#xff0c;演示如何实现这一操作&#xff1a; import cv2# 读取图像 img cv2.imread(img.jpg)# 定义截取的区域&#x…