负载均衡在web系统中的应用
在日常的架构设计与开发中,常用的负载均衡算法主要分为静态和动态两类。静态负载算法以固定的频率分配任务不考虑服务器的状态信息,如轮询法、随机法等;动态负载均衡算法以服务器的实时负载状态信息来决定任务的分配,如最小链接法等,下面简单对其中几种算法原理进行基本说明:
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系统开发中的一般应用,本文内容只是一个基本总结,其中如有不足与不正确的地方还望指正与海涵,十分感谢。
关注微信公众号,查看更多技术文章。