在日常的架构设计与开发中,常用的负载均衡算法主要分为静态和动态两类。静态负载算法以固定的频率分配任务不考虑服务器的状态信息,如轮询法、随机法等;动态负载均衡算法以服务器的实时负载状态信息来决定任务的分配,如最小链接法等,下面简单对其中几种算法原理进行基本说明:

1、轮询法会将收到的请求循环分配到服务器集群中的每台机器,即有效服务器上。如果使用这种方式,所有的标记进入分发的服务器应该有相近的资源容量以及负载形同的应用程序。如果所有的服务器有相同或者相近的性能那么选择这种方式会使服务器负载相对均衡。基于这个前提,轮循调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮循,即使这个服务器已经不能再处理当前这个请求了。这可能导致能力较弱的服务器超载。

2、加权轮询算法解决了简单轮循调度算法的缺点:传入的请求按顺序被分配到集群中服务器,但是会考虑提前为每台服务器分配的权重。配置人员只是简单的通过服务器的处理能力来定义各台服务器的权重。例如,性能最强的服务器A给的权重是100,同时性能最低的服务器给的权重是50。这意味着在服务器B接收到第一个请求之前前,服务器A会连续的接受到2个请求,以此类推。

3、最小连接数算法,上述两种方法都没有考虑的是系统不能识别在给定的时间里保持了多少连接。因此可能发生,服务器B服务器收到的连接比服务器A少但是它已经超载,因为服务器B上的用户打开连接持续的时间更长。这就是说连接数即服务器的负载是累加的。这种潜在的问题可以通过"最少连接数"算法来避免:传入的请求是根据每台服务器当前所打开的连接数来分配的。即活跃连接数最少的服务器会自动接收下一个传入的请求。基本上和简单轮询的原则相同:所有拥有虚拟服务的服务器资源容量应该相近。值得注意的是,在流量较低的配置环境中,各服务器的流量并不是相同的,会优先考虑第一台服务器。这是因为,如果所有的服务器是相同的,那么第一个服务器优先,直到第一台服务器有连续的活跃流量,否则总是会优先选择第一台服务器。

在实际项目设计与建设过程中,可使用LVS+NGINX+TOMCAT实现了软硬结合的负载均衡模式,四层负载使用LVS软件,七层负载使用Nginx实现。整体架构设计如下图所示

搭建基于LVS的集群服务器,,LVS服务器通过轮询算法把将用户请求平均分发至nginx集群服务器当中,这一层如果服务器性能一致,采用轮询算法,保证访问请求均匀分摊至集群机器当中,LVS是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统,实现了很好可伸缩性,节点数目可以增长到几千,甚至几万。这样第一次的压力分摊与负载均衡执行完毕;

在nginx集群当中我们通过反向代理+加权轮询的模式,把客户端请求根据应用服务器的性能进行加权轮询,分摊至不同应用服务器上,首先我们把应用服务器集群中的服务器按照性能依次进行加权,性能越高的服务器加权比重越大,同时对nginx进行配置, 这样一方面分摊了服务压力,也能够最大化的释放服务器的性能。这样就在应用服务的前面进行了第二次的负载均衡,Nginx是一种非常灵活的反向代理软件,可以自由定制化转发策略,分配服务器流量的权重等,反向代理服务的核心工作主要是转发HTTP请求,Nginx扮演了浏览器端和后台Web服务器中转的角色。因为它工作在HTTP层(应用层),也就是网络七层结构中的第七层,因此也被称为“七层负载均衡”。反向代理中,常见的一个问题,就是Web服务器存储的session数据,因为一般负载均衡的策略都是随机分配请求的。同一个登录用户的请求,无法保证一定分配到相同的Web机器上,会导致无法找到session的问题。我们在项目一般将session、token等需要保持的会话信息存储在了redis当中,从而满足负载均衡的分布式存储要求。

上述负载均衡架构及算法策略,结构清晰,实现和部署相对简单,叠加且充分发挥了LVS+NGINX的性能优势,LVS通过轮询算法对访问请求进行了初步负载均衡,NGINX通过负加权轮询算法结合服务器的性能对访问请求进行了二次负载均衡,可有效保证高并发压力下的服务性能与可用性。以上就是负载均衡在web系统开发中的一般应用,本文内容只是一个基本总结,其中如有不足与不正确的地方还望指正与海涵,十分感谢。

关注微信公众号,查看更多技术文章。

负载均衡在web系统中的应用的更多相关文章

  1. 从零开始学 Java - 利用 Nginx 负载均衡实现 Web 服务器更新不影响访问

    还记得那些美妙的夜晚吗 你洗洗打算看一个小电影就睡了,这个时候突然想起来今天晚上是服务器更新的日子,你要在凌晨时分去把最新的代码更新到服务器,以保证明天大家一觉醒来打开网站,发现昨天的 Bug 都不见 ...

  2. 负载均衡技术在CDN中发挥着重要作用

    转载地址:http://www.qicaispace.com/gonggao/server/page01/info07.asp CDN是一个经策略性部署的整体系统,能够帮助用户解决分布式存储.负载均衡 ...

  3. 通过LVS+Keepalived搭建高可用的负载均衡集群系统

    1. 安装LVS软件      (1)安装前准备操作系统:统一采用Centos6.5版本,地址规划如下: 服务器名 IP地址 网关 虚拟设备名 虚拟ip Director Server 192.168 ...

  4. nginx+php负载均衡集群环境中的session共享方案梳理

    在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...

  5. 高并发系列之——负载均衡,web负载均衡

    1 前言 负载均衡,一般包含两方面的含义.一方面是,将单一的重负载分担到多个网络节点上做并行处理,每个节点处理结束后将结果汇总返回给用户,这样可以大幅提高网络系统的处理能力: 第二个方面的含义是,将大 ...

  6. Nginx+PHP负载均衡集群环境中Session共享方案 - 运维笔记

    在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...

  7. VLC在web系统中应用(x-vlc-plugin 即如何把VLC嵌入HTML中)第一篇

    VLC毫无疑问是优秀的一款播放软件,子B/S机构的web项目中,如果能把它嵌入页面,做页面预览或者其他,是非常棒的. 第一步:下载VLC安装程序:(推荐1.0.3或者是1.0.5版本,比较稳定) ht ...

  8. 如何在施工物料管理Web系统中处理大量数据并显示

    最近在开发施工物料管理系统,其中涉及大量的物料信息需要管理和汇总,数据量非常庞大.之前尝试自己通过将原始数据,加工处理建模,在后台代码中通过分组.转置再显示到 Web 页面中,但自己编写的代码量非常大 ...

  9. B/S(WEB)系统中使用Activex插件调用扫描仪实现连续扫描并上传图像(IE文件扫描并自动上传)

    IE浏览器下使用Activex插件调用客户端扫描仪扫描文件并山传,可以将纸质档案(如合同.文件.资料等)扫描并将扫描图像保存到服务器,可以用于合同管理.档案管理等. 通过插件方式调用扫描仪扫描并获取图 ...

  10. .net大型平台通过Nginx做负载均衡(Web层、中间服务层、DB层)

    .net平台下,我目前部署过的均衡负载有两种方式(iis7和Nginx),以下以Nginx为例讲解web层的均衡负载. 简介:Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx ...

随机推荐

  1. 代码随想录Day21

    669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修剪树 不应该 改变保留在树 ...

  2. devops-3:Jenkins增加静态节点

    Jenkins管理静态节点 Jenkins搭建完成后一般只有一个master节点,此节点主要用于管理Jenkins配置,如果再在master节点上跑一系列的Job,未免有点太勉强,并且如果出现资源紧缺 ...

  3. SpringBoot 引入 WebSocket

    maven 添加websocket ,按照一篇博文引入 websocket https://www.cnblogs.com/likun10579/p/5450209.html 在浏览器控制台测试是否连 ...

  4. CM3和ARM7的差异

    此文章由文心一言生成,引用请标注作者:文心一言CM3通常指的是Cortex-M3,它是ARM公司设计的一种基于ARMv7-M架构的32位处理器内核,主要用于嵌入式系统.而ARM7则是ARM公司早期设计 ...

  5. 如何排查线上w3wp.exe CPU高的问题,使用到了WinDbg、Visual studio来分析IIS进程池的.dmp文件

    最近发现服务器上某个web站点老是CPU很高,该站点部署在IIS上,我IIS上有多个站点,每个站点一个进程池,每个进程池取名都是根据站点来取的,所以很容易看出哪个站点吃掉的CPU,该站点已运行十几年, ...

  6. C# WebSocket高并发通信阻塞问题

    项目上遇到使用WebSocket超时问题,具体情况是这样的,OTA升级过程中,解压zip文件会有解压进度事件,将解压进度通过进程通信传给另一进程,通信提示超时异常 小伙伴堂园发现大文件使用Zip解压, ...

  7. Google Maps Embed API & JavaScript API

    前言 很多年前写过一篇 Google Map 谷歌地图, 这篇算是翻新版本. Google Map Registration Google Maps Platform 是整个 Google Map 的 ...

  8. SQL Server – Trigger 触发器

    参考: SQLServer触发器详解(概述.工作原理.应用) CREATE TRIGGER (Transact-SQL) SQL Server Triggers and Transactions 以前 ...

  9. Qml 实现星级评分组件 已发布

    [写在前面] 在现代应用程序中,星级评分是一个常见的用户界面元素,它允许用户对产品.服务或内容进行评价. 想必大家在用各种带有评分的软件中看到过这个组件: 本文将指导你如何使用 Qml 创建一个简单而 ...

  10. BOOST库 将源码作交叉编译 书籍下载

    好记性不如烂笔头,BOOST库的移植,我也记录一下. 1. BOOST库 版本1.66.0 下载地址, 附书籍C++ BOOST库开发指南: https://download.csdn.net/dow ...