负载均衡(load Balancing)学习笔记
负载均衡的概念
在分布式系统中,负载均衡是一种将任务分派到多个服务器进程的方法。例如将一个HTTP请求派发到实际的Web服务器中执行的过程,就涉及负载均衡的实现,一个HTTP请求到达web服务器,这中间设计多个过程,也存在多个不同负载均衡的方法。
下图是负载均衡的基本原理图,图一客户端的请求经过负载均衡服务器的分派,分派到指定的服务器进程进行处理。
原理
负载均衡的目的有以下两点
1.将任务处理负载均摊到不同的进程,以达到处理水平扩容的目的。
2.在实现负载均衡的系统中,多个服务器进程提供同样的服务,一个服务进程不可用的情况下,任务会被负载均衡服务器派发到其它可用的进程。
注意:在多台不同的服务器部署相同的服务进程,通过负载均衡对外提供服务,这组进程也称之为“集群”。
实现策略
-
均匀派发
是负载均衡最简单的策略,是指将任务均匀的派发到所有的服务器进程。在实现市可以使用随机派发和轮流派发。
下图是均匀派发策略,:假设集群内所有进程具有相同的处理能力,且任务处理用时相同,但实际上,由于任务部署环境的不同,其处理能力一般不同,因此均匀派发策略不能很好的将任务负载均摊到各个进程中。
DNS负载均衡
DNS提供域名解析服务,当我们访问某个站点时,实际上需要通过站点域名的DNS来获取指向该域名的IP地址,在这过程中,DNS完成了域名到IP地址的映射,由于映射是一对多的关系,因此DNS服务器可以充当负载均衡的作用,DNS服务器在派发IP地址时正是使用轮流派发来实现的。
加权派发
在派发任务时,会赋予服务器一个权值,不同的进程会接受不同数量的任务,示权值数量而定
例如,三个进程的处理任务的能力比率为3:3:2,那么可以赋予这三个进程3:3:2的权值,即每8个任务中,3个发派给第一个进程,3个发派给第二个进程,2个分派给第三个进程。
加权派发策略考虑了进程处理能力的不同,因此更接近实际的应用。可是,加权派发策略也没有考虑任务处理的要求。
粘滞会话
前两种策略没有考虑任务之间的依赖关系,实际中后面的任务往往会依赖于前面的任务。例如,一个登陆任务,一个用户购买的任务,购买的任务要依赖于登陆的任务,假设登陆任务在1进程,购买在2进程,那么购买请求将不能正确处理,这种请求也被称之为粘滞会话,负载均衡需要考虑到这种情况
粘滞会话将属于同一个会话的任务分派到同一个进程中,虽然这可以处理任务,但是却带来任务派发不均匀的问题,因为一些会话包含更多的任务,一些会话包含更少的任务。
粘滞会话的另一种处理策略是使用数据库或者缓存,将所有的会话数据存储到数据库或者缓存中,集群内所有的进程可以通过访问数据库或者缓存来获取会话数据,进程内不会保存会话数据,这样负载均衡就可以使用前面介绍的派发策略。
均匀任务队列
负载均衡器为每个进程都创建了一个大小相等的任务队列,这些任务队列包含了进程需要处理的任务,处理的快的进程,队列也会减少的快,这样负载均衡器会派发更多的任务给这个进程。这样就考虑了进程处理任务的能力。
单一队列
与均匀队列一样,也使用队列来实现负载均衡。不同的是,单一队列只使用了一个队列。、
实际上,并没有负载均衡器的存在,所有的服务器进程从队列中取出执行,如果某个服务器出现宕机的情况,那么其他进程依然可以继续执行任务,这样一来,服务队列并不知道进程的情况,只需要服务进程知道自己的任务队列,并不断执行任务即可。
单一策略也有考虑进程的处理能力,处理任务越快,取出任务的速度也越快。
总结
由于负载均衡为系统提供了水平扩展的能力以及提高了系统的高可用性,因此,负载均衡在分布式系统中的作用可谓十分重要。在实际使用中,我们可以充分利用一些已有的负载均衡硬件或者软件为我们实现负载均衡。硬件方面有F5,A10,软件方面有Nginx,HAProxy,LVS等。即使是自己实现,也可以考虑现有的开源软件,比如任务队列可以使用RabbitMQ,等。与其重复造轮子,不如先站在巨人的肩膀上:)