概述

在分布式系统中,负载均衡(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. 全网最详细的Windows里下载与安装Sublime Text *(图文详解)

    不多说,直接上干货! 前言 这是代码编程软件,可以性感编程自己代码,有着非常丰富的插件,界面整洁清爽.第一次使用可能不习惯,当你使用一段时间之后,你就会爱上它. 下载与安装 1.下载:目前官方的正式版 ...

  2. js便签笔记(14)——用nodejs搭建最简单、轻量化的http server

    1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后台语言. 但是你制作出来的网页总要运行.总要测试吧?——那就免不了用到http server.我先前都是用vis ...

  3. mysql 根据一张表更新另一张表

    between 是>= and <=,即包含两个边界

  4. Maven Jetty8

    <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactI ...

  5. 制作openstack使用的Ubuntu镜像

    一.环境准备 OS:Ubuntu-14.04 制作镜像版本:Ubuntu-14.04.4-server-amd64.iso 查看是否支持虚拟化(有输出代表支持,否则在BIOS页面中设置即可): egr ...

  6. Hibernate杂问

    1 谈谈你对ORM框架的基本思想的了解? 首先 ORM是 对象关系映射,是为了解决类似于JDBC实现对象持久化的问题开发的. 框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射. 他的映射分 ...

  7. Java 8 新特性-菜鸟教程 (4) -Java 8 默认方法

    Java 8 默认方法 Java 8 新增了接口的默认方法. 简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法. 我们只需在方法名前面加个default关键字即可实现默认方法. 为 ...

  8. JGraphT

    例1: 添加点.边 import java.net.*; import org.jgrapht.*; import org.jgrapht.graph.*; /** * A simple introd ...

  9. Android studio的gradle

    1. gradle的基本概念 gradle构建* Android Studio使用`Gradle`构建工具,Eclipse的ADT插件使用的是`Ant`构建工具* 构建:生成app的过程,执行一些的命 ...

  10. Java虚拟机--内存模型与线程

    Java虚拟机--内存模型与线程 高速缓存:处理器要与内存交互,如读取.存储运算结果,而计算机的存储设备和处理器的运算速度差异巨大,所以加入一层读写速度和处理器接近的高速缓存来作为内存和处理器之间的缓 ...