技术分享|负载均衡原理及其算法实现
Posted I生活T精彩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术分享|负载均衡原理及其算法实现相关的知识,希望对你有一定的参考价值。
张志国
合肥科技研发中心
前不久升级网贷项目时,接触到软负载均衡nginx。带着兴趣,查阅学习了大量资料,对负载均衡有了一定了解。负载平衡(Load balancing)是一种在多个计算机(网络、CPU、磁盘)之间均匀分配资源,以提高资源利用的技术。使用负载均衡可以最大化服务吞吐量,最小化响应时间,同时由于使用负载均衡时,会使用多个服务器节点提供服务,也提高了服务的可用性。下面来谈谈负载均衡的原理和基本负载均衡算法实现。
01
负载均衡原理
将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行,是解决高性能、单点故障(高可用)、扩展性(水平伸缩)的终极解决方案。
负载均衡的实现可以使用软件,也可以使用硬件。硬件如大名鼎鼎的F5 负载均衡设备,软件如 NGINX 中的负载均衡实现,又如 Springcloud Ribbon 组件中的负载均衡实现。
02
负载均衡算法
负载均衡服务器在决定将请求转发到具体哪台真实服务器的时候,是通过负载均衡算法来实现的。负载均衡算法,是一个负载均衡服务器的核心。常见的负载均衡算法有随机访问、轮询访问、轮询加权、随机加权、IP-HASH等。最简单的算法就是轮询,把用户的请求依次分配到服务器上。
1、 随机访问算法
根据数学上的概率论,随机访问次数越多,每个服务节点被命中的次数就会越相近。代码实现也比较简单,使用一个随机数,随机访问一个就可以了。
写一个模拟请求方法,请求10w次,记录请求结果。
运行得到请求结果。
每台服务器被访问的次数都趋近于 2.5w。但是随机是不能保证访问次数绝对均匀的。
2、 轮询访问算法
轮询,即一个接一个的访问,最终也是实现了命中均衡。为了保证轮询,必须记录上次访问的位置。为了让在并发情况下不出现问题,还必须在使用位置记录时进行加锁,很明显这种互斥锁增加了性能开销。
依旧使用上面的测试代码测试10w次请求负载情况。
3、 轮询加权算法
实际生产环境下,不能狭义地理解为分配给所有实际服务器一样多的工作量,因为多台服务器的承载能力各不相同,这可能体现在硬件配置、网络带宽的差异,也可能因为某台服务器身兼多职。我们所说的“均衡”,也就是希望所有服务器都不要过载,并且能够最大程度地发挥作用。让硬件配置高、系统性能好的机器多承担一些访问量,让能者多劳,提高整体性能。
这次记录下了每台服务器的整体性能,给出一个数值,数值越大,性能越好,可以承受的请求也就越多。可以看到服务器 192.168.1.5 的性能为 4,是其他服务器的两倍,依旧 10 w 请求测试。
192.168.1.5 承担了 2 倍的请求。
4、 随机加权算法
随机加权的方式和轮询加权的方式大致相同,只是把使用互斥锁轮询的方式换成了随机访问,按照概率论来说,访问量增多时,服务访问也会达到负载均衡。
依旧 10 w 请求测试,192.168.1.5 的权重是其他服务器的近似两倍。
5、 IP-HASH算法
上面的几种方式要么使用随机数,要么使用轮询,最终都达到了请求的负载均衡。但是也有一个很明显的缺点,就是同一个用户的多次请求很有可能不是同一个服务进行处理的。这时问题来了,如果你的服务依赖于 session ,那么因为服务不同, session 也会丢失,不是我们想要的,所以出现了一种根据请求端的 ip 进行哈希计算来决定请求到哪一台服务器的方式。这种方式可以保证同一个用户的请求落在同一个服务上。
当然除了以上负载均衡算法,还有诸如最小连接数、最快响应速度等。
03
总结
上面简单描述了负载均衡原理和几种常用到的负载均衡算法。实际应用中每次请求进行的操作对资源的消耗可能是不同的,比如说某些操作对 CPU 的使用就是比较高,所以负载均衡有时不能简单的通过请求的负载来作为负载均衡的唯一依据,还需要结合服务的当前连接数量、最近响应时间等维度进行总体均衡。总而言之,就是为了达到资源使用的负载均衡。
编辑/赵小娟
以上是关于技术分享|负载均衡原理及其算法实现的主要内容,如果未能解决你的问题,请参考以下文章