nginx一 之负载均衡介绍
什么是负载均衡
负载均衡的意思是在服务器集群中,需要有一台服务器作为调度者,客户端所有的请求都由调度者接收,调度者再根据每台服务器的负载情况,将请求分配给对应的服务器去处理;
在这个过程中,调度者如何合理分配任务,保证所有服务器将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡的问题了。
实现方式
1、Http重定向
过程描述
当用户向服务器发起请求时,请求首先被集群调度者截获;调度者根据某种分配策略,选择一台服务器,然后把选择的服务器IP地址封装在HTTP响应消息头的Location字段中,设置响应消息的状态码设为302,最后将这个响应消息返回给浏览器;
当浏览器收到响应消息后,解析Location字段,获取分配服务器的URL并发起请求,然后指定的服务器处理该用户的请求, 最后将结果返回给用户。
在使用HTTP重定向来实现服务器集群负载均衡的过程中,需要一台服务器作为请求调度者。用户的一项操作需要发起两次HTTP请求,一次向调度服务器发送请求,获取后端服务器的IP,第二次向后端服务器发送请求,获取处理结果。
调度策略
调度服务器收到用户的请求后,究竟选择哪台后端服务器处理请求,这由调度服务器所使用的调度策略决定。
随机分配策略:
当调度服务器收到用户请求后,可以随机决定使用哪台后端服务器,然后将该服务器的IP封装在HTTP响应消息的Location属性中,返回给浏览器即可。
轮询策略(RR):
调度服务器需要维护一个值,用于记录上次分配的后端服务器的IP。那么当新的请求到来时,调度者将请求依次分配给下一台服务器。
由于轮询策略需要调度者维护一个值用于记录上次分配的服务器IP,因此需要额外的开销;
此外,由于这个值属于互斥资源,那么当多个请求同时到来时,为了避免线程的安全问题,因此需要锁定互斥资源,从而降低了性能。而随机分配策略不需要维护额外的值,也就不存在线程安全问题,因此性能比轮询要高。
优缺点分析
优点:
实现简单,逻辑简单
缺点:
在HTTP重定向方法中,调度服务器只在客户端第一次向网站发起请求的时候起作用。当调度服务器向浏览器返回响应信息后,客户端此后的操作都基于新的URL进行的(也就是后端服务器),此后浏览器就不会与调度服务器产生关系,进而会产生如下几个问题:
a、不是真正意义上的负载均衡:
由于不同用户的访问时间、访问页面深度有所不同,从而每个用户对各自的后端服务器所造成的压力也不同;而调度服务器在调度时,无法知道当前用户将会对服务器造成多大的压力,因此这种方式无法实现真正意义上的负载均衡,只不过是把请求次数平均分配给每台服务器罢了。
b、无法处理服务器故障:
若分配给该用户的后端服务器出现故障,并且如果页面被浏览器缓存,那么当用户再次访问网站时,请求都会发给出现故障的服务器,从而导致访问失败。
2、DNS
什么是DNS
数据包采用IP地址在网络中传播,而为了方便用户记忆,我们使用域名来访问网站;通过域名访问网站之前,首先需要将域名解析成IP地址,这个工作是由DNS完成的,也就是域名服务器。DNS服务器有一个天然的优势,如果一个域名指向了多个IP地址,那么每次进行域名解析时,DNS只要选一个IP返回给用户,就能够实现服务器集群的负载均衡。
过程描述
首先需要将我们的域名指向多个后端服务器(将一个域名解析到多个IP上),再设置一下调度策略,那么我们的准备工作就完成了,接下来的负载均衡就完全由DNS服务器来实现;当用户向我们的域名发起请求时,DNS服务器会自动地根据我们事先设定好的调度策略选一个合适的IP返回给用户,用户再向该IP发起请求。
调度策略
一般DNS提供商会提供一些调度策略供我们选择,如随机分配、轮询、根据请求者的地域分配离他最近的服务器。
优缺点分析
优点:
扩展性好(可以指向多个IP地址,自行解析)
动态DNS可以自动处理服务器故障
配置简单
吞吐率卓越
缺点:
不是真正意义上的负载均衡(和HTTP重定向类似)
集群调度权交给了DNS服务器,从而我们没办法随心所欲地控制调度者,没办法定制调度策略。
3、反向代理
什么是反向代理
反向代理服务器是一个位于实际服务器之前的服务器,所有向我们网站发来的请求都首先要经过反向代理服务器,那么反向代理服务器就可以充当服务器集群的调度者,它可以根据当前后端服务器的负载情况,将请求转发给一台合适的服务器,并将处理结果返回给用户。
优缺点分析
优点:
隐藏后端服务器;(与HTTP重定向相比,反向代理能够隐藏后端服务器,所有浏览器都不会与后端服务器直接交互,从而能够确保调度者的控制权,提升集群的整体性能)
故障转移 (与DNS负载均衡相比,反向代理能够更快速地移除故障结点。当监控程序发现某一后端服务器出现故障时,能够及时通知反向代理服务器,并立即将其删除);
合理分配任务 (HTTP重定向和DNS负载均衡都无法实现真正意义上的负载均衡,也就是调度服务器无法根据后端服务器的实际负载情况分配任务,但反向代理服务器支持手动设定每台后端服务器的权重。我们可以根据服务器的配置设置不同的权重,权重的不同会导致被调度者选中的概率的不同);
缺点:
调度者压力过大 (由于所有的请求都先由反向代理服务器处理,那么当请求量超过调度服务器的最大负载时,调度服务器的吞吐率降低会直接降低集群的整体性能);
制约扩展(当后端服务器也无法满足巨大的吞吐量时,就需要增加后端服务器的数量,可没办法无限制地增加,因为会受到调度服务器的最大吞吐量的制约);
粘滞会话(反向代理服务器会引起一个问题,若某台后端服务器处理了用户的请求,并保存了该用户的session或存储了缓存,那么当该用户再次发送请求时,无法保证该请求仍然由保存了其Session或缓存的服务器处理,若由其他服务器处理,先前的Session或缓存就找不到了);
粘滞会话的解决方案
1、可以修改反向代理服务器的任务分配策略,以用户IP作为标识较为合适。相同的用户IP会交由同一台后端服务器处理,从而就避免了粘滞会话的问题。
2、可以在Cookie中标注请求的服务器ID,当再次提交请求时,调度者将该请求分配给Cookie中标注的服务器处理即可。
转载于:https://www.cnblogs.com/dahuandan/p/6752615.html
nginx一 之负载均衡介绍相关推荐
- F5/LVS/Nginx/HAProxy硬软件级网络负载均衡介绍
F5/LVS/Nginx/HAProxy硬软件级网络负载均衡介绍 1 硬件级的负载均衡 常见的商用硬件负载均衡器:NetScaler.F5.Radware.Array 优点: 1)专业团队维护,能够直 ...
- nginx服务器的负载均衡和动静分离(未完)
安装nginx,我的博客里面有介绍源码和yum安装. 实战:使用nginx实现动静分离的负载均衡集群 实战:使用haproxy实现负载均衡集群 LB负载均衡集群分为两类:LVS(四层)和Nginx或p ...
- Nginx学习之负载均衡fair模块
2019独角兽企业重金招聘Python工程师标准>>> Nginx学习之负载均衡fair模块 2017-04-10 20:27 写在开始 前面对Nginx的三种负载均衡实现做了一个简 ...
- (转)nginx+iis实现负载均衡
nginx+iis实现负载均衡 最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存redis等.本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名 ...
- So easy!Nginx+SpringBoot 实现负载均衡
在介绍Nginx的负载均衡实现之前,先简单的说下负载均衡的分类,主要分为硬件负载均衡和软件负载均衡,硬件负载均衡是使用专门的软件和硬件相结合的设备,设备商会提供完整成熟的解决方案,比如F5,在数据的稳 ...
- nginx 反向代理负载均衡 tomcat集群应用
nginx 反向代理负载均衡 tomcat集群应用 环境介绍: 系统:centos5.8_64 192.168.0.201:nginx服务器 192.168.0.202:tomcat服务器 192.1 ...
- 1.rabbitmq 集群版安装及使用nginx进行四层负载均衡设置
1.安装erlang 需要注意erlang的版本是否满足rabbitmq的需求 这里用到的版本是:Erlang 19.0.4 RabbitMQ 3.6.15 wget http://www.rab ...
- Linux 负载均衡介绍之LB介绍
Linux 负载均衡介绍之LB 负载均衡 (Load Balance)让负载均衡,当然这是一个简单的概括,比如,我有10台机器都提供web服务,那么我如何均衡的利用这10台机器呢,让这10台机器保证高 ...
- Nginx+SpringBoot实现负载均衡demo
前言 在上一篇中介绍了Nginx的安装,本篇文章主要介绍的是Nginx如何实现负载均衡. 负载均衡介绍 介绍 在介绍Nginx的负载均衡实现之前,先简单的说下负载均衡的分类,主要分为硬件负载均衡和软件 ...
最新文章
- 二叉树的先序遍历和非递归遍历
- C++ Primer 5th笔记(chap 19 特殊工具与技术)嵌套类
- 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.69. Vim-7.4...
- angular接口传参
- 【HDU - 1757】A Simple Math Problem (矩阵快速幂)
- 自己开发的一款基于PagedDataSource的datalist repeater控件,只需要在源程序中添加三行代码,即可实现通用分页
- 力扣——206.反转链表
- 页面报错webform_postbackoptions未定义
- 批量给hive的表加分区
- 介绍一款国际性的本体社群聊天软件Discord
- python在视频上方加字_python 使用 MoviePy 给视频添加文字水印demo实现[附代码]
- Kafka相关配置,canal检测数据发送kafka同步数据到ES
- mysql 1138_mysql ERROR 1138: Invalid use of NULL value
- 鹏业BIM三维安装算量软件一次购买还是收年费
- 软件测试工程师-面试如何使用代码进行接口测试?
- mysql 常用函数
- 专 业 学 习 成 果
- 机器学习领域定会顶刊
- NBA 2K20今天上市
- 计算机基础面经积累---持续更新
热门文章
- PHP 面向对象:类和对象
- Exception in thread main java.io.IOException: No FileSystem for scheme: hdfs
- ab和jmeter进行GET/POST压力测试的使用心得和比较(转载,在ubuntu16.04下使用ab带json对centos7压力测试验证可用)
- MySQL中的UNIX_TIMESTAMP函数使用总结
- Java每天5道面试题,跟我走,offer有!(九)
- ES6——举个例子理解Promise的原理和使用
- 常用 SQL 语句汇总
- 云将与行业走向深度融合
- 光伏市场抢装潮6月底前或重现
- Android shape的使用(圆角矩形)