概述

在分布式系统中,负载均衡(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. JAVA框架之Hibernate【Hibernate缓存详解】

    1.缓存介绍 Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存由hibernate管理的,一般情况下无需进行干预:第二级别的缓 ...

  2. Stack Overflow 2016 最新架构探秘

    原文:http://nickcraver.com/blog/2016/02/17/stack-overflow-the-architecture-2016-edition/ 转载:http://www ...

  3. [原] ubuntu 13.10 安装 winqq2013

    安装及下载地址:http://www.longene.org/forum/viewtopic.php?t=4700 ubuntu 13.10 64位系统安装后无法启动qq,因为缺少程序包.解决方案: ...

  4. TCP/IP 笔记 - 概述

    Effective communication depends on the use of a common language. 有效沟通取决于使用共同的语言 . TCP/IP协议族 一系列相关协议的 ...

  5. 记一次使用mybatis进行like 模糊查询遇到的问题

    "bdate like '#{date}%' and ..." 最开始这样写的· 将传入的参数和%用单引号包起来,但是这会报错 java.sql.SQLException: Par ...

  6. Java中函数的重载和重写

    重载 重载指的是两个或者两个以上同名函数,但它们的参数不一样,这时会出现函数重载的情况.比如下面这段代码 class Test{ public void a(){ System.out.println ...

  7. geo-经纬度计算

    经纬度计算, 本质上是球面三角函数的应用, 将数学公式转换为代码的过程, 站在前人的肩膀上, 自己又补充了一点: package com.iwhere.easy.travel.tool; public ...

  8. Linux-(lsof,ifconfig,route)

    lsof命令 1.命令格式: lsof [参数][文件] 2.命令功能: lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通 ...

  9. 利用nginx解决跨域问题

    访问我的博客 前言 最近遇到了跨域问题,结合之前[微信支付开发本地接收异步通知回调]的经验,利用 Nginx 实现了跨域. 公司之前为了解决跨域问题,用的是 iFrame,反正对于只做后端的我而言,觉 ...

  10. JavaWeb 简单实现客户信息管理系统

    项目介绍 本项目使用Jsp+Servlet+MySQL实现 功能介绍 查询客户信息:查询数据库中所有客户信息,分页展示 添加客户信息:创建新客户并添加到数据库中 搜索客户信息:根据用户的输入查询客户信 ...