定义
负载均衡,通俗一点说是各种网络请求负载时,机器间要均衡地处理。即负载的时候要均衡。
负载均衡一般用于处理高并发的场景。试想象一下,我们以前一直都在部署单应用,如果请求量达到临界点,机器出现负载,则需要做负载均衡来解决。
所以负载均衡一方面是应对高并发的网络请求,解决机器负载问题;另一方面提供均衡的算法,来达到机器平衡处理的目的。
负载均衡种类
负载均衡有多种类型,这里从不同设备的角度来区分。
网络类型负载均衡器
网络类型负载均衡只有一种,也叫IP负载均衡。
IP负载均衡其实原理跟CDN差不多,旨在处理不同用户的IP请求,返回就近IP的机器到用户。
如下图所示,我们部署了IP负载均衡器,在广州、北京、上海都有相应的机器。用户IP在深圳,直接返回广州的资源到用户。
总结
IP负载均衡提现的是就近原则,哪个机房的IP与用户最近,就返回哪个IP的机器资源。
所以,IP负载均衡器应用场景一般是部署大型应用时,需要不同地域的快速返回。如微信IM为何那么快,应当在上面部署了一层IP负载均衡器。
再说在云上,例如国内占比最大的阿里云。如果你想部署应用,需要解决不同地域访问的问题,例如上海与北京。你需要在云为上海上建立VM,再在北京上建立VM。然后在上面部署一层IP的负载均衡器指向北京与上海的VM,问题解决了。
软件型负载均衡器
软件型负载均衡器是我们用得最多的,也是包含算法最多的负载均衡器。常见的软件型负载均衡器有Nginx、LVS、HAProxy。
软件型负载均衡器,是用户来部署软件,来达到负载均衡的目的。
为何使用负载均衡器?
在负载均衡器出来之前,以前的应用一直都是使用单体应用部署方式。
如下,用户访问网络,然后直接访问机器。
那么,如果机器达到瓶颈呢?一般是数据达到瓶颈,去扩展数据层。先抛开这个不讨论,以为我们这里主要讨论负载均衡器。当然,你可以加大机器的配置来增加处理速度,如加强CPU,加大内存。单个机器也有它的瓶颈,再加上加大机器配置到某个临界值时,费用很高。
这时候,负载均衡器是你的好帮手。
如下图,用户访问网络,首先经过负载均衡器,负载均衡器在选择特定的服务器到用户。这样,即提高了服务器的处理速度,也在某个程度来说减少了服务器费用。但是更重要的一点,这样可以无限的横向扩展,不断的添加服务器D、E、F.....
很好奇一点,负载均衡器究竟是通过怎么样的算法来访问不同的服务器A、B、C,并且让他们均衡?
下面,介绍一下负载均很器的算法。
负载均衡器算法 - 轮询
轮询的算法是最简单的,有几种,分别为:顺序、反序、随机轮询。
循序轮询,顾名思义是首先访问服务器A,再访问B,最后访问C,依次顺序访问。一次访问完全部的服务器叫一个回合。
反序轮询这里不介绍,跟顺序反过来。
乱序轮询,是随机访问服务器,访问完所有的服务器为一回合。
所以,轮询算法是最简单的,只需要在负载均衡器中存储访问过的机器id即可。但是缺点是配套无状态API服务器,不能使用有状态。
负载均衡器算法 - hash
试想一下,如果程序写得简单一点,我们使用session的时候,session都保存在服务器。如果像上面,轮询地访问服务器,第一次session保存在服务器A,第二次session不见了,就出现问题。所以这种办法使用hash。
hash算法能保证用户访问的服务器永远都是那一台,除非服务器挂了。hash算法可以使用求余算法。公式是:
用户访问的服务器 = 用户id或用户id的hash值 % 机器数量
这种算法有一种明显的缺点就是,得到的服务器随着机器数量而改变。即中途服务器数量改变了,用户访问的机器会发生改变。
所以,这种算法优点是用户的访问永远落在一个服务器中,并且不需要负载均衡的服务器保存任何信息。缺点是随着服务器数量的变化用户访问的服务器也变化。
负载均衡器算法 - 最优服务器
顾名思义,是选择最优的服务器。选择最优服务器也有2种不同的算法,第一种是返回计算速度最快的服务器,第二种是返回最少请求量的服务器。
这两种算法都需要把请求服务器的信息保存起来,然后统计出最优的服务器。下次用户访问的时候,落到相应的服务器上。
所以,这种算法的优点是符合常规思想,放回‘最快’的服务器。但是缺点摆在那里,需要统计服务器的访问量、访问时间,并且做计算。
硬件类型负载均衡器
硬件类型的负载均衡器没什么说的,就是购买一个硬件,然后挂在到网络上,分发到不同的服务器。硬件类型是最快,常见有F5。达到几百万/秒的请求。
可以关注本人的公众号,多年经验的原创文章共享给大家。