概述

在分布式系统中,负载均衡(Load Balancing)是一种将任务分派到多个服务端进程的方法。例如,将一个HTTP请求派发到实际的Web服务器中执行的过程就涉及负载均衡的实现。一个HTTP请求到达Web服务器,这中间涉及多个过程,也存在多种不同负载均衡的方法。本文讲述负载均衡的基本原理与派发策略,下图1是负载均衡的基本原理图,图1中客户端的请求请求经过达负载均衡器(Load Balancer)的分派,被指定的服务器进程进行处理。

图1:负载均衡基本原理

实现负载均衡主要有两个目的。第一个目的是将任务的处理负载均摊到不同的进程,以减少单一进程的负载,以达到处理能力水平扩容的目的。第二个目的则是提高容错能力。我们知道,在线上正式环境中,机器宕机或者进程异常导致服务不可用是常有的现象。在实现负载均衡的系统中,多个服务器进程提供同样的服务,一个进程不可用的情况下,任务会被负载均衡器派发到其他可用的进程,以达到高可用的目的。在多台不同的服务器中部署相同的服务进程,通过负载均衡对外提供服务,这组进程也称为“集群”(cluster)。

负载均衡实现策略

常见的负载均衡实现策略有以下几种:

  • 均匀派发(Even Task Distribution Scheme)
  • 加权派发(Weighted Task Distribution Scheme)
  • 粘滞会话(Sticky Session Scheme)
  • 均匀任务队列派发(Even Size Task Queue Distribution Scheme)
  • 单一队列(Autonomous Queue Scheme)

均匀派发(Even Task Distribution Scheme)

均匀派发是实现负载均衡最简单的策略,均衡派发的意思是指任务将均匀地派发到所有的服务器进程。在实现时,可以使用随机派发或者轮流派发(Round Robin)。


图2:均匀派发策略

均匀派发策略假设集群内所有进程具有相同的处理能力,且任务处理用时相同。但实际上,由于进程部署环境的不同,其处理能力一般不同,任务处理时间也不尽相同。因此均匀派发的策略并不能很好地将任务负载均滩到各个进程中。

DNS负载均衡

我们知道,DNS提供域名解析服务,当我们访问某个站点时,实际上首先需要通过该站点域名的DNS服务器来获取指向该域名的IP地址,在这过程中,DNS服务器完成了域名到IP地址的映射。由于这一映射可以是一对多的关系,因此DNS服务器可以充当负载均衡器的作用,DNS服务器在派发IP地址时,正是使用轮流派发的方式来实现的。

加权派发(Weighted Task Distribution Scheme)

加权派发策略在派发任务时,会赋予服务器进程一个权值,即不同的进程会接受不同数量的任务,具体数量为权值确定。


图3:加权派发策略

例如,三个进程的处理任务的能力比率为3:3:2,那么可以赋予这三个进程3:3:2的权值,即每8个任务中,3个发派给第一个进程,3个发派给第二个进程,2个分派给第三个进程。
加权派发策略考虑了进程处理能力的不同,因此更接近实际的应用。可是,加权派发策略也没有考虑任务处理的要求。

粘滞会话(Sticky Session Scheme)

前面两种负载均衡策略并没有考虑任务之间的依赖关系,在实际中,后面的任务处理常常会依赖于前面的任务。例如,对于同一个登录的用户的请求,用户购买的请求依赖于用户登录的请求,如果用户的登录信息保存在进程1中,那么,如果购买请求被分派到进程2或者进程3,那么购买请求将不能正确处理。这种请求间的依赖关系也称为粘滞会话(Sticky Session),负载均衡策略需要考虑粘滞会话的情况。


图4:粘滞会话策略

粘滞会话的派发策略要求属于同一个会话的任务将会被分派到同一个进程中。虽然这可以正确处理任务,但是却带来任务派发不均匀的问题,因为一些会话可能包含更多的任务,一些会话包含更少的任务。
粘滞会话的另一种处理策略是使用数据库或者缓存,将所有会话数据存储到数据库或者缓存中。集群内所有进程都可以通过访问数据库或者缓存来获取会话数据,进程内存都不保存会话数据,这样,负载均衡器便可以使用前面介绍的策略来派发任务。

均匀任务队列派发(Even Size Task Queue Distribution Scheme)

均匀任务队列派发策略跟加权派发策略类似,都考虑了进程的处理能力,不过其实现方式不同。在均匀队列派发策略下,负载均衡器为每个进程都创建一个大小相等的任务队列,这些任务队列包含了对应进程需要处理的任务。任务处理快的进程,其队列也会减少得快,这样负载均衡器会派发更多的任务给这个进程;相应地,任务处理慢的进程,其队列也会减少得慢,这样负载均衡器会派发更少的任务给这个进程。因此,通过这些任务队列,负载均衡器在派发任务时将进程处理任务的能力因素考虑了进去。


图5:均匀任务队列派发策略

单一队列(Autonomous Queue Scheme)

与上面的均匀队列策略一样,单一队列策略也使用了队列来实现负载均衡。不同的是,单一队列策略只使用了一个队列。图6是单一队列策略的原理图。


图6:单一队列策略

单一队列策略中,实际上并没有负载均衡器的存在。所有的服务器进程从队列中取出任务执行,如果某个进程出现宕机的情况,那么其他进程仍然可以继续执行任务。这样一来,任务队列并不需要知道服务进程的情况,只需要服务进程知道自己的任务队列,并不断执行任务即可。
单一队列策略实际上也考虑到进程的处理能力,进程处理任务得越快,其从队列取出任务的速度也越快。

总结

由于负载均衡为系统提供了水平扩展的能力以及提高了系统的高可用性,因此,负载均衡在分布式系统中的作用可谓十分重要。在实际使用中,我们可以充分利用一些已有的负载均衡硬件或者软件为我们实现负载均衡。硬件方面有F5,A10,软件方面有Nginx,HAProxy,LVS等。即使是自己实现,也可以考虑现有的开源软件,比如任务队列可以使用RabbitMQ,等。与其重复造轮子,不如先站在巨人的肩膀上:)

参考资料

    1. http://tutorials.jenkov.com/software-architecture/load-balancing.html
    2. http://www.oschina.net/news/77156/load-balance
    3. http://nginx.org/en/docs/http/load_balancing.html
    4. 构建高性能Web站点,第十二章,郭欣著,2012年6月,第二版

注:转载自https://leehao.me

负载均衡(Load Balancing)学习笔记(一)的更多相关文章

  1. 网络结构设计——负载均衡之LVS学习笔记(四)

    LVS按个人理解的说就是将一台Linux服务器当作路由器等功能的技术.LVS---Linux虚拟服务器. LVS实现了三种IP负载均衡技术VS/NAT.VS/TUN.VS/DR. 今天简单分享一下我在 ...

  2. 网络结构设计——负载均衡之LVS学习笔记(三)

    LVS按个人理解的说就是将一台Linux服务器当作路由器等功能的技术.LVS---Linux虚拟服务器. LVS实现了三种IP负载均衡技术VS/NAT.VS/TUN.VS/DR. 今天简单分享一下我在 ...

  3. 网络结构设计——负载均衡之LVS学习笔记(二)

    LVS按个人理解的说就是将一台Linux服务器当作路由器等功能的技术.LVS---Linux虚拟服务器. LVS实现了三种IP负载均衡技术VS/NAT.VS/TUN.VS/DR. 今天简单分享一下我在 ...

  4. CDN之多边缘节点负载均衡--学习笔记

    一.剧情 剧情是这样的,本次的多边缘节点负载均衡实验,1个LVS四层负载均衡集群和1个Nginx为反向代理的七层负载均衡集群,由Bind dns解析作为 主负载均衡服务器,调度两个集群,中间层有一台W ...

  5. Oracle RAC 客户端连接负载均衡(Load Balance)

    实现负载均衡(Load Balance)是Oracle RAC最重要的特性之一,主要是把负载平均分配到集群中的各个节点,以提高系统的整体吞吐能力.通常情况下有两种方式来实现负载均衡,一个是基于客户端连 ...

  6. 【高可用HA】Apache (4) —— Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_jk

    Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_jk httpd版本: httpd-2.4.17 jk版本: tomcat-connectors-1.2.41 参考 ...

  7. 【高可用HA】Apache (3) —— Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_proxy

    Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_proxy httpd版本: httpd-2.4.17 参考来源: Apache (1) -- Mac下安装Apac ...

  8. Oracle RAC 服务器端连接负载均衡(Load Balance)

    Oracle RAC服务器端的负载均衡是根据RAC中各节点的连接负荷数情况,将新的连接请求分配到负荷最小的节点上去.当数据库处于运行时,RAC中各节点的PMON进程每3秒会将各自节点的连接负荷数更新到 ...

  9. "高可用方案工具包" high availability toolkit 1.2 公布了。version 1.2 新增了 负载均衡 load balance 的技术实现

    "高可用方案工具包"  high availability toolkit 1.2 公布了. version 1.2 新增了 负载均衡 load balance 的技术实现. 项目 ...

  10. 【高可用HA】Nginx (1) —— Mac下配置Nginx Http负载均衡(Load Balancer)之101实例

    [高可用HA]Nginx (1) -- Mac下配置Nginx Http负载均衡(Load Balancer)之101实例 nginx版本: nginx-1.9.8 参考来源: nginx.org [ ...

随机推荐

  1. Sharding-jdbc(一)分库分表理解

    1.什么是分库分表 所谓的分库分表就是数据的分片(Sharding). 2.为什么需要分库分表 因为随着公司的业务越来越大,对于现成单机单个应用瓶颈问题,对数据持久化硬盘如何进行扩容. 可以从4个方面 ...

  2. Installation failed with message...It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.

    错误弹窗如图: Installation failed with message Failed to finalize session: INSTALL_FAILED_TEST_ONLY:instal ...

  3. php -- 文件上传下载

    ----- 026-upload.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv=" ...

  4. Kafka中的zookeeper-shell.sh

    连接 zookeeper bin/zookeeper-shell. 常用命令 connect host:port get path [watch] ls path [watch] set path d ...

  5. 探讨e.target与e.currentTarget

    target与currentTarget两者既有区别,也有联系,那么我们就来探讨下他们的区别吧,一个通俗易懂的例子解释一下两者的区别: <!DOCTYPE html> <html&g ...

  6. 分享 : 警惕MySQL运维陷阱:基于MyCat的伪分布式架构

    分布式数据库已经进入了全面快速发展阶段.这种发展是与时俱进的,与人的需求分不开,因为现在信息时代的高速发展,导致数据量和交易量越来越大.这种现象首先导致的就是存储瓶颈,因为MySQL数据库实质上还是一 ...

  7. SSM整合(2): spring 与 mybatis 整合

    在进行完spring与springmvc整合之后, 继续 spring与mybatis的整合. 既然是操作数据库, 那必然不能缺少了连接属性 一. db.properties jdbc.driver= ...

  8. poi导出联动下拉选择的excel

    最近碰到一个功能, 觉得可以记录下来. 在web中, 经常会碰到上下级的数据, 或者是联动数据, 比如省市联动. 那么在导入数据的时候, 是否可以在动态生成的模板中, 加入联动限制呢. 一. 数据准备 ...

  9. JavaScript 视频教程 收藏

    001 JavaScript第1章 JavaScript概述 https://www.365yg.com/group/6410923214495940866/ 001 JavaScript第1章 Ja ...

  10. getInitParameter方法

    在ServletConfig和ServletContext都有getInitParameter方法, 这两个方法的都能从web.xml中获取参数,但是是有区别的. 1. web.xml文件 <? ...